一、为什么要引入中断?
- 任何操作系统内核的核心任务,都包含有对连接到计算机上的硬件设备进行有效管理,如硬盘、蓝光碟机、键盘、鼠标、3D 处理器,以及无线电等。而想要管理这些设备,首先要能和它们互通音信才行。众所周知,
**处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然差强人意。**既然硬件的响应这么慢,那么内核就应该在此期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来对它进行处理
- 那么到底如何让处理器和这些外部设备能协同工作,且不会降低机器的整体性能呢?
**轮询 (polling) 可能会是一种解决办法。**它可以让内核定期对设备的状态进行查询,然后做出相应的处理。不过这种方法很可能会让内核做不少无用功,因为无论硬件设备是正在忙碌着完成任务还是已经大功告成,
轮询总会周期性地重复执行
- 更好的办法是由我们来提供一种机制,让硬件在需要的时候再向内核发出信号(变内核主动为硬件主动)。
这就是中断机制
二、中断
- **中断使得硬件得以发出通知给处理器。**例如,在你敲击键盘的时候,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下
- 中断本质上是一种特殊的电信号,由硬 件设备发向处理器。处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步——
换句话说就是中断随时可以产生。因此,内核随时可能因为新到来的中断而被打断
中断的物理本质——电信号
- 从物理学的角度看,
**中断是一种电信号,**由硬件设备生成,并
直接送入中断控制器的输入引脚中——中断控制器是个简单的电子芯片,其作用是将多路中断管线,采用复用技术只通过一个和处理器相连接的管线与处理器通信
- **当接收到一个中断后,中断控制器会给处理器发送一个电信号。**处理器一经检测到此信号,便中断自己的当前工作转而处理中断。此后,处理器会通知操作系统已经产生中断,这样,操作系统就可以对这个中断进行适当地处理了
三、中断号(IRQ)
- **不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志。**因此,来自键盘的中断就有别于来自硬盘的中断,从而使得操作系统能够对中断进行区分,并知道哪个硬件设备产生了哪个中断。这样,操作系统才能给不同的中断提供对应的中断处理程序
- **这些中断值通常被称为中断请求(IRQ)线。**每个IRQ线都会被关联一个数值量一一例如,在经典的PC机上,IRQ 0是时钟中断,而 IRQ 1是键盘中断
- 但并非所有的中断号都是这样严格定义的。例如,对于连接在PCI总线上的设备而言,
**中断是动态分配的。**而且其他非PC的体系结构也具有动态分配可用中断的特性
- **重点在于特定的中断总是与特定的设备相关联,**并且内核要知道这些信息
- 实际上,硬件发出中断是为了引起内核的关注,例如:嗨 ,我有新的按键等待处理呢,读取并处理这些调皮鬼吧!
四、中断与异常的关系与区别
- 在操作系统中,讨论中断就不能不提及异常
- 异常与中断不同,
**它在产生时必须考虑与处理器时钟同步。**实际上,
**异常也常常称为同步中断。**在处理器执行到由于编程失误而导致的错误指令(如被除0除)的时候,或者是在执行期间出现特殊情况(如缺页),必须靠内核来处理的时候,处理器就会产生一个异常。因为许多处理器体系结构处理异常与处理中断的方式类似,因此,内核对它们的处理也很类似
- 本人的这些文章对中断(由硬件产生的异步中断)的讨论,大部分也适合于异常(由处理器本身产生的同步中断)
- 你已经熟悉一种异常:在前面讲述系统调用的时候(https://www.daimajiaoliu.com/series/linux_kernel/47981925e9003fe )已经提过,在x86体系结构上如何通过软中断实现系统调用,
那就是陷入内核,然后引起一种特殊的异常——系统调用处理程序异常。你会看到,中断的工作方式与之类似,其
差异只在于中断是由硬件而不是软件引起的