中断(硬中断),即使电信号,由硬件设备产生,直接送到中断控制器的输入引脚,中断控制器是个简单的电子芯片,其作用是将多路中断管线,采用复用技术只通过一个和处理器相连的管线与处理器通讯,当收到中断后,中断控制器会给处理器发送一个电信号,处理器检测到次电信号后便中断自己的工作,转而处理中断,此后处理器会通知操作系统已经产生中断,这样操作系统就会处理这个中断了。
不同设备对应的中断不同,而每个中断都通过一个唯一的数字标识(IRQ),这样操作系统才能给不同的中断提供其对应的中断处理程序(ISR)。
一个设备的中断处理程序是它的驱动程序的一部分,设备驱动程序是对设备进行管理的内核代码。
中断处理程序与其他内核函数的区别在于:中断处理程序是被内核调用来响应中断的,而他们运行于我们称之为中断上下文的特殊上下文中。在中断上下文中执行的代码不可阻塞。中断是随时产生的,因此中断处理程序要随时可以执行,所以必须保证中断处理程序快速执行。
又想中断处理程序运行的快,又想中断处理程序完成的工作多,显然是有矛盾的。这两个目的存在此消彼长的关系,我们一般把中断处理分为两部分。中断处理程序是上半部分,收到一个中断后,就开始立即执行,但只做有严格时间限制的工作。能够被允许稍后完成的工作推迟到下半部分去完成,在合适的时间,下半部分会被执行。
内核为处理中断而提供了中断处理程序机制,但是由于本身的一些局限,它只能完成整个中断处理流程的上半部分,这些局限包括:
1 中断处理程序以异步方式执行,并且可能会打断其他代码,因此中断处理程序要快速执行完毕
2 如果一个中断处理程序正在执行,最好的情况是与该中断同级的其他中断被屏蔽,最坏的情况是,当前处理器上的所有中断都会被屏蔽。
3 由于中断处理程序需要对硬件进行操作,所以他们通常有严格的时限要求
4 中断处理程序不能被阻塞
一个软中断不会抢占另一个软中断,唯一可以抢占软中断的是中断处理程序,不过其他的软中断可以在其他处理器上运行。
linux中的中断处理程序是无须重入的,因为一个中断号对应一个中断处理程序,而一个中断处理程序正在执行时,相应的中断线在所有处理器上是会被屏蔽掉。但其他中断是打开的,所以这些不同中断线的其他的中断都能被处理。
但系统调用(软中断)必须是可重入的,因为同一个系统调用可能同时被多个进程调用使用。
共享中断线
多个硬件设备共享一个中断线(实际上也不能每个设备都有单独的中断线--中断控制器的复用技术),要求:
1.request_irq() 参数flags设置shared模式
2.不同的中断处理程序(一个中断线对应多个ISR),dev参数必须唯一,能标识对应的硬件设备
3.中断处理程序需要能够区分它对应的设备是否产生中断,即当前中断线信号到来,该程序必须能判断是否由自己负责的设备发来的信号请求。
内核收到一个中断后,会依次调用该中断线上注册的每个处理程序,如果与处理程序相关的设备并没有产生中断,则立即退出。