1

我读过 EFLAGS 有 IF 如果中断通常启用,它可以存储在哪里,但我需要知道 IPI(进程间中断)是否启用。

我只能通过劳特巴赫调试器物理访问 CPU 寄存器和数据,我无法访问内核或类似的东西。

4

1 回答 1

3

术语 IPI 指定了一中断,特别是:NMISMI、SIPI、INIT 和固定中断。
其中,如果不全局禁用 LAPIC,就无法屏蔽 NMI、SMI、SIPI 和 INIT。


顾名思义,NMI(不可屏蔽中断)从一开始就被设计为不可屏蔽的
有一个技巧可以掩盖它:设置端口 70h 的 bit7。
然而,这是一个硬件技巧,它将#NMI(今天它是 LINT1,但这是可配置的)绑定到高位。
IPI 是通过软件消息发送的,因此这个技巧不起作用。

SMI(系统管理中断)用于进入 SMM(参见上一个链接),这种模式旨在对软件尽可能透明。
它是不可屏蔽的,对于软件而言,它是不存在的。

INIT 和 SIPI ( Startup-IPI) 1中断用于复位和唤醒 CPU。
它们不能被设计屏蔽(BIOS 通常让 AP、应用处理器按cli / hlt顺序进入睡眠状态)。

固定中断可以用IF标志屏蔽或在执行更高优先级的固定中断 ISR 时(就像 PIC 的传统 IRQ 一样)。


通过软禁用 APIC ,可以仅屏蔽固定中断,这实际上可能对应于术语 IPI 的普遍理解。
这可以通过清除 LAPIC 基址偏移 0f0h 处的杂散中断向量寄存器的 bit8 来完成(LAPIC 基址在IA32_APIC_BASEMSR 中设置,其地址为 1bh)。
当然,清算IF也行。

或者,可以通过清除MSR 的 bit11完全禁用 LAPIC(它不会响应任何IPI)。IA32_APIC_BASE


要检查 IPI 是否启用,您必须检查IF标志、伪中断向量寄存器IA32_APIC_BASEMSR。

于 2018-07-05T08:07:48.683 回答