中断处理程序下半部1
下半部综述1
使用下半部的目的linux将中断处理程序分为上半部和下半部,目的是尽量减少上半部需要完成的工作,因为在上半部执行的时候,当前的中断线在所有处理器上都会被屏蔽
而且,如果一个处理程序是IRQF_DISABLED类型,它执行的时候会禁止所有本地中断
而缩短中断被屏蔽的时间对系统的响应能力和性能都至关重要
因此需要把一些工作放到下半部去做
不仅是Linux,许多操作系统也把处理硬件中断的过程分为两个部分
上半部分简单快速,执行的时候禁止一些或全部中断
下半部分稍后执行,而且执行期间可以响应所有的中断
这种设计可使系统处于中断屏蔽状态的时间尽可能的短,以此来提高系统的响应能力
Linux中的下半部发展和上半部只能通过中断处理程序实现不同,下半部可以通过多种机制实现
最早的Linux只提供“bottomhalf”这种机制用于实现下半部
它提供了一个静态创建、由32个bottomhalves组成的链表
上半部通过一个32位整数中的一个位来标识出哪个bottomhalf可以执行
每个BH都在全局范围内进行同步
即使分属于不同的处理器,也不允许任何两个bottomhalf同时执行
不久,内核开发者们就引入了任务队列机制来实现工作的推后执行,并用它来代替BH机制
内核为此定义了一组队列,其中每个队列都包含一个由等待调用的函数组成链表
根据其所处队列的位置,这些函数会在某个时刻执行
驱动程序可以把他们自己的下半部注册到合适的队列上去
3这个开发版中,引入了软中断和tasklet
软中断是一组静态定义的下半部接口,有32个,可以在所有处理器上同时执行——即使两个类型相同也可以
两个不同类型的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行
tasklet其实是一种在性能和易用性之间寻求平衡的产物
对于大部分下