预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

6.1下半部下半部的任务就是执行与HYPERLINK"http://whatis.ctocio.com.cn/searchwhatis/404/7420404.shtml"中断处理密切相关但中断处理程序本身不执行的工作。对于在上半部和下半部之间划分工作,尽管不存在某种严格的规则,但还是有一些提示可供借鉴: (1)如果一个任务对时间非常敏感,将其放在中断处理程序中执行。 (2)如果一个任务和HYPERLINK"http://product.yesky.com/diy/"硬件相关,将其放在中断处理程序中执行。 (3)如果一个任务要保证不被其它中断打断,将其放在中断处理程序中执行。 (4)其它所有任务,考虑放在下半部执行。 当我们开始尝试写自己的驱动程序的时候,读一下别人的中断处理程序和相应的下半部会令你受益匪浅。 现在的问题是:下半部具体放到以后的什么时候去做呢?下半部并不需要指明一个确切时间,只要把这些任务推迟一点,让他们在系统不太繁忙并且中断恢复后执行就可以了。 通常下半部在中断处理程序一返回就会马上执行。下半部执行的关键在于当它们运行的时候,允许响应所有中断。6.1.1为什么要用下半部?因为在中断处理程序运行的时候,当前的中断线会被屏蔽,如果一个处理程序是SA_INTERRUPT类型,它执行的时候会禁止所有本地中断(而且把本地中断线全局屏蔽掉), 再加上中断处理程序要与其它程序——甚至是其它的中断处理程序——异步执行。具体放到以后什么时候去做呢?在这里,“以后”仅仅用来强调不是“马上”而已,下半部并不需要指明一个确切时间,只是把这些任务推迟一点,让它们在系统不太繁忙并且中断恢复后执行就可以了, 通常下半部在中断处理程序一返回就会马上执行,下半部执行的关键在于当它们运行的时候,允许响应所有的中断。6.2软中断软中断是用HYPERLINK"http://product.yesky.com/software/"软件方式模拟硬件中断的概念,实现宏观上的异步执行效果,tasklet也是基于软中断实现的。异步通知所基于的信号也类似于中断。硬中断是外部设备对HYPERLINK"http://product.yesky.com/cpu/"CPU的中断软中断通常是硬中断服务程序对内核的中断。信号则是由内核(或其它HYPERLINK"http://whatis.ctocio.com.cn/searchwhatis/292/7333792.shtml"进程)对某个进程的中断。6.2.1软中断的实现软中断是在编译期间静态分配的。不像tasklet那样能被动态的注册或去除。软中断由softirq_action结构表示,它定义在<linux/interrupt.h>中:structsoftirq_action{void(*action)(structsoftirq_action*);/*待执行的函数*/Void*date;/传递给函数的参数*/};在HYPERLINK"http://whatis.ctocio.com.cn/searchwhatis/24/5948524.shtml"kernel/softirq.c中定义了一个包含有32个该结构体的数组。staticstrcutsoftirq_actionsoftirq_vec[32];每个注册的软中断都占据该数组中的一项。(1)软中断处理程序:软中断处理程序action的函数原型如下:voidsoftirq_handler(structsoftirq_action*)当内核运行一个软中断处理程序的时候,它就会执行这个action函数,其唯一的参数为指向相应的softirq_action结构体的指针。一个软中断不会抢占另外一个软中断,实际上,唯一可以抢占软中断的是中断处理程序,不过,其它的软中断——甚至是相同类型的软中断——可以在其它HYPERLINK"http://product.yesky.com/cpu/"处理器上同时执行。(2)执行软中断:一个注册的软中断必须在被标记后才会执行。这被称作触发软中断(raisingthesoftirq)。 通常,中断处理程序会在返回前标记它的软中断,使其在稍后被执行。软中断被标记后,可以用softirq_pending()检查到这个标记并按照索引号将softirq_pending()的返回值的相应位置1。在合适的时刻,该软中断就会运行,在下列地方,待处理的软中断会被检查和执行:在处理完一个硬中断以后在ksoftirqd内核HYPERLINK"http://whatis.ctocio.com.cn/searchwhatis/146/7352146.shtml"线程中在那些显式检查和执行待处理的软中断的代码中,如HYP