Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567027
  • 博文数量: 213
  • 博客积分: 6789
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-01 17:11
文章分类

全部博文(213)

文章存档

2012年(9)

2011年(62)

2010年(99)

2009年(43)

分类: LINUX

2010-05-06 20:00:47

中断处理程序是内核中很重要的一部分,但是它存在一些局限性。
1 中断处理程序以异步方式执行并且它有可能会打断其他重要代码。
2 中断处理程序往往需要对硬件进行操作,所以他们通常有很高的时限要求。
3 中断处理程序不在进程上下文中执行,所以不能被阻塞。
4 当中断处理程序执行时候,会屏蔽中断。
下半部
下半部的人物就是执行与中断处理密切相关但中断处理程序本身不执行的工作。
对于在上半部和下半部的划分,有一些小提示:
1 如果一个人物对时间非常敏感,将其放在中断处理程序中执行。
2 如果一个人物和硬件相关,将其放在中断处理程序中执行。
3 如果一个人物要保重不被其他中断打断,将其放在中断处理程序中执行。
4 其他所有人物,考虑放置在下半部执行。
通常下半部在中断处理程序一返回就会马上运行,下半部执行的关键在于当他们运行的时候,允许相应所有的中断。
软中断
代码位于kernel/softirq.c中,在下半部中,软中断用的比较少,常用的是tasklet,但是tasklet是通过软中断实现的。
软中断是在编译期间静态分配的,它不像tasklet可以被动态的注册和去除。
软中断由softirq_action结构表示。kernel/softirq.c中定义了一个包含有32个该结构体的数组。
static struct softirq_action softirq_vec[32];
每个被注册的软中断都占用该数组的一项,所以最多有32个软中断。
1 软中断处理程序
void softirq_handler(struct softirq_action *)
2 执行软中断
一个软中断必须在被标记后才会执行。在下列地方软中断会被检查和执行:
1 从一个硬件中断代码处返回时。
2 在ksoftirqd内核线程中。
3 在那些显式检查和执行待处理的软中断的代码中。
不管用什么办法唤醒,软中断都要在do_irq()中执行
分配索引
建立一个新的软中断必须在此枚举类型中加入新的项,必须按照希望赋予的优先级分配索引,新项一般都插在TASKLET_SOFTIRQ之前。
注册你的处理程序
open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
触发你的软中断
raise_softirq(NET_TX_SOFTIRQ)
内核在执行完中断处理程序后会马上调用do_softirq()。

工作队列
工作队列可以把工作推后,交由一个内核线程去执行,这样,通过工作队列执行的代码能占尽进程上下文的所有优势,最重要的是工作队列允许重新调度甚至是睡眠。
工作队列的实现
工作队列最基本的表现形式就是转变一个把需要推后执行的任务交给了特定的通用线程这样的一种接口。
默认的工作者线程叫做events/n,这里的n是处理器编号,一个cpu,n=0。默认的工作者线程会从多个地方得到被推后的工作。
表示线程的数据结构
workqueue_struct{ struct cpu_workqueue_struct cpu_wq[NR_CPUS];
                  const char *name ;
                  struct list_head list;};
该结构内是一个由cpu_workqueue_struct结构组成的数组,它定义在kernel/workqueue.c中,数组的每一个对应系统的一个处理器。每个处理器都有一个该类型的工作者线程。
表示工作的数据结构
所有的工作者线程都是用普通的内核线程实现的,他们都要执行worker_thread()函数。在它初始化完以后,这个函数执行一个死循环并开始休眠。当有操作被插入到队列里的时候,线程就会被唤醒,以便执行这些操作。当没有剩余的操作时,它又会继续休眠。

阅读(469) | 评论(0) | 转发(0) |
0

上一篇:MACHINE_START宏

下一篇:中断和中断处理程序

给主人留下些什么吧!~~