1. 中断处理机制概述
在嵌入式Linux系统中,中断处理是内核最核心的机制之一。当硬件设备需要CPU立即处理某个事件时,会通过中断信号打断当前程序的执行流程。典型的中断触发场景包括:
- 网络数据包到达网卡
- 定时器超时
- 用户按键操作
- 磁盘I/O完成
传统的中断处理分为两个关键阶段:
- 上半部(Top Half):在中断上下文中立即执行的关键操作
- 下半部(Bottom Half):延后执行的后续处理
注意:中断上半部执行时会关闭本地CPU的中断响应,因此必须尽可能简短,通常只做最必要的硬件操作和状态记录。
2. 中断下半部的实现方式
2.1 软中断(Softirq)
软中断是Linux内核中最原始的下半部机制,具有以下特点:
- 静态编译进内核,不能动态注册
- 执行时机:从中断返回时或ksoftirqd内核线程中
- 典型应用场景:
- 网络子系统(NET_RX_SOFTIRQ)
- 块设备子系统(BLOCK_SOFTIRQ)
- 任务队列(TASKLET_SOFTIRQ)
关键数据结构:
c复制struct softirq_action {
void (*action)(struct softirq_action *);
};
注册软中断示例:
c复制open_softirq(NET_RX_SOFTIRQ, net_rx_action);
2.2 任务队列(Tasklet)
任务队列是基于软中断实现的更高层抽象,相比原始软中断有以下改进:
- 支持动态创建和销毁
- 同一任务在多个CPU上不会并发执行
- 使用更简单的API接口
典型使用模式:
c复制void my_tasklet_func(unsigned long data);
DECLARE_TASKLET(my_tasklet, my_tasklet_func, 0);
// 调度任务
tasklet_schedule(&my_tasklet);
实操心得:任务队列适合中小型延迟任务,但要注意单个任务执行时间不应过长,否则会影响其他软中断处理。
2.3 工作队列(Workqueue)
工作队列是唯一可以在进程上下文中执行的下半部机制,特点包括:
- 可睡
