Lazy loaded image
01. Linux中断处理链路及关键数据结构
Words 3525Read Time 9 min
2025-12-23
本节深入讲解了Linux中断系统的核心机制,包括:硬件中断号(hwirq)与虚拟中断号(virq)的映射转换irq_desc数组与irq_action链表的协作关系多设备共享中断线的处理流程GPIO-GIC-CPU的级联架构,以及IRQ Domain如何实现硬件与软件中断号的解耦。通过设备树配置、数据结构源码分析和完整的中断处理时序图,帮助理解从硬件触发到驱动响应的完整中断处理链路。

一、概要总结

关键概念

  • 硬件中断号(hwirq):中断控制器(如GIC)使用的物理中断编号
  • 虚拟中断号(virq):Linux内核使用的中断号,作为irq_desc数组索引(注意:不要与内核softirq机制混淆)
  • 共享中断:多个设备共享一条中断线,通过dev_id区分,遍历action链表调用所有handler
  • 中断上半部:在中断上下文执行,关中断,快速处理
  • 中断下半部:延迟处理,开中断,可被抢占
  • IRQ Domain:解耦硬件中断号和虚拟中断号,支持中断控制器级联

核心数据结构

  • irq_desc数组:每个虚拟中断号(virq)对应一个IRQ描述符
  • 硬件与虚拟中断号映射:通过IRQ Domain实现转换
  • 共享中断机制:多个设备共享同一硬件中断线
  • irq_action链表:管理同一中断的多个处理函数
  • IRQ Domain:硬件中断号到虚拟中断号的映射域
  • IRQ Chip:中断控制器的硬件操作接口
  • 设备树中断配置:声明设备的中断资源

二、GPIO-GIC-CPU中断架构与共享中断机制

硬件架构示例

以典型的ARM SoC为例,中断控制器通常采用级联架构:
GPIO共享中断的硬件原理:
  • GPIO控制器通常将多个GPIO引脚的中断信号通过或门逻辑合并
  • 合并后的信号连接到GIC的一个SPI中断线(如SPI 64)
  • 这意味着GPIO1的Pin0-Pin31可能共享同一个GIC中断号

硬件中断触发流程

软件中断处理流程

GPIO共享中断的软件处理要点

  1. 中断识别:GPIO控制器驱动作为二级中断控制器,需要读取GPIO状态寄存器确定具体哪个引脚触发
  1. 级联处理:GIC的handler会调用GPIO控制器注册的chained_irq_handler
  1. 二次分发:GPIO控制器根据状态寄存器,调用对应GPIO引脚的irq_desc

三、核心数据结构关系图

三、关键数据结构源码分析

1. irq_desc - IRQ描述符

这是中断系统的核心数据结构:

2. irqaction - 中断处理action

支持共享中断的关键结构:

3. IRQ Domain - 中断域

实现硬件中断号到软件中断号的映射:
硬件中断号到软件中断号映射的原因与方式
映射的原因
  • 硬件独立性:不同的中断控制器(GIC、GPIO控制器等)使用各自的硬件中断编号体系,通过映射层实现了驱动程序与具体硬件的解耦
  • 支持中断控制器级联:当多个中断控制器级联时(如GIC下挂GPIO控制器),需要统一的软件中断号空间来管理所有中断源
  • 动态资源分配:软件中断号可以在运行时动态分配,而硬件中断号是固定的。这使得系统可以根据实际使用的中断数量灵活分配irq_desc资源
  • 设备树抽象:设备树中使用硬件中断号描述,驱动程序使用软件中断号操作,IRQ Domain在中间完成转换
映射的实现方式
  • 线性映射(Linear Map):适用于硬件中断号连续且数量较少的情况,直接使用数组索引实现快速查找
  • 基数树映射(Radix Tree):适用于硬件中断号稀疏分布的情况,节省内存空间
  • No-Map方式:某些特殊情况下,硬件中断号直接等于软件中断号,不需要映射表

映射的关键操作

  • xlate函数:解析设备树中的interrupts属性,将设备树描述的中断参数转换为硬件中断号和触发类型
  • map函数:建立硬件中断号到软件中断号的映射关系,初始化对应的irq_desc结构
  • revmap数组:反向映射表,用于从硬件中断号快速查找到对应的irq_data结构
在中断发生时,中断处理流程会先从GIC读取硬件中断号,然后通过IRQ Domain的revmap表转换为软件中断号,最后用这个软件中断号索引irq_desc数组找到对应的中断处理函数。

4. irq_chip - 中断控制器操作

封装硬件中断控制器的操作接口:
以下是Linux中断系统四个核心数据结构在驱动开发和中断处理中的使用流程:
四个核心数据结构的作用:
  • IRQ Domain:负责硬件中断号与软件中断号的映射转换,在驱动初始化时解析设备树并建立映射关系
  • irq_desc数组:使用软件中断号(virq)作为索引,存储每个中断的描述符,是中断处理的核心枢纽
  • irq_action链表:挂载在irq_desc下,支持共享中断机制,存储所有注册到同一中断号的处理函数
  • irq_chip:封装硬件中断控制器(如GIC)的操作接口,提供mask/unmask/ack/eoi等硬件控制函数
这个流程展示了从设备树配置、驱动注册、中断触发到中断处理的完整过程,以及四个数据结构在各个阶段的协作关系。

四、共享中断机制

解答"硬件共享中断如何区分"的问题:

五、设备树中断配置

设备树中中断的声明方式:
 

 
上一篇
Data Structure and Algorithm
下一篇
用面试拷问嵌入式技术栈

Comments
Loading...