1. 通用中断处理程序执行过程:
1)获取栈中保存的上下文数据;
2)根据中断号找到描述该中断的结构体 struct irq_desc
3)进行中断处理
1》 进入顶半部,hard irq
2》进入底半部,soft irq
3》恢复中断执行前的上下文
2. 中断上下部的原因:
内核在处理中断请求时要求在单位时间内处理尽可能多的中断,也就是说要求处理中断的吞吐率要尽可能地大。这就要求中断处理函数中的代码尽可能地短小,而且不能有耗时的操作。
上半部:handler函数 --- 接收和响应中断请求
下半部机制:软中断、Tasklet、工作队列 -- 处理中断的业务逻辑
下半部和上半部最大的区别是下半部可中断,而上半部却不可中断。
3. 工作队列和tasklet
工作队列的使用方法和tasklet非常相似
但:tasklet运行于中断上下文
工作队列运行于进程上下文
tasklet处理函数中不能睡眠,而工作队列处理函数中允许睡眠
4. 软中断
软中断一般是“可延迟函数”的总称,它不能睡眠,不能阻塞,它处于中断上下文,不能进程切换,软中断不能被自己打断,只能被硬件中断打断(上半部),可以并发的运行在多个CPU上。所以软中断必须设计成可重入的函数,因此也需要自旋锁来保护其数据结构