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

8
对于一个共享的中断线,我可以有多个中断处理程序。内核会按顺序调用特定共享线上的所有处理程序。据我所知,每个处理程序在被调用时都会通知内核它是否是正确的处理程序。
我的问题是如何确定这一点,它是通过检查告诉特定设备状态的内存映射寄存器还是其他硬件机制?处理程序如何知道相应的设备确实是发出中断的设备?
这些信息是通过位于设备和处理器中断线之间的中断控制器传递的吗?

1
http://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-handle-shared-irqs - Ciro Santilli OurBigBook.com
请参阅罗伯特·洛夫的《Linux内核开发第三版》第7章第119页上的“共享处理程序”部分。 - Guy Avraham
1个回答

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。

嗨 Jeyram,如果 dev1 和 dev2 是相同的设备类型,但是不同的设备(例如 dev1 是普通鼠标,而 dev2 是游戏鼠标)。那么它可能知道设备类型,但是 dev1 的中断处理程序如何通过其返回值确认它不是正确的处理程序? - hit.at.ro
操作系统使用中断服务程序的返回值,而不是下一个设备的中断服务程序。仅基于返回值,操作系统将决定是否调用已注册为该IRQ线路的下一个中断服务程序。 - Jeyaram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接