1. Linux中断处理机制概述
在Linux内核中,中断处理是设备驱动程序开发的核心环节之一。当硬件设备需要CPU的注意时,它会通过中断信号通知内核,这时CPU会暂停当前任务,转而去执行与该中断关联的处理程序。这种机制避免了CPU不断轮询设备状态的低效做法,是现代操作系统实现高效I/O操作的基础。
Linux内核的中断处理架构分为三个主要层次:
- 硬件相关层:直接与中断控制器交互
- 通用中断处理层:提供统一的抽象接口
- 驱动层:实现具体设备的中断服务例程
中断处理程序(ISR)有几个关键特性需要注意:
- 执行上下文:运行在中断上下文中,不能睡眠
- 执行时间:应该尽可能短,避免影响系统响应
- 并发处理:需要考虑SMP环境下的竞态条件
重要提示:在编写中断处理程序时,必须遵守"快进快出"原则,长时间的操作应该使用工作队列或tasklet延迟执行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 中断处理核心数据结构解析
2.1 irq_desc结构体
每个中断在Linux内核中都由一个irq_desc结构体表示,它包含了处理该中断所需的所有信息。关键字段包括:
c复制struct irq_desc {
struct irq_data irq_data;
unsigned int __percpu *kstat_irqs;
irq_flow_handler_t handle_irq; // 流处理函数
struct irqaction *action; // 中断处理链
unsigned int status_use_accessors;
unsigned int depth; // 禁用嵌套计数
unsigned int wake_depth; // 唤醒使能计数
const char *name;
// ...
};
2.2 irqaction结构体
当驱动程序注册中断处理程序时,内核会创建irqaction结构体:
c复制struct irqaction {
irq_handler_t handler; // 中断处理函数
void *dev_id; // 设备标识符
void __percpu *percpu_dev_id;
struct irqaction *next; // 共享中断链表
irq_handler_t thread_fn; // 线程化处理函数
struct task_struct *thread; // 线程化中断线程
// ...
};
2.3 中断流类型
Linux内核支持多种中断流处理方式:
| 流类型 | 处理函数 | 适用场景 |
|---|---|---|
| 电平触发 | handle_level_irq | 持续保持电平的中断 |
| 边沿触发 | handle_edge_irq | 脉冲边沿触发的中断 |
| 简单型 | handle_simple_irq | 无需硬件交互的中断 |
| 每CPU型 | handle_percpu_irq | SMP系统中CPU专有中断 |
3. 中断注册与处理流程
3.1 中断注册API
驱动程序
