linux内核——当ISR运行时,特定IRQ线路上的中断发生了什么.它们是丢失还是存储,以便稍后处理



当中断服务程序被处理时,特定的IRQ线被禁用,那么当在同一IRQ线上注册的设备引发中断时会发生什么?中断是丢失了还是存储了,以便以后再处理?

请解释一下。

一般情况下,中断丢失。也就是说,除非设备驱动程序可以推断出错过的中断发生了,比如通过定期检查与中断状态相关的设备寄存器。

许多(如果不是大多数的话)设备驱动程序不会这样做。快速处理中断并从中断中返回几乎总是更好的,以便可以更快地处理下一个中断。

一个合理的目标是将代码路径ISR逻辑限制在十几行以下,最好是更少的简单源代码行。这很容易通过服务任何需要服务的东西来实现:通常是一些从/到设备寄存器的传输,在该i/o上标记阻塞的任务为就绪,然后返回。当然,驱动程序的其余部分(非ISR部分)可能需要做更多的工作来实现这样的ISR效率,但我认为这是一个很好的驱动程序设计。 我与许多设备驱动程序工程师讨论过,他们声称让ISR在现场做更多的工作(而不是延迟到基于线程的处理)可以帮助改善延迟和系统性能。我仍然不相信这个断言是正确的。

在这里查看我的答案:在x86上,当操作系统禁用中断时,它们是消失,还是排队等待'让中断恢复正常?

特定IRQ线上的中断丢失。因此,ISR例程应该尽可能快地执行,这样就不会出现这种情况。这就是为什么我们移动到上半部分,下半部分的方法(微线程,工作队列),现在到Threaded IRQs

最新更新