一/概述
tasklet是驱动程序实现可延迟函数的首选方法,tasklet建立在HI_SOFTIRT和TASKLET_SOFTIRQ两个软中断上。
二/原理
tasklet和高优先级的tasklet分别存放在tasklet_vec和tasklet_hi_vec数组中,二者都包含类型为tasklet_head的
NR_CPUS个元素,每个元素都是指向tasklet描述符链表的指针。
三/执行过程
HI_SOFTIRQ软中断相关的软中断函数是tasklet_hi_action(),而与TASKLET_SOFTIRQ相关的函数是tasklet_action()
1.禁止本地中断
2.获得本地CPU的逻辑号n
3.把tasklet_vec[n]或tasklet_hi_vec[n]所指向的链表的地址存入局部变量list
4.把tasklet_vec[n]或tasklet_hi_vec[n]的值赋为NULL,因此已调度的tasklet描述符链表被清空
5.打开本地中断
6.对于list所指向的每个tasklet描述符
a.在多处理器系统上,检查tasklet的TASKLET_STATE_RUN标志。
if标志被设置,list重新插入结构数组,并激活TASKLET_SOFTIRQ或HI_SOFTIRQ软中断,这个tasklet
被延迟
else 设置TASKLET_STATE_RUN标志,以便tasklet不能在其他CPU上运行
b.通过查看tasklet描述符的count字段,看tasklet是否被禁止。如果是清TASKLET_STATE_RUN标志,把
list重新插入结构数组,并激活相应的软中断。
c.如果tasklet被激活,清TASKLET_STATE_SCHED标志,并执行tasklet函数
四/编写一个设备驱动程序的步骤
1.分配一个新的tasklet_struct数据结构,并用tasklet_init()初始化它;
2.实现tasklet函数
3.禁止或使能tasklet
阅读(1936) | 评论(0) | 转发(0) |