本文将介绍中断处理流程以及下半部机制(软中断、tasklet、工作队列)。其中会有参考《深入Linux设备驱动程序内核机制》中的图片。
1. 中断处理流程
2. 软中断
3. tasklet
4. 工作队列
关于工作队列,推荐两篇文章:
http://blog.csdn.net/dog250/article/details/6118419
http://blog.csdn.net/zzhere2007/article/details/9290909
在此简单总结下工作队列,“新内核中的所有工作队列被排队到一个global_cwq的每cpu的队列中,你仍然可以调用create_workqueue创建很多的具体的工作队列,但是这样创建的工作队列除了其参数中的flag起作用外,对排队其中的具体动作没有任何约束性,所有的工作都排队到了一个每cpu队列中,然后原则上按照排队的顺序进行执行,期间受到排队workqueue的flag进行微调。”
使用int queue_work(struct workqueue_struct *wq, struct work_struct *work):
1. 将work_struct添加到练笔1中,其中work_struct->func就是待处理的函数。
2. weak_up_process(worker->task),唤醒链表2中的线程task,task(worker_thread)会处理链表1中待处理的work_struct。
使用工作队列workqueue: