中断
一、中断简介
1.1 中断和陷入
1.1.1 中断
中断是指CPU对I/O设备发来的中断信号的一种相应。CPU暂停正在执行的程序,保留CPU环境后,自动地去执行该I/O设备的中断处理程序。执行完后,再回到断点,继续执行原来的程序。I/O设备可以是字符设备,也可以是块设备、通信设备等。由于中断是由外部设备引起的,故又称外部中断
1.1.2 陷入
另外还有一种由CPU内部事件所引起的中断,例如进程在运算中发生了上溢或下溢,又如程序出错,如非法指令、地址越界、以及电源故障等。通常把这类中断称为内中断或陷入(trap)。与中断一样,若系统发现了有陷入事件,CPU也将暂停正在执行的程序,转去执行该陷入事件的处理程序。中断和陷入的主要区别是信号的来源,即是来自CPU外部,还是CPU内部。
1.2 中断向量表和中断优先级
(待补充/200)
1.3 对多中断源的处理方式
(待补充/200)
二、中断处理程序
当一个进程请求I/O操作时,该进程将被挂起,直到I/O设备完成I/O操作后,设备控制器便向CPU发送一个中断请求,CPU响应后便转向中断处理程序,中断处理程序执行相应的处理,处理完后解除相应进程的阻塞状态。
中断处理程序的处理过程可分为以下几个步骤:
1. 测定是否有未响应的中断信号:
每当设备完成一个字符(字或数据块)的读入(或输出),设备控制器便向处理机发送一个中断请求信号。请求处理机将设备已读入的数据传送到内存的缓冲区中(读入),或者请求处理机将要输出的数据(输出)传送给设备控制器。程序每当执行完当前指令后,处理机都要测试是否有未响应的中断信号。若没有,继续执行下一条指令。若有,则停止原有进程的执行,准备转去执行中断处理程序,为把处理机的控制权交给中断处理程序做准备。
2. 保护被中断进程的CPU环境:
在把控制权交给中断处理程序之前,需要先保护被中断进程的CPU环境,以便以后能恢复运行。首先需要保存的是,从中断现场恢复到当前进程运行所需要的信息。通常由硬件自动将处理机状态字(PSW)和保存在程序计数器(PC)中下一条指令的地址保存在中断保留区(栈)中。然后,把被中断进程的CPU现场信息,即将包括所有CPU寄存器的(如通用寄存器、段寄存器等)内容都压入中断栈中。因为在中断处理时可能会用到这些寄存器。下图给出了一个简单的保护中断现场的示意图。该程序是指令在N位置时被中断的,程序计数器中的内容为N+1,所有寄存器的内容都被保留在栈中。
3. 转入相应的设备处理程序:
由处理机对各个中断源进行测试,以确定引起本次中断的I/O设备,并向提供中断信号的设备发送确认信号。在该设备收到确认信号后,就立即取消它所发出的中断请求信号。然后,将相应的设备中断处理程序的入口地址装入到程序计数器中。这样,当处理机运行时,便可自动地转向中断处理程序。
4. 中断处理:
对不同的设备,有不同的中断处理程序。该程序首先从设备控制器中读出设备状态,以判别本次中断是正常完成中断还是异常结束中断。若是前者,中断程序便做出结束处理。假如这次是字符设备的读操作,则来自输入设备的中断是表明该设备已经读入了一个字符(字)的数据,并已放入数据寄存器中。此时中断处理应该将该数据传送给CPU,再将它存入缓冲区中,并修改相应的缓冲区指针,使其指向下一个内存单元。若还有命令,可再向控制器发送新的命令,进行新一轮的数据传送。若是异常结束中断,则根据发生异常的原因做相应的处理。
5. 恢复CPU的现场并退出中断:
当中断处理完成以后,需要恢复CPU的现场,退出中断。但是,此刻是否返回到被中断的进程,取决于两个因素:
- 本中断是否采用了屏蔽(禁止)中断方式,若是,就会返回被中断的进程
- 采用的是中断嵌套方式,如果没有优先级更高的中断请求I/O,在中断完成后,仍会返回被中断的进程;反之,系统将处理优先级更高的中断请求。
如果是要返回到被中断的进程,可将保存在中断栈中的被中断进程的现场信息取出,并装入到相应的寄存器中,其中包括该程序下一次要执行的指令的地址N+1、处理机状态字PSW,以及各通用寄存器和段寄存器的内容。这样,当处理机再执行本程序时,便从N+1处开始,最终返回到被中断的程序。
整个中断的处理流程如下图所示:
I/O操作完成后,驱动程序必须检查本次I/O操作中是否发生了错误,并向上层软件报告,最终向调用者报告本次I/O的情况。除了上述的第4步外,其他各步骤对所有I/O设备都是相同的,因而对于某种操作系统,例如UNIX系统,是把这些共同的部分集中起来,形成中断总控程序。每当要进行中断处理时,都要首先进入中断总控程序。而对于第4步,则对不同设备采用不同的设备中断处理程序继续执行。