本文为《Linux内核设计与实现》第七章 “中断和中断处理” 阅读笔记。

中断

中断本质上是一种特殊的电信号,有硬件设备发送给处理器。处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统处理这些新到来的数据。不同设备对应的中断不同,而每个中断都通过一个唯一的数字标志(中断请求线,IRQ线),操作系统可以根据这些标志提供对应的中断处理程序。

中断处理程序

在响应一个特定中断的时候,内核会执行一个函数,该函数就被称为中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。

在Linux中,中断处理程序就是普通的C函数,不过必须按照特定的类型声明,以便内核能够以标准的方式传递处理程序的信息。被内核调用来响应中断,运行于我们称之为中断上下文中的特殊上下文中。

因为中断随时可能发生,所以中断处理程序也就随时可能发生。所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快地恢复中断代码的执行。

上半部与下半部的对比

又想中断处理程序执行得快,又想中断处理程序完成的工作量多,这两个目的显然有所抵触,所以我们一般把中断处理切为两个部分。

中断处理程序是上半部(top half)——接收到一个中断,它就立即开始执行,但只做有严格时限的工作。能够被允许稍后完成的工作会推迟到下半部(bottom half)去。

注册、释放中断处理程序

中断处理程序是管理硬件的驱动程序的组成部分。驱动程序可以通过 request-irq()函数注册一个中断处理程序,并且激活给定的中断线,以处理中断。

卸载驱动时,需要注销相对应的中断处理程序,并释放中断线。free_irq()

编写中断处理程序

static irqreturn_t intr_handler(int irq,void *dev)

第一个参数irq是这个处理程序要响应的中断的中断号,目前已经没有太大用了。

第二个参数dev是一个通用指针。可以用来区分共享同一中断处理程序的多个设备。

中断上下文