Linux 中的“快速中断”

Linux 中的“快速中断”

据我所知,Linux 有“快速中断”,即那些使用 SA_INTERRUPT 标志请求的中断;快速中断在当前 CPU 上禁用所有其他中断的情况下执行。但它与正常的中断处理程序行为有何不同(在哪里)?

答案1

到今天为止,你基本上可以忘记国旗了SA_INTERRUPT
介于两者之间2.6.182.6.24 它只是新标志的迁移助手IRQF_DISABLED
2.6.24 删除了所有SA_*标志并将其替换为IRQF_*旗帜。
2.6.35 将此“新”标志标记为已弃用

如果您拥有 2.6.18 之前的内核,您可能不会使用它(请参阅 Justin 的回答)。

IRQF_DISABLE如今,不同架构的使用情况有所不同。 x86 仍然只将它用于时间关键函数(time.chpet.c)和一些xen东西。

关于差异;正常中断可以被其他中断(抢占)打断,而“快速”中断则不能。

答案2

有一篇写得不错这里:

旧版本的 Linux 内核煞费苦心地区分“快”中断和“慢”中断。快速中断是那些可以非常快地处理的中断,而处理慢速中断则需要更长的时间。慢速中断对处理器的要求可能很高,因此在处理中断时重新启用中断是值得的。否则,需要快速集中注意力的任务可能会被拖延太久。

在现代内核中,快中断和慢中断之间的大部分差异已经消失。只剩下一种情况:快速中断(使用 SA_INTERRUPT 标志请求的中断)在当前处理器上禁用所有其他中断的情况下执行。请注意,其他处理器仍然可以处理中断,尽管您永远不会看到两个处理器同时处理相同的 IRQ。

那么,您的驱动程序应该使用哪种类型的中断?在现代系统上,SA_INTERRUPT 仅适用于少数特定情况,例如定时器中断。除非您有充分的理由在禁用其他中断的情况下运行中断处理程序,否则不应使用 SA_INTERRUPT。

所以唯一的区别就是你提到的那个;快速中断处理程序在禁用所有其他中断处理程序的情况下执行,以获得更快的性能。

答案3

我只是在看 ARM Cortex A57。在 ARM 架构上,快速中断有 8 个专用寄存器,因此中断进入和退出时的上下文切换时间都被最小化。我还不知道它是否或如何集成到我们的 SOC 供应商将提供的 Linux 中(假设他们最终确实提供了)。

相关内容