【推荐阅读】
OriginalLinux generic IRQ handling
翻译司延腾 Yanteng Si [[email]siyanteng@loongson.cn[/email]](%[email]5Bsiyanteng@loongson.cn[/email]%5D(mailto:siyanteng%40loongson.cn))
校译吴想成 Wu XiangCheng [[email]bobwxc@email.cn[/email]](%[email]5Bbobwxc@email.cn[/email]%5D(mailto:bobwxc%40email.cn))
版权© 2005-2010: Thomas Gleixner
版权© 2005-2006: Ingo Molnar
简介
通用中断处理层是为了给设备驱动程序提供一个完整的中断处理抽象(层)。它能够处 理所有不同类型的中断控制器硬件。设备驱动程序使用通用API函数来请求、启用、禁 用和释放中断。驱动程序不需要知道任何关于硬件处理中断的细节,所以它们可以在不同的 平台上使用而不需要修改代码。
本文档提供给那些希望在通用IRQ处理层的帮助下实现基于其架构的中断子系统的开发 者。
理论依据
Linux中中断处理的原始实现使用__do_IRQ()超级处理程序,它能够处理每种类型的 中断逻辑。
最初,Russell King确定了不同类型的处理程序,以便为Linux 2.5/2.6中的ARM中 断处理程序实现建立一个相当通用的集合。他区分了以下几种类型:
电平触发型
边沿触发型
简单型
在实现过程中,我们发现了另一种类型:
响应EOI(end of interrupt)型
在SMP的__do_IRQ()超级处理程序中,还需定义一种类型:
每cpu型(针对CPU SMP)
这种高层IRQ处理程序的拆分实现使我们能够为每个特定的中断类型优化中断处理的流 程。这减少了该特定代码路径的复杂性,并允许对特定类型进行优化处理。
最初的通用IRQ实现使用hw_interrupt_type结构体及其 <span class="pre">->ack</span> <span class="pre">->end</span> 等回 调来区分超级处理程序中的流控制。这导致了流逻辑和低级硬件逻辑的混合,也导致了 不必要的代码重复:例如i386中的 <span class="pre">ioapic_level_irq</span> 和 <span class="pre">ioapic_edge_irq</span> , 这两个IRQ类型共享许多低级的细节,但有不同的流处理。
一个更自然的抽象是“irq流”和“芯片细节”的干净分离。
分析一些架构的IRQ子系统的实现可以发现,他们中的大多数可以使用一套通用的“irq 流”方法,只需要添加芯片级的特定代码。这种分离对于那些需要IRQ流本身而不需要芯 片细节的特定(子)架构也很有价值——以提供了一个更透明的IRQ子系统设计。
每个中断描述符都被分配给它自己的高层流程处理程序,这