- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中断处理程序下半部[软中断-tasklet-工作队列]
中断处理程序下半部
下半部综述
使用下半部的目的
linux将中断处理程序分为上半部和下半部,目的是尽量减少上半部需要完成的工作,因为在上半部执行的时候,当前的中断线在所有处理器上都会被屏蔽。而且,如果一个处理程序是IRQF_DISABLED类型,它执行的时候会禁止所有本地中断。而缩短中断被屏蔽的时间对系统的响应能力和性能都至关重要。因此需要把一些工作放到下半部去做。
不仅是Linux,许多操作系统也把处理硬件中断的过程分为两个部分。上半部分简单快速,执行的时候禁止一些或全部中断。下半部分稍后执行,而且执行期间可以响应所有的中断。这种设计可使系统处于中断屏蔽状态的时间尽可能的短,以此来提高系统的响应能力。
Linux中的下半部发展
和上半部只能通过中断处理程序实现不同,下半部可以通过多种机制实现。最早的Linux只提供“bottom half”这种机制用于实现下半部。它提供了一个静态创建、由32个bottom halves组成的链表。上半部通过一个32位整数中的一个位来标识出哪个bottom half可以执行。每个BH都在全局范围内进行同步。即使分属于不同的处理器,也不允许任何两个bottom half同时执行。
不久,内核开发者们就引入了任务队列机制来实现工作的推后执行,并用它来代替BH机制。内核为此定义了一组队列,其中每个队列都包含一个由等待调用的函数组成链表。根据其所处队列的位置,这些函数会在某个时刻执行。驱动程序可以把他们自己的下半部注册到合适的队列上去。
在2.3这个开发版中,引入了软中断和tasklet。软中断是一组静态定义的下半部接口,有32个,可以在所有处理器上同时执行——即使两个类型相同也可以。两个不同类型的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行。tasklet其实是一种在性能和易用性之间寻求平衡的产物。对于大部分下半部处理来说,用tasklet就足够了,像网络这样对性能要求非常高的情况下才需要使用软中断。可是,使用软中断需要特别小心,因为两个相同的软中断有可能同时被执行。此外,软中断还必须在编译期间就进行静态注册。与此相反,tasklet可以通过代码进???动态注册。
另外一个可以用于将工作推后执行的机制是内核定时器。内核定时器把操作推迟到某个确定的时间段之后执行。也就是说,当你必须保证在一个确定的时间段过去以后再执行时,你应该使用内核定时器。
工作队列是另外一种将工作推后执行的形式,工作队列可以把工作推后,交由一个内核线程去执行——这个下半部分总是会在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许重新调度甚至是睡眠。
软中断和tasklet的关系
tasklet是利用软中断实现的一种下半部机制。tasklet是通过软中断实现的,所以tasklet本身也是软中断。
tasklet由两类软中断代表:HI_SOFTIRQ和TASKLET_SOFTIRQ。
软中断列表
tasklet类型列表
tasklet优先级软中断描述HI_SOFTIRQ0优先级高的taskletsTIMER_SOFTIRQ1定时器的下半部NET_TX_SOFTIRQ2发送网络数据包NET_RX_SOFTIRQ3接收网络数据包BLOCK_SOFTIRQ4BLOCK装置TASKLET_SOFTIRQ5正常优先权的taskletsSCHED_SOFTIRQ6调度程度HRTIMER_SOFTIRQ7高分辨率定时器RCU_SOFTIRQ8RCU锁定
注册tasklet
在kernel/softirq.c通过以下方式注册tasklet:
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
tasklet_action()和tasklet_hi_action()在kernel/softirq.c定义
触发软中断
一个注册的软中断必须在被标记后才会执行。这被称作触发软中断(raising the softirq)。通常,中断处理程序会在返回前标记它的软中断,使其在稍后被执行。在下列地方,待处理的软中断会被检查和执行:
从一个硬件中断代码返回时
在ksoftirqd内核线程中
在那些显示检查和执行待处理的软中断的代码中,如网络子系统中
执行软中断
不管是用什么办法唤起软中断,它都要在do_softirq()中执行。该函数很简单,如果有待处理的软中断,do_softirq()会循环遍历每一个,调用他们的处理程序。下面是do_softirq()简化后的核心
文档评论(0)