现代操作系统是中断驱动的。如果没有进程可执行,没有I/O设备可服务,没有用户可响应,那么操作系统就会安静的等待事件的发生。
事件的发生几乎总是通过中断或者陷阱来表征的。
陷阱(trap)或异常(exception)是因错误(如除0、非法访问内存)或者用户程序(执行操作系统服务)的特定请求所引起的软件生成中断。
对于中断,硬件可以随时通过系统总线向cpu发出信号,触发中断。
软件通过执行系统调用的特别操作触发中断。
对于每种类型的中断,操作系统都有一段独立的代码决定采取动作,中断服务子程序负责处理中断。
中断系统中的中断发生后,系统停止响应,并执行中断响应,这个过程就叫系统中断。
所谓中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。
中断可分为三类:
第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。
第二类是来自CPU的内部事件或程序执行中的事件引起的过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。
第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。
前两类通常都称作中断,它们的产生往往是无意、被动的,而陷入是有意和主动的。
中断处理一般分为中断响应和中断处理两个步骤。
中断响应由硬件实施,中断处理主要由软件实施。
(1)中断响应
对中断请求的整个处理过程是由硬件和软件结合起来而形成的一套中断机构实施的。发生中断时,CPU暂停执行当前的程序,而转去处理中断。这个由硬件对中断请求作出反应的过程,称为中断响应。一般说来,中断响应顺序执行下述三步动作:
◆中止当前程序的执行;
◆保存原程序的断点信息(主要是程序计数器PC和程序状态寄存器PS的内容);
◆从中断控制器取出中断向量,转到相应的处理程序。
通常CPU在执行完一条指令后,立即检查有无中断请求,如果有,则立即做出响应。
当发生中断时,系统作出响应,不管它们是来自硬件(如来自时钟或者外部设备)、程序性中断(执行指令导致“软件中断”—Software Interrupts),或者来自意外事件(如访问页面不在内存)。
如果当前CPU的执行优先级低于中断的优先级,那么它就中止对当前程序下条指令的执行,接受该中断,并提升处理机的执行级别(一般与中断优先级相同),以便在CPU处理当前中断时,能屏蔽其它同级的或低级的中断,然后保存断点现场信息,通过取得的中断向量转到相应的中断处理程序的入口。
(2)中断处理
CPU从中断控制器取得中断向量,然后根据具体的中断向量从中断向量表IDT中找到相应的表项,该表项应是一个中断门。于是,CPU就根据中断门的设置而到达了该通道的总服务程序的入口。
核心对中断处理的顺序主要由以下动作完成:
◆保存正在运行进程的各寄存器的内容,把它们放入核心栈的新帧面中。
◆确定“中断源”或核查中断发生,识别中断的类型(如时钟中断或盘中断)和中断的设备号(如哪个磁盘引起的中断)。系统接到中断后,就从机器那里得到一个中断号,它是检索中断向量表的位移。中断向量因机器而异,但通常都包括相应中断处理程序入口地址和中断处理时处理机的状态字。
◆核心调用中断处理程序,对中断进行处理。
◆中断处理完成并返回。中断处理程序执行完以后,核心便执行与机器相关的特定指令序列,恢复中断时寄存器内容和执行核心栈退栈,进程回到用户态。如果设置了重调度标志,则在本进程返回到用户态时做进程调度。
中断必须将控制转移到合适的中断服务程序,处理这种转移最简单的方法是调用一个通用子程序以检查中断信息,接着,该子程序调用相应的中断处理程序。
处理中断必须要快,通过使用中断处理子程序的指针表可间接调用中断处理子程序,而不需要其他中间子程序。通常指针表位于低内存地址(前一百左右的位置)这些位置包含各种设备中断处理子程序的地址(即中断向量).中断向量对于给定的中断请求通过唯一设备号来索引,以提供设备的中断处理子程序的地址。
中断体系结构也保持被中断指令的地址(系统堆栈中存储返回地址),处理中断后,保存的返回地址会装入程序计数器,被中断的计算可以重新开始,就好像中断没有发生过一样。