1
linux内核研究-5-tasklet
1》tasklet需要软中断的支持,没有软中断,就没有tasklet。2》tasklet可以认为是软中断的一个子系统。3》个人认为将来tasklet可以完全替代软中断。tasklet工作原理和过程
1》内核有一个链表,在linux/interrupt.h里面:structtasklet_struct{};里面有tasklet处理函数和函数参数。具体成员我就不说了。2》还记得软中断里面的内核线程ksoftirqd吗?这个线程检查软中断标记(TASKLET_SOFTIRQ),3》如果标记了,则检查tasklet_struct链表的每个节点,如果本节点的成员status为可调度,则执行对应的tasklet处理函数。
如何在你的驱动程序里使用tasklet,比如rill_tasklet。
1》声明tasklet,向链表添加一个节点。静态:DELARE_TASKLET(rill_tasklet,rill_tasklet_func,dev);动态:tasklet_init(rill_tasklet,rill_tasklet_func,dev);
2》实现rill_tasklet_func:voidrill_tasklet_func(unsignedlongdata);
3》使能tasklet:在中断处理程序返回前调用:tasklet_schedule(rill_tasklet);4》禁止和使能tasklet禁止:tasklet_disable(rill_tasklet);使能:tasklet_enable(rill_tasklet);
关于ksoftirqd内核线程的讨论
ksoftirq如何平衡软中断和用户进程的负载分配。现有两种直观方式1》在tasklet处理期间,用户进程等待,这样能尽快处理完tasklet的工作。但是这样在tasklet任务比较中的情况下,用户进程就会饥饿。2》在tasklet处理期间,如果有用户进程,则停止当前处理工作,执行用户进程,这样如果用户进程工作比较多时,tasklet就会饥饿。3》linux采用了折中方案。4》在tasklet处理期间,一旦出现中断产生,则开启一组内核线程,nice为19,来处理剩下工作,及时响应中断,或高优先级的用户进程。
每天学习5分钟,人生进步一大步!白癜风能治好吗北京哪个医院能治疗白癜风