异常和中断机制
现代计算机中都配有完善的异常和中断处理系统,CPU的数据通路中有相应的异常检测和响应逻辑,外设接口中有相应的中断请求和控制逻辑,操作系统中有相应的中断服务程序。
异常和中断的基本概念
-
异常(内中断):CPU内部产生的意外事件
异常是CPU执行一条指令时,由CPU在其内部检测到的、与正在执行的指令相关的同步事件
-
中断(外中断):CPU外部的设备向CPU发出的中断请求
中断是一种外部设备触发的、与当前执行的指令无关的异步事件
若异常或中断处理程序发现是不可恢复的致命错误,则终止用户程序。对异常和中断的具体处理过程有操作系统(和驱动程序)完成
异常的分类
异常有:整除0、溢出(浮点数运算的下溢不算)、断点、单步跟踪、非法指令、栈溢出、地址越界、缺页等。按照发生的原因和返回方式不同分为故障、自陷、终止
故障 Fault
指在引起故障的指令启动后、执行结束前被检测到的异常事件。
例如:指令译码时出现“非法操作码”;取数据时发生缺页
或缺段
;执行整数触发指令时发现”除数为0“等
一般处理完故障后回到发生故障的指令开始执行(处理完后不会进入直接进入下一条执行),或终止程序
自陷 Trap
自陷也称为陷阱或陷入,它是一种预先安排的一种“异常”事件。通常的做法是:事先在程序中用一条特殊指令或通过某种方式设定特殊控制标志来人为设置一个陷阱,当CPU执行完自陷指令后,根据不同“陷阱”类型进行相应的处理,然后回到自陷指令的下一条指令(易错)执行
例如:程序调式的“断点设置”、单步追踪;系统调用指令、条件自陷指令、无条件自陷指令(如MIPS中的teq、teqi、tne、tnei)等都属于陷阱指令。执行到这些指令时,无条件或有条件的自动调出操作系统内核程序进行执行
故障异常和自陷异常属于程序性异常(软件中断)
终止 Abort
如果在执行指令的过程发生使计算机无法继续执行的硬件故障,如控制器出错、存储器校验错等,那么程序将无法继续执行,只能终止调出中断服务程序来重启系统。这种异常是随机发生的
终止异常和外中断属于硬件中断
中断的分类
中断包括:IO设备发出的IO中断(如键盘输入、打印机缺纸等),或发生某种特殊事件(如用户按Esc键、定时器计数时间到)。外部IO设备通过特定的中断请求信号线向CPU提出中断请求,CPU每执行完一条指令就检查中断请求信号线,若检测到中断信号则进入中断响应周期
中断可分为可屏蔽中断和不可屏蔽中断
可屏蔽中断
可屏蔽中断指通过请求线INTR向CPU发出中断请求。CPU可通过在中断控制器设置相应的屏蔽字来屏蔽它或不频闭它,被屏蔽的中断请求将不被送到CPU
不可屏蔽中断
指通过专门的不可屏蔽中断请求线NMI向CPU发送的中断请求,通常是非常紧急的硬件故障,如电源掉电。这类中断信号不可被屏蔽
中断和异常的不同点
中断和异常在本质上是一样的,但它们之间有以下两个重要的不同点:
- “缺页”或“溢出”等异常事件是由特定指令执行过程种产生的,而中断不和任何指令相关联,也不阻止任何指令的完成
- 异常的检测是由CPU自身完成的,不必通过外部的某个信号通知CPU;对于中断则必须通过中断请求线获取中断信息源的信息,才能知道哪个设备发生了什么中断
异常和中断响应过程
CPU对异常和中断响应的过程分为:关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序
关中断
在保存断点和程序状态期间,不能被新的中断打断,因此要禁止响应新的中断,即关中断。通常设置PSW种的“IF=0”来实现关中断
保存断点和程序状态
保存程序的断点,要保存PC和PSWR,以保证异常和中断处理后正确返回到被中断的程序继续执行
识别异常和中断并转到相应的处理程序
异常和中断源的识别要有软件识别和硬件识别两种。异常的识别大多采用软件识别方式,而中断可以采用软件识别也可以采用硬件识别
软件识别方式是指CPU设置一个异常状态寄存器,用于记录异常原因。操作系统使用一个统一的异常或中断查询程序,按照优先级顺序查询异常状态寄存器,以检测异常和中断类型,先查询到的先被处理,然后转到内核中相应的处理程序
硬件识别又称为向量中断,异常或中断处理程序的首地址称为中断向量,所有中断向量都放在中断向量表(在内存)中。每个异常或中断都被指定一个中断类型号(不实际存在,类似数组下标),在中断向量表中,类型号和中断向量一一对应。
整个响应的过程是不可被打断的。中断响应结束后,CPU就从PC中取出中断服务程序的第一条指令开始执行,直至中断返回,这部分任务由中断服务程序完成,整个中断处理过程由软硬件偕同完成