8

对于共享中断线,我可以有多个中断处理程序。内核将依次调用该特定共享行的所有处理程序。据我所知,每个处理程序在调用时都会通知内核它是否是要调用的正确处理程序。

我的问题是这是如何确定的,有没有办法检查内存映射寄存器,告诉特定设备的状态,或者是否有其他硬件机制?处理程序如何知道相应的设备确实是发出中断的设备?

此信息是否通过设备和处理器中断线之间的中断控制器中继?

4

1 回答 1

5

内核将依次调用该特定共享行的所有处理程序。

确切地。假设 Dev1 和 Dev2 共享 IRQ10。当 IRQ10 产生中断时,所有注册到该线的 ISR 都会被一一调用。

在我们的场景中,假设 Dev2 是产生中断的那个。如果Dev1 的ISR 被先注册,那么它的ISR(即Dev1 的ISR)只会先被调用。在该 ISR 中,将验证中断状态寄存器是否存在中断。如果没有设置中断位(在这种情况下,导致 Dev2 引发了中断),那么我们可以确认Dev1没有生成中断 - 所以 Dev1 的 ISR 应该返回到内核IRQ_NONE- 这意味着:“我没有处理那个中断” , 所以内核继续到下一个 ISR(即 Dev2 的 ISR),反过来,它确实会验证其相应的设备是否产生了中断,因此,这个处理程序应该处理它并最终返回IRQ_HANDLED——这意味着:“我处理了这个”。

有关详细信息,请参阅返回值IRQ_NONE/IRQ_HANDLED

处理程序如何知道相应的设备是否发出了中断?

仅通过读取中断状态寄存器。

此信息是否通过设备和处理器中断线之间的中断控制器中继?

我不确定。但是操作系统会根据 ISR 的返回值来处理调用 ISR。

于 2013-01-17T05:45:44.877 回答