摘要
本文是《Linux中断子系统》系列第3章的第一篇,从整体视角介绍Linux中断子系统的概念与层次架构。文章首先梳理了中断的基本概念、分类(内部/外部中断、向量/非向量中断)、处理流程以及中断号体系(IRQ number与HW interrupt ID);随后详细阐述Linux中断子系统的四层结构:硬件层(设备、中断控制器、CPU的物理连接)、CPU与中断控制器相关层(arch异常向量表、GIC/APIC驱动)、通用中断处理层(irqchip、irqdomain、irqdesc、irqaction、irqdata及流控函数)以及Driver层(中断使用者,如热插拔、AER、PME、DPC)。本文是理解后续内核中断机制深度剖析的基础。
3 Linux 中断子系统
Linux中断子系统是Linux内核中用于处理和管理来自硬件设备的中断请求的重要部分。中断是处理器用于异步处理外围设备请求的一种机制,对于操作系统管理外围设备、系统调度、核间交互等至关重要。以下是Linux中断子系统的简介,按照不同的方面进行分点表示和归纳:
1.中断概念与分类:
o 中断是指CPU在执行程序的过程中,由于某些突发事件急待处理,必须暂停当前程序的执行,转去处理突发事件,处理完毕后再返回原程序被中断的位置继续执行。
o 中断可以分为内部中断(也称为异常或软中断)和外部中断(也称为硬中断)。内部中断的中断源来自CPU内部,如软件中断指令、溢出、除法错误等;外部中断的中断源来自CPU外部,由外设提出请求。
o 根据中断入口跳转方法的不同,中断可分为向量中断和非向量中断。向量中断由硬件提供中断服务程序入口地址,非向量中断由软件提供中断服务程序入口地址。
· 中断处理过程:
o 设备产生中断,并通过中断线将中断信号送往中断控制器。
o 中断控制器根据中断源的优先级对中断进行派发,并设置相应的中断请求寄存器位。
o 如果中断没有被屏蔽,中断信号会到达CPU的INTR引脚,CPU立即停止当前工作。
o CPU根据获得的中断向量号从IDT(中断描述符表)中找出门描述符,并执行相关的中断处理程序。
· 中断控制器:
o 中断控制器负责收集所有中断源发起的中断,并根据中断源的优先级进行派发。
o 现有的中断控制器几乎都是可编程的,可以通过编程控制每个中断源的优先级,打开和关闭某一个中断源等。
o 在多核系统中,中断控制器可以控制某个中断送入哪个CPU进行处理。
· Linux中断子系统的层次结构:
o 硬件层:对应的是具体的外设与SoC的物理连接,中断信号是从外设到中断控制器,由中断控制器统一管理,再路由到处理器上。
o 硬件相关层:包括架构相关的代码和中断控制器的驱动代码。
o 通用层:也称为框架层,是硬件无关层,这部分代码在所有硬件平台上是通用的。
o 用户层:主要是各类设备驱动,通过中断相关接口来进行申请和注册,最终在外设触发中断时,进行相应的回调处理。
· 中断号与中断处理:
o Linux内核使用两个ID来标识一个来自外设的中断:IRQ number(中断号)和HW interrupt ID(硬件中断ID)。IRQ number是一个虚拟的interrupt ID,用于CPU标识一个外设中断。
o 驱动代码中使用的都是中断号,而不是异常。驱动代码中的中断都可以通过查询SoC手册,找到对应外设控制器所使用的中断。
· 中断的屏蔽与分发:
o 可屏蔽中断可以通过设置中断控制器寄存器等方法被屏蔽,屏蔽后该中断不再得到响应。而不可屏蔽中断不能被屏蔽。
o 在多核系统中,中断控制器可能会采用静态分发或动态分发的方式将中断送到CPU上进行处理。
通过以上介绍,我们可以看到Linux中断子系统是一个复杂而关键的系统,它负责处理来自硬件设备的中断请求,确保系统能够高效地响应和处理各种硬件事件。
3.1 Linux 中断处理子系统框架

这个图比较粗糙,应该进一步细化,然后对里面的部件进行详细介绍。
画一个Linux中断系统的部件图。
3.1.1 硬件层
硬件层主要反映CPU、中断控制器、设备之间的硬件关系。
硬件连接图:

描述硬件连接的信息保存在设备树:


详细信息查看 Linux 下设备树文件的描述。
3.1.2 CPU 和中断控制器相关的中断处理
CPU arch相关的中断处理,如异常向量表相关设置、中断上下文的保护与恢复等,与系统使用的具体CPU arch相关。
中断控制器驱动,实现中断控制器的编程接口,与系统使用的中断控制器相关。 (GIC、APIC驱动)
3.1.3 通用中断处理层
是与硬件代码无关的抽象层,定义了一套数据结构与接口,实现irq相关的管理,并提供了通用的中断处理函数等:
· irq_chip(中断控制器)
· irq_domain(中断域)
· irq_desc(中断描述符)
·irqaction(中断动作)
·irq_data(中断数据)
·中断流控处理函数等
3.1.4 driver层
中断的使用者,使用Linux kernel通用中断处理模块的API(热插拔、AER、PME、DPC等)。
