第10章 中断与时钟之Linux中断处理程序架构

时间:2020-12-05 14:34:40

10.2 Linux中断处理程序架构

    设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求要求中断服务程序尽量短小精悍。但是,愿望与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作并不会是短小的,它可能要进行较大量的耗时处理。

    图10.3描述Linux内核的中断处理机制。为了在中断执行时间尽量短中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个半部:上半部(处理紧急的硬件操作)下半部(延缓的耗时操作)

第10章 中断与时钟之Linux中断处理程序架构

图10.3 Linux中断处理机制

    上半部用于完成尽量少的比较紧急的操作,它往往只是简单地读取寄存器中的中断状态,并在清除中断标志后就进行“登记中断”的工作。“登记中断”将下半部处理程序挂到该设备的下半部执行队列中去。这样,上半部执行的速度就会很快,从而,可以服务更多的中断请求。

    现在,中断处理工作的重心就放在下半部,需用下半部来完成中断事件的绝大多数任务。下半部几乎做了中断处理程序所有的事情,还可以被新的中断打断,这也是上半部和下半部的最大不同,因为上半部往往被设计成不可中断。下半部相对来说并不是非常紧急的,而且相对比较耗时,不在硬件中断服务程序中执行,而在软件中断服务程序中执行。

    如果中断要处理的工作本身很少,则完全可以直接在上半部全部完成。

    备注:其他操作系统中对中断的处理也采用了Linux类似的方法,真正的硬件中断服务程序都应该尽量短。因此,许多操作系统都提供了中断上下文和非中断上下文相结合的机制,将中断的耗时工作保留到非中断上下文去执行。

    在Linux中,查看/proc/interrupts文件可以获得系统中中断的统计信息,并能统计出每一个中断号上的中断在每个CPU上发生的次数。