简介
错误中断处理是指处理机调用相关的中断处理程序处理当前错误。计算机中错误有多种,如除零、地址越界等等。在这些错误中,有些错误违反了处理器架构中的保护措施,称为一般保护错误(General protection fault,GPF),是在英特尔x86和AMDx86-64架构和其它架构中的一种错误(或者一种中断),指正在运行的程序(内核或用户态程序)违反处理器架构中的保护措施的情况。
根据错误中断时 CPU 的活动轨迹。还可进一步把错误中断分为外中断和内中断。所谓外中断,是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;而内中断则是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)、电源故障等。内中断(trap)也被译为“捕获”或“陷入” 。通常,陷入是由于执行了现行指令所引起的;而中断则是由于系统中某事件引起的,该事件与现行指令无关。由于系统调用引起的中断属于内中断,因此把由于系统调用引起中断的指令称为陷入指令。
错误中断处理过程唤醒被阻塞的驱动(程序)进程当中断处理程序开始执行时,首先去唤醒处于阻塞状态的驱动(程序)进程。如果是采用了信号量机制,则可通过执行 signal 操作,将处于阻塞状态的驱动(程序)进程唤醒;在采用信号机制时,将发送一信号给阻塞进程。
保护被中断进程的 CPU 环境通常由硬件自动将处理机状态字 PSW 和程序计数器(PC)中的内容,保存在中断保留区(栈)中,然后把被中断进程的 CPU 现场信息(即包括所有的 CPU 寄存器,如通用寄存器、段寄存器等内容)都压入中断栈中,因为在中
断处理时可能会用到这些寄存器。图1给出了一个简单的保护中断现场的示意图。该程序是指令在 N 位置时被中断的,程序计数器中的内容为 N+1,所有寄存器的内容都被保留在栈中。
转入相应的设备处理程序由处理机对各个中断源进行测试, 以确定引起本次中断的 I/O 设备, 并发送一应答信号给发出中断请求的进程,使之消除该中断请求信号,然后将相应的设备中断处理程序的入口地址装入到程序计数器中,使处理机转向中断处理程序。
中断处理对于不同的设备,有不同的中断处理程序。该程序首先从设备控制器中读出设备状态,以判别本次中断是正常完成中断,还是异常结束中断。若是前者,中断程序便进行结束处理;若还有命令,可再向控制器发送新的命令,进行新一轮的数据传送。若是异常结束中断,则根据发生异常的原因做相应的处理。
恢复被中断进程的现场当中断处理完成以后,便可将保存在中断栈中的被中断进程的现场信息取出,并装入到相应的寄存器中, 其中包括该程序下一次要执行的指令的地址 N+1、 处理机状态字 PSW,以及各通用寄存器和段寄存器的内容。这样,当处理机再执行本程序时,便从 N+1 处开始,最终返回到被中断的程序。
I/O 操作完成后,驱动程序必须检查本次 I/O 操作中是否发生了错误,并向上层软件报告,最终向调用者报告本次 I/O 的执行情况。除了上述的第 4 步外,其它各步骤对所有 I/O设备都是相同的,因而对于某种操作系统,例如 UNIX 系统,是把这些共同的部分集中起来,形成中断总控程序。每当要进行中断处理时,都要首先进入中断总控程序。而对于第 4 步,则对不同设备须采用不同的设备中断处理程序继续执行。图2给出了中断处理流程。
中断计算机科学中,中断(Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种运行信息切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是即时系统中尤为有用。这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。
硬件中断(Hardware Interrupt)可屏蔽中断(maskable interrupt)。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。
非可屏蔽中断(non-maskable interrupt,NMI)。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。
处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。
伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。
软件中断(Software Interrupt)软件中断。是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)。
处理器通常含有一个内部中断屏蔽位,并允许通过软件来设定。一旦被设定,所有外部中断都将被系统忽略。这个屏蔽位的访问速度显然快于中断控制器上的中断屏蔽寄存器,因此可提供更快速地中断屏蔽控制。
如果一个中断使得机器处于一种确定状态,则称为精确中断(precise interrupt)。精确中断须保证:
程序计数器的值被保存在已知位置。
程序计数器所指向的指令之前的所有指令已被执行完毕。
程序计数器所指向的指令之后的所有指令不可被执行。如果中断信号到来后而转入处理前发生了任何针对寄存器/内存的更改,都必须予以还原。
程序计数器所指向的指令地执行状态已知。
倘无法满足以上条件,此中断被称作非精确中断(imprecise interrupt)。
中断尽管可以提高计算机处理性能,但过于密集的中断请求/响应反而会影响系统性能。这类情形被称作中断风暴(interrupt storm)。