异常和中断的基本概念

由 CPU 内部产生的意外事件被称为异常,有些地方也叫做内中断。由来自 CPU 外部的设备向 CPU 发出的中断请求被称为中断,有些地方会称为外中断。异常时 CPU 执行一条指令时,由 CPU 内部检测到的、与正在执行的指令相关的同步事件。中断师一种典型的由外部设备触发的、与当前正在执行的命令无关的异步事件。
异常和中断处理过程的描述基本一致:若 CPU 在执行用户程序的第 i 条指令时检测到一个异常事件/中断请求信号,则 CPU 打断当前程序,然后转去执行相应的异常/中断处理程序。若异常/中断处理程序可以解决相应问题,则在异常/中断处理程序的最后,CPU 通过执行异常/中断返回命令,回到被打断的第 i 条或者第 i+1 条指令继续执行。若若异常/中断处理程序不能解决相应问题,则终止程序。
通常对于异常/中断的具体处理由操作系统完成。

异常的分类

异常分为硬故障异常和程序性异常。硬故障是由硬连线出现的异常引起的,比如存储器校验错、总线错误等。程序性异常也称为软件中断,是指在 CPU 内部因执行指令而引起的异常事件,比如堆栈溢出、除 0、断点、非法指令、地址越界、缺页等。根据异常发生的原因和返回方式的不同,可分为故障、自陷和终止。

异常和中断的相应过程

CPU 对异常/中断的相应过程可分为关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序。

  1. 关中断。在保护断点和程序状态期间,不能被新的中断打断,因此要禁止响应新的中断,即关中断。通常通过设置中断允许触发器(IF)来实现,IF 置 1,则为开中断,置 0 则为关中断。
  2. 保存断点和程序状态。为了在异常/中断处理后正确返回到被中断的程序继续执行,必须将程序的断点送到栈或则特定的寄存器中。通常保存在栈里,这是为了支持异常/中断的嵌套(多重中断)。因为被中断的程序有可能还要继续执行,故被中断是的程序状态字的内容也需要保存,异常/中断返回时,重新恢复到 PSW 中。
  3. 识别异常和中断并转到相应的处理程序。 异常/中断源的识别分为硬件识别和软件识别两种方式。异常一般是软件识别而中断可以采用硬件识别或者软件识别。软件识别一般是 CPU 设置一个异常状态寄存器,记录异常原因。硬件识别也称为向量中断,异常/中断处理程序的首地址被称为中断向量,所有中断向量都存放在中断向量表中,每个异常/中断都会被指定一个异常类型号。在中断向量表中,类型号和中断向量一一对应,可以根据类型号快速找到中断向量。

中断

中断源是请求 CPU 中断的设备或者事件,一台计算机允许有多个中断源。通过 INTR 线发出的是可屏蔽中断,通过 NMI 线发出的是不可屏蔽中断。可屏蔽中断优先级最低,在关中断模式下不被响应。不可屏蔽中断优先级最高,即使在关中断下也被响应。

中断响应优先级是指 CPU 响应中断请求的先后顺序。由于许多中断源提出中断请求的时间都是随机的,因此在多个中断源同时提出请求时,需要通过中断判优逻辑来确定先去响应哪个中断源的请求,一般是通过硬件排队器或者中断查询程序实现。

一般来说,不可屏蔽中断>内部异常>可屏蔽中断;在内部异常中,硬件故障>软件中断;DMA 中断请求>I/O 设备的中断请求;在 I/O 传送类中断中,高速设备>低速设备;输入设备>输出设备;实时设备>普通设备。

中断隐指令自动完成关中断保存断点中断服务程序寻址散步操作。

多重中断和中断屏蔽技术

前面提到了中断优先级,这意味中断也是可以被其他中断打断的,也就是前面提到的中断的嵌套也称之为多重中断。CPU 要具备多重中断的功能,必须具备这些条件:

  1. 在中断服务程序中体检设置开中断指令。
  2. 优先级别高的中断有权打断优先级别低的中断。

中断优先级可以利用中断屏蔽技术动态调整,使中断处理更加灵活。现代计算机中一般都会使用中断屏蔽技术,每个中断源都有一个屏蔽触发器,1 表示屏蔽该中断源的请求,0 表示可以正常请求,所有触发器组合在一起构成一个屏蔽字寄存器,寄存器的内容被称为屏蔽字。