1. 中断机制基础概念
中断是计算机系统中处理器与外部设备通信的核心机制。当硬件设备需要CPU处理某个事件时,它会通过中断线发送电信号,CPU收到信号后会暂停当前执行的指令序列,转而去执行与该中断关联的处理程序。
在Linux内核中,中断处理分为两个关键部分:
- 上半部(Top Half):需要快速执行的紧急处理,通常进行硬件状态读取、必要数据保存等操作,处理过程要求尽可能短
- 下半部(Bottom Half):耗时较长的处理工作,通过软中断、tasklet或工作队列等机制延迟执行
重要提示:在编写中断处理程序时,必须确保上半部代码执行时间极短(理想情况下不超过几十微秒),否则会导致系统响应延迟甚至丢失后续中断。
2. Linux中断子系统架构
2.1 中断控制器抽象层
现代Linux内核通过irqchip抽象层支持多种中断控制器:
c复制struct irq_chip {
const char *name;
void (*irq_enable)(struct irq_data *data);
void (*irq_disable)(struct irq_data *data);
// ... 其他操作函数指针
};
常见的中断控制器包括:
- x86平台的APIC和IOAPIC
- ARM平台的GIC(Generic Interrupt Controller)
- 嵌入式系统中常见的PLIC(RISC-V平台)
2.2 中断描述符表管理
内核使用irq_desc结构体管理每个中断源的状态信息:
c复制struct irq_desc {
struct irq_data irq_data;
struct irqaction *action; // 中断处理函数链表
unsigned int depth; // 禁用计数器
// ... 其他状态字段
};
3. 驱动中断处理实现
3.1 中断注册流程
典型的中断注册代码示例:
c复制static irqreturn_t my_interrupt_handler(int irq, void
