对于共享中断线,如何找到要使用的中断处理程序?

hit*_*.ro 7 device-driver irq linux-device-driver linux-kernel

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

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

这些信息是通过设备和处理器中断线之间的中断控制器进行中继的吗?

Jey*_*ram 5

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

究竟。假设Dev1和Dev2共享IRQ10。当为IRQ10产生中断时,在该行注册的所有 ISR将被一个接一个地调用。

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

有关更多信息,请参见返回值IRQ_NONE / IRQ_HANDLED

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

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

这些信息是否通过设备和处理器中断线之间的中断控制器转发?

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