linux 2.6中断下半部机制分析

linux 2.6中断下半部机制分析

ID:15581525

大小:55.50 KB

页数:10页

时间:2018-08-04

linux 2.6中断下半部机制分析_第1页
linux 2.6中断下半部机制分析_第2页
linux 2.6中断下半部机制分析_第3页
linux 2.6中断下半部机制分析_第4页
linux 2.6中断下半部机制分析_第5页
资源描述:

《linux 2.6中断下半部机制分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、摘要本文主要从使用者的角度对Linux2.6内核的下半部机制softirq、tasklet和workqueue进行分析,对于这三种机制在内核中的具体实现并未进行深入分析,倘若读者有兴趣了解,可以直接阅读Linux内核源代码的相关部分。1概述中断服务程序往往都需要在CPU关中断的情况下运行,以避免中断嵌套而使控制复杂化,但是关中断的时间又不能太长,否则会造成中断信号的丢失。为此,在Linux中,将中断处理程序分为两部分,即上半部和下半部。上半部通常用于执行跟硬件关系密切的关键程序,这部分执行时间非常

2、短,而且是在关中断的环境下运行的。对时间要求不是很严格,而且通常比较耗时的一些操作,则交给下半部来执行,这部分代码是在开中断中执行的。上半部处理硬件相关,称为硬件中断,这通常需要立即执行。下半部则可以延迟一定时间,在内核合适的时间段来执行程序,这就是我们这里要讨论的软中断。本文以目前最新版本的Linux内核2.6.22为例,来讨论Linux的中断下半部机制。在2.6版本的内核中,下半部机制主要由softirq、tasklet和workqueue来实现,下面着重对这3种机制进行分析。2Linux2.

3、6内核中断下半部机制老版本的Linux内核中,下半部是以一种叫做BottomHalf(简称为BH)的机制来实现的,最初它是借助中断向量来实现的,在系统中用一组(共32个)函数指针,分别表示32个中断向量,这种实现方式目前在2.4版本的内核中还可以看到它的身影。但是目前在2.6版本的内核中已经看不到它了。现在的Linux内核,一般以一种称为softirq的软中断机制来实现下半部。2.1softirq机制原来的BH机制有两个明显的缺陷:一是系统中一次只能有一个CPU可以执行BH代码,二是BH函数不允许

4、嵌套。这在单处理器系统中或许没关系,但在SMP系统中却是致命的缺陷。但是软中断机制就不一样了。Linux的softirq机制与SMP是紧密相连的,整个softirq机制的设计与实现始终贯穿着一个思想:“谁触发,谁执行”(Whomarks,whoruns),也就是说,每个CPU都单独负责它所触发的软中断,互不干扰。这就有效地利用了SMP系统的性能和特点,极大地提高了处理效率。Linux在include/linux/interrupt.h中定义了一个softirq_action结构来描述一个softi

5、rq请求,如下所示:structsoftirq_action{void(*action)(structsoftirq_action*);void*data;};其中,函数指针action指向软中断请求的服务函数,而data则指向由服务函数自行解释的参数数据。基于上述结构,系统在kernel/softirq.c中定义了一个全局的softirq软中断向量表softirq_vec[32],对应32个softirq_action结构表示的软中断描述符。但实际上,Linux并没有使用到32个软中断向量,内核

6、预定义了一些软中断向量的含义供我们使用:enum{HI_SOFTIRQ=0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,#ifdefCONFIG_HIGH_RES_TIMERSHRTIMER_SOFTIRQ,#endif};其中HI_SOFTIRQ用于实现高优先级的软中断,比如高优先级的hi_tasklet,而TASKLET_SOFTIRQ则用于实现诸如tasklet

7、这样的一般性软中断。关于tasklet,我们在后面会进行介绍。我们不需要使用到32个软中断向量,事实上,内核预定义的软中断向量已经可以满足我们绝大多数应用的需求。其他向量保留给今后内核扩展使用,我们不应去使用它们。要使用softirq,我们必须先初始化它。我们使用open_softirq()函数来开启一个指定的软中断向量nr,初始化nr对应的描述符softirq_vec[nr],设置所有CPU的软中断掩码的相应位为1。函数do_softirq()负责执行数组softirq_vec[32]中设置的软

8、中断服务函数。每个CPU都是通过执行这个函数来执行软中断服务的。由于同一个CPU上的软中断服务例程不允许嵌套,因此,do_softirq()函数一开始就检查当前CPU是否已经正处在中断服务中,如果是则立即返回。在同一个CPU上,do_softirq()是串行执行的。使用open_softirq()注册完一个软中断之后,我们需要触发它。内核使用函数raise_softirq()来触发一个软中断。对于一个指定的softirq来说,只会有一个处理函数,这个处理函数是所有CPU共享的。由于

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。