6

是否有用于绕过可编程中断控制器的不可屏蔽中断的单独通信总线?

还是 PIC 管理所有中断,但按照惯例传递所有不可屏蔽的中断?

这是否依赖于架构,或者是否有特定的理由偏爱一个而不是另一个?

4

2 回答 2

3

我的答案来自很久以前在遥远的星系中设计计算机时获得的一些硬件经验……很久以前,我认为我应该从参考资料中获得一些帮助。当我在这里阅读SO 时,我发现了一个下载英特尔 ia32 64 位系统软件开发手册的地方。

第一个问题的答案是 NMI 是处理器上的一个引脚,它与 PIC 配置的可屏蔽中断隔离。

您的第二个问题的答案是 PIC 与 NMI 没有任何关系。但是,如果您有 APIC 或高级可编程中断控制器,则可以按照手册中的说明生成 NMI:

处理器通过传递模式 NMI 在系统总线(Pentium 4、Intel Core Duo、Intel Core 2、Intel Atom 和 Intel Xeon 处理器)或 APIC 串行总线(P6 系列和 Pentium 处理器)上接收消息。

您的第三个问题的答案可以在您的第二个问题的答案中看到。也就是说,如果您的硬件中有 APIC(而不仅仅是 PIC)。如果您想了解有关 APIC 如何发送 NMI 的更多详细信息,请查看我提供的 SO 链接。我没有在这里详细介绍,因为你问的是“低级”PIC,而不是 APIC。但万一我误解了你,我想你会在 SO 链接上找到很多信息,如果这还不够,那么继续下载英特尔手册。

我希望这能澄清一些事情。干杯!

于 2013-01-30T20:11:03.147 回答
2

PIC(可编程中断控制器)不管理 x86 中的 NMI(不可屏蔽中断)。NMI 直接进入处理器或通过另一个控制器,例如。互联网服务提供商。请参阅OSDev:不可屏蔽中断

但是,根据链接,您可以通过以下方式禁用 NMI:

/* enable the NMI */
void NMI_enable(void)
{
    outb(0x70, inb(0x70)&0x7F);
}

/* disable the NMI */
void NMI_disable(void)
{
    outb(0x70, inb(0x70)|=0x80);
}
于 2013-01-19T12:47:08.307 回答