一 、中断
1.1 申请
中断申请函数 int request_irq()可能会睡眠。不能在中断上下文或其他不允许阻塞的代码中调用该函数。Free_irq()必须从进程上下文中调用。
1.2 中断线
中断线到底是什么?每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。
中断线操作函数如下:
Disable_irq(unsigned int irq);
Disable_irq_nosync(unsigned int irq);
Enable_irq(unsigned int irq);
1.3 中断共享
多个设备共享一根硬件中断线的情况在实际的硬件系统中广泛存在,Linux支持这种中断共享。详细内存可参考如下博客。
1.4 当前处理器中断操作
禁止当前处理器上的本地中断,随后又激活它们的语句为:
Local_irq_disable() /*禁止中断*/
Local_irq_enable()
1.5 中断处理函数
中断处理程序无需重入。
中断不支持嵌套。
中断处理函数,应处理一些及时的操作,耗时的操作留给下半部处理如工作队列,tasklet等。
二 下半部处理
2.1 软中断
软中断什么时候会被执行呢?
- 从硬件中断代码返回时。
- 在ksoftirq内核线程中。
- 在那些显示检查和执行待处理的软中断的代码中,如网络子系统。
软中断是一组静态定义的下半部接口,有32个,可以在所有处理器上同时执行——即使两个类型相同也可以。
2.2 tasklet
两个类型不同的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行。
Tasklet处理时,到底禁止了中断没有?没有。
linux中,中断的处理方法 tasklet软中断_中断程序不能嵌套_One Piece&的博客-CSDN博客
2.3队列
在工作队列和软中断/tasklet中做出选择非常容易,如果推后执行的任务需要睡眠,那么就选择队列。如果推后执行的任务不需要睡眠,那么就选择软中断或tasklet。