在x86上,当操作系统禁用中断时,它们是否会消失,或者它们是否排队并“等待”中断重新开启?

时间:2014-03-09 08:58:10

标签: kernel driver interrupt interrupt-handling kmdf

我的平台是x86和x86-64,在Windows上。

中断优先级系统的要点是让优先级最高的中断击败其他中断。为了强制执行此操作,我猜测Windows将完全禁用所有较低级别的中断,直到完成更高级别中断的ISR。

但如果CPU没有收听中断,会发生什么?他们只是默默地消失了吗?或者他们是否在硬件中排队,等待中断再次启用?如果存放,在哪里?有多少人可以排队?如果有太多中断没有被处理,会发生什么?如果存在中断处理被积压的罕见情况,检测问题的工具是什么?

1 个答案:

答案 0 :(得分:8)

一些背景

来自外设的中断不是由CPU直接处理,而是由称为“可编程中断控制器”的硬件处理。早期的系统使用PIC - (英特尔8259)但由于缺乏对SMP系统的支持,现在使用了Adavnced PIC - APIC(英特尔82093)。 APIC有两个组件,IO APIC(主板的一部分)将这些中断请求转发到本地APIC(CPU的一部分)。 但这些硬件只是将消息传递给CPU,实际处理由特定设备的设备驱动程序完成。

现在回答您的问题

  

但如果CPU没有收听中断,会发生什么?他们只是默默地消失了吗?或者他们是否在硬件中排队,等待中断再次启用?

This文章讨论了两类中断处理程序,具体取决于它们的执行速度:
1.快速:禁用进一步中断运行,
2.慢:​​启用中断运行。
但是现在两者之间的区别已经过时,因为tasklets /工作队列(顶部和下半部分 - 响铃?)使处理程序的执行时间变得非常少,因此现在中断处理程序在启用中断的情况下运行。对于像I2C这样的较慢设备,我们已经采用了一种名为Threaded Interrupt Handler的新技术,这种技术甚至比上/下半部分方法更好。如果对于某些设备,如果上述技术不起作用,则处理程序在禁用中断的情况下执行,并且在这种情况下是,您继续丢失中断,但我找不到发生这种情况的任何实例。

  

如果存放,在哪里?有多少人可以排队?如果有太多中断没有被处理,会发生什么?

不,它们没有排队,如果需要禁用中断,那么这是一个糟糕的中断处理程序设计。

  

如果存在中断处理积压的罕见情况,检测问题的工具是什么?

如果中断被禁用,则无法执行任何操作,但如果它们已启用并且您不断获得更多中断,则会导致中断嵌套,从而导致系统崩溃。然后可以使用核心转储来检测原因。