Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135171
  • 博文数量: 28
  • 博客积分: 250
  • 博客等级: 二等列兵
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-30 15:13
文章分类
文章存档

2017年(1)

2016年(8)

2015年(7)

2012年(12)

我的朋友

分类: LINUX

2012-10-26 12:31:25

一/概述
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
阅读(1901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~