我已经阅读到EFLAGS具有IF,如果通常启用了中断,它可以存储在其中,但是我需要知道是否启用了IPI(进程间中断)。
我只能通过Lauterbach调试器对CPU寄存器和数据进行物理访问,而不能访问内核或类似的东西。
答案 0 :(得分:2)
IPI一词表示中断的类别,具体是:NMI,SMI,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。