当前位置:首页>Linux>Linux中断子系统全景解析:从硬件层到驱动层的四层框架 【第9篇·共15篇】

Linux中断子系统全景解析:从硬件层到驱动层的四层框架 【第9篇·共15篇】

  • 2026-10-11 08:00:55
Linux中断子系统全景解析:从硬件层到驱动层的四层框架 【第9篇·共15篇】

摘要

本文是《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等)。

最新文章

随机文章