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

时间:2018-07-04 12:48:17

标签: assembly intel interrupt lauterbach

我已经阅读到EFLAGS具有IF,如果通常启用了中断,它可以存储在其中,但是我需要知道是否启用了IPI(进程间中断)。

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

1 个答案:

答案 0 :(得分:2)

IPI一词表示中断的类别,具体是:NMISMI,SIPI,INIT和固定中断。
其中,如果不全局禁用LAPIC,则无法屏蔽NMI,SMI,SIPI和INIT。


顾名思义,NMI (Non-maskable Interrupt)从一开始就被设计为不可屏蔽的。
有一个掩饰它的方法:设置端口70h的bit7。
但是,这是一个硬件技巧,它使#​​NMI(今天是LINT1,但它是可配置的)高。 IPI是通过软件消息发送的,因此此技巧不起作用。

SMI (System Management Interrupt)用于进入SMM(请参阅上一链接),该模式旨在使软件尽可能透明。
它不是可屏蔽的,对于软件而言,它不存在。

INIT and SIPI (Startup-IPI) 1 中断用于重置和唤醒CPU。
它们不能被设计掩盖(BIOS通常使AP和应用处理器以cli / hlt序列进入睡眠状态)。

可以使用IF标志来屏蔽固定中断,也可以在执行更高优先级的固定中断ISR时将其屏蔽(就像使用PIC的旧式IRQ一样)。


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

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


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