检查是否启用了特定中断(IPI)

Check if specific interrupt is enabled ( IPI )

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

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

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


顾名思义,NMI (Non-maskable Interrupt) 从一开始就被设计为不可屏蔽的。
有一个技巧可以掩盖它:设置端口 70h 的 bit7。
然而,这是一个硬件技巧,它将 #NMI(今天是 LINT1,但这是可配置的)联系在一起。
IPI 是通过软件消息发送的,所以这个技巧是行不通的。

SMI (System Management Interrupt)用于进入SMM(见前面的link),一种设计为对软件尽可能透明的模式。
它是不可屏蔽的,对于软件而言,它不存在。

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

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


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

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


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