中断处理程序下半部(软中断、tasklet、工作队列)

中断处理程序下半部(软中断、tasklet、工作队列)

ID:14197450

大小:58.18 KB

页数:26页

时间:2018-07-26

中断处理程序下半部(软中断、tasklet、工作队列)_第1页
中断处理程序下半部(软中断、tasklet、工作队列)_第2页
中断处理程序下半部(软中断、tasklet、工作队列)_第3页
中断处理程序下半部(软中断、tasklet、工作队列)_第4页
中断处理程序下半部(软中断、tasklet、工作队列)_第5页
资源描述:

《中断处理程序下半部(软中断、tasklet、工作队列)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、中断处理程序下半部1.下半部综述1.1.使用下半部的目的linux将中断处理程序分为上半部和下半部,目的是尽量减少上半部需要完成的工作,因为在上半部执行的时候,当前的中断线在所有处理器上都会被屏蔽。而且,如果一个处理程序是IRQF_DISABLED类型,它执行的时候会禁止所有本地中断。而缩短中断被屏蔽的时间对系统的响应能力和性能都至关重要。因此需要把一些工作放到下半部去做。不仅是Linux,许多操作系统也把处理硬件中断的过程分为两个部分。上半部分简单快速,执行的时候禁止一些或全部中断。下半部分稍后执行,而且执行期间可以响应所有的中断。这种设计可使系

2、统处于中断屏蔽状态的时间尽可能的短,以此来提高系统的响应能力。1.2.Linux中的下半部发展和上半部只能通过中断处理程序实现不同,下半部可以通过多种机制实现。最早的Linux只提供“bottomhalf”这种机制用于实现下半部。它提供了一个静态创建、由32个bottomhalves组成的链表。上半部通过一个32位整数中的一个位来标识出哪个bottomhalf可以执行。每个BH都在全局范围内进行同步。即使分属于不同的处理器,也不允许任何两个bottomhalf同时执行。不久,内核开发者们就引入了任务队列机制来实现工作的推后执行,并用它来代替BH机制

3、。内核为此定义了一组队列,其中每个队列都包含一个由等待调用的函数组成链表。根据其所处队列的位置,这些函数会在某个时刻执行。驱动程序可以把他们自己的下半部注册到合适的队列上去。在2.3这个开发版中,引入了软中断和tasklet。软中断是一组静态定义的下半部接口,有32个,可以在所有处理器上同时执行——即使两个类型相同也可以。两个不同类型的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行。tasklet其实是一种在性能和易用性之间寻求平衡的产物。对于大部分下半部处理来说,用tasklet就足够了,像网络这样对性能要求非

4、常高的情况下才需要使用软中断。可是,使用软中断需要特别小心,因为两个相同的软中断有可能同时被执行。此外,软中断还必须在编译期间就进行静态注册。与此相反,tasklet可以通过代码进行动态注册。另外一个可以用于将工作推后执行的机制是内核定时器。内核定时器把操作推迟到某个确定的时间段之后执行。也就是说,当你必须保证在一个确定的时间段过去以后再执行时,你应该使用内核定时器。工作队列是另外一种将工作推后执行的形式,工作队列可以把工作推后,交由一个内核线程去执行——这个下半部分总是会在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。

5、最重要的就是工作队列允许重新调度甚至是睡眠。1.2.软中断和tasklet的关系tasklet是利用软中断实现的一种下半部机制。tasklet是通过软中断实现的,所以tasklet本身也是软中断。tasklet由两类软中断代表:HI_SOFTIRQ和TASKLET_SOFTIRQ。2.1.软中断列表tasklet类型列表tasklet优先级软中断描述HI_SOFTIRQ0优先级高的taskletsTIMER_SOFTIRQ1定时器的下半部NET_TX_SOFTIRQ2发送网络数据包NET_RX_SOFTIRQ3接收网络数据包BLOCK_SOFTIR

6、Q4BLOCK装置TASKLET_SOFTIRQ5正常优先权的taskletsSCHED_SOFTIRQ6调度程度HRTIMER_SOFTIRQ7高分辨率定时器RCU_SOFTIRQ8RCU锁定1.1.注册tasklet在kernel/softirq.c通过以下方式注册tasklet:open_softirq(TASKLET_SOFTIRQ,tasklet_action);open_softirq(HI_SOFTIRQ,tasklet_hi_action);tasklet_action()和tasklet_hi_action()在kernel/so

7、ftirq.c定义1.2.触发软中断一个注册的软中断必须在被标记后才会执行。这被称作触发软中断(raisingthesoftirq)。通常,中断处理程序会在返回前标记它的软中断,使其在稍后被执行。在下列地方,待处理的软中断会被检查和执行:l从一个硬件中断代码返回时l在ksoftirqd内核线程中l在那些显示检查和执行待处理的软中断的代码中,如网络子系统中1.3.执行软中断不管是用什么办法唤起软中断,它都要在do_softirq()中执行。该函数很简单,如果有待处理的软中断,do_softirq()会循环遍历每一个,调用他们的处理程序。下面是do_s

8、oftirq()简化后的核心部分:u32pending;pending=local_softirq_pending();i

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

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

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