异常和中断机制

2022.08.28

现代计算机中都配有完善的异常和中断处理系统,CPU 的数据通路中有相应的异常检测和响应逻辑,外设接口中有相应的中断请求和控制逻辑,操作系统中有相应的中断服务程序。这些中断硬件线路和中断服务程序有机结合,共同完成异常和中断的处理过程。

异常和中断的基本概念

CPU 内部产生的意外事件被称为异常,有些教材中也称内中断。由来自CPU 外部的设备向 CPU 发出的中断请求被称为中断,通常用于信息的输入和输出,有些教材中也称外中断。异常是CPU 执行一条指令时,由 CPU 在其内部检测到的、与正在执行的指令相关的同步事件;中断是一种典型的由外部设备触发的、与当前正在执行的指令无关的异步事件。

CPU内部,异常/内中断,同步事件;

CPU外部,中断/外中断,异步事件;

异常和中断处理过程的大致描述如下:当 CPU 在执行用户程序的第i条指今时检测到一个异常事件,或者在执行第i条指令后发现一个中断请求信号,则 CPU 打断当前用户程序然后转到相应的异常或中断处理程序去执行。若异常或中断处理程序能够解决相应的问题,则在异常或中断处理程序的最后,CPU 通过执行异常或中断返回指令,回到被打断的用户程序的第 i条指令或第i+1条指令继续执行:若异常或中断处理程序发现是不可恢复的致命错误,则终止用户程序。通常情况下,对异常和中断的具体处理过程由操作系统(和驱动程序)完成。

异常和中断的处理过程基本是相同的,这也是有些教材将两者统称为中断的原因。

异常和中断的分类

  1. 异常的分类 异常是由 CPU 内部产生的意外事件,分为硬故障中断和程序性异常。

    硬故障中断是由硬连线出现异常引起的,如存储器校验错、总线错误等。

    程序性异常也称软件中断,是指在 CPU 内部因执行指令而引起的异常事件。如整除 0、滥出、断点、单步跟踪、非法指令、栈溢出、地址越界、缺页等。按异常发生原因和返回方式的不同,可分为故障、自陷和终止。

    1. 故障 (Fault) 指在引起故障的指令启动后、执行结束前被检测到的异常事件。例如,指令译码时,出现“非法操作码”;取数据时,发生 “缺段”或“缺页”,执行整数除法指令时,发现“除数为0”等。对于 “缺段”“缺页”等异常事件,经处理后,可将所需的段或页面从磁盘调入主存,回到发生故障的指令继续执行,断点为当前发生故障的指令;对于 “非法操作码”“除数为 0” 等,因为无法通过异常处理程序恢复故障,因此不能回到原断点执行,必须终止进程的执行。

    2. 自陷(Trap) 自陷也称陷阱或陷入,它是预先安排的一种“异常”事件,就像预先设定的“陷阱”样。通常的做法是:事先在程序中用一条特殊指令或通过某种方式设定特殊控制标志来人为设置一个“陷阱”,当执行到被设置了 “陷阱”的指令时,CPU 在执行完自陷指令后,自动根据不同“陷阱”类型进行相应的处理,然后返回到自陷指令的下一条指令执行。注意,当自陷指令是转移指令时,并不是返回到下一条指令执行,而是返回到转移目标指令执行

      在x86 机器中,用于程序调试 “断点设置” 和单步跟踪的功能就是通过陷阱机制实现的。此外,系统调用指令、条件自陷指令(如 MIPS 中的tea、teqi、tne、tei 等)等都属手陷阱指令令,执行到这些指令时,无条件或有条件地自动调出操作系统内核程序进行执行。故障异常和自陷异常属于程序性异常(软件中断)。

    3. 终止 (Abort) 如果在执行指令的过程中发生了使计算机无法继续执行的硬件故障,如控制器出错、存储器校验错等,那么程序将无法继续执行,只能终止,此时,调出中断服务程序来重启系统。这种异常与故障和自陷不同,不是由特定指令产生的,而是随机发生的。终止异常和外中断属于硬件中断

    异常(内中断):

    1. 硬故障中断:存储器校验错、总线错误

    2. 程序性异常/软件中断:如整除 0、溢出、断点、单步跟踪、栈溢出、地址越界

      1. 故障(Fault):(指令译码的)非法指令,(取数据时发生)“缺段”或“缺页”,“除数为0”
      2. 自陷(Trap):(用于程序调试)“断点设置”和“单步跟踪”,“系统调用指令”、“条件自陷指令”如 MIPS 中的tea、teqi、tne、tei 等)
      3. 【硬件】终止(Abort):控制器出错、存储器校验错等
  2. 中断的分类 中断是指来自 CPU 外部、与 CPU 执行指令无关的事件引起的中断,包括 IO 设备发出的IO 中断(如键盘输入、打印机缺纸等),或发生某种特殊事件(如用户按 Esc 键、定时器计数时间到)等。外部IO 设备通过特定的中断请求信号线向 CPU 提出中断请求,CPU 每执行完茶指令就检查中断请求信号线,如果检测到中断请求,则进入中断响应周期。

    中断可分为可屏蔽中断和不可屏蔽中断。

    1. 可屏蔽中断 指通过可屏蔽中断请求线 INTR 向 CPU 发出的中断请求。CPU 可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,被屏蔽的中断请求将不被送到 CPU。

    2. 不可屏蔽中断 指通过专门的不可屏蔽中断请求线 NMI 向 CPU 发出的中断请求,通常是非常紧急的硬件故障,如电源掉电等。这类中断请求信号不可被屏蔽,以让 CPU 快速处理这类紧急事件

    3. 中断和异常在本质上是一样的,但它们之问有以下两个重要的不同点:

      1. “缺页” 或“溢出” 等异常事件是由特定指令在执行过程中产生的,而中断不和任何指令相关联,也不阻止任何指令的完成
      2. 异常的检测由 CPU 自身完成,不必通过外部的某个信号通知 CPU。对于中断,CPU 必须通过中断请求线获取中断源的信息,才能知道哪个设备发生了何种中断。

    中断(外中断):

    1. 可屏蔽中断:INTR
    2. 不可屏蔽中断:NMI;电源掉电

异常和中断响应过程

CPU 执行指令时,如果发生了异常或中断请求,必须进行相应的处理。从 CPU 检测到异常或中断事件,到调出相应的处理程序,整个过程称为异常和中断的响应。CPU 对异常和中断响应的过程可分为:关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序

  1. 关中断

    在保存断点和程序状态期间,不能被新的中断打断,因此要禁止响应新的中断,即关中断。通常通过设置“中断允许”(IF)触发器来实现,若IF置为1,则为开中断,表示允许响应中断:若IF置为0,则表示关中断,表示不允许响应中断。

  2. 保存断点和程序状态

    为了能在异常和中断处理后正确返回到被中断的程序继续执行,必须将程序的断点(返回地址)送到栈或特定寄存器中。通常保存在中,这是为了支持异常或中断的嵌套。异常和中断处理后可能还要回到被中断的程序继续执行,被中断时的程序状态字寄存器PSWR 的内容也需要保存在栈或特定寄存器中,在异常和中断返回时恢复到PSWR中。

  3. 识别异常和中断并转到相应的处理程序

    异常和中断源的识别有软件识别硬件识别两种方式。异常和中断源的识别方式不同,异常大多采用软件识别方式中断可以采用软件识别方式或硬件识别方式。

    软件识别方式是指 CPU 设置一个异常状态寄存器,用于记录异常原因。操作系统使用一个统一的异常或中断查询程序,按优先级顺序查询异常状态奇存器,以检测异常和中断类型,先查询到的先被处理,然后转到内核中相应的处理程序硬件识别方式又称向量中断,异常或中断处理程序的首地址称为中断向量,所有中断向量都存放在中断向量表中。每个异常或中断都被指定一个中断类型号。在中断向量表中,类型号利中断向量一一对应,因而可以根据类型号快速找到对应的处理程序、整个响应过程是不可被打断的。中断响应过程结束后,CPU 就从 PC 中取出中断服务程序的第一条指令开始执行,直全中断返回,这部分任务是由 CPU 通过执行中断服务程序完成的,整个中断处理过程是由软/硬件协同实现的。

例题

  1. 以下关于“自陷”(Trap)异常的叙述中,错误的是( ) A. “自陷”是人为预先设定的一种特定处理事件 B. 可由访管指令或自陷指令的执行进入"自陷" C. 一定是出现某种异常情况才会发生“自陷” D. “自陷“发生后CPU 将进入操作系统内核程序执行

    【答案】:C

  2. 指令执行结果出现异常而引起的中断是()。 A.IO中断 B.机器校验中断 C.程序性中断 D.外部中断

    【答案】:C

  3. 主存故障引起的中断是() A.故障异常 B.程序性中断 C.硬件中断 D. 外中断

    【答案】:A->C

  4. 以下关于异常和中断响应的叙述中,错误的是() A. 异常事件检测由 CPU 在执行每一条指令的过程中进行 B. 中断请求检测由 CPU 在每条指令执行结束、取下条指令之前进行 C. CPU检測到异常事件后所做的处理和检测到中断请求后所做的处理完全相同 D. CPU 在中断响应时会关中断、保存断点和程序状态并转到相应的中断服务程序

    【答案】:C

  5. 以下给出的事件中,无须异常处理程序进行处理的是()。 A.缺页故障 B.Cache 缺失 C.地址越界 D.除数为0

    【答案】:B

  6. 【2015 统考真题】内部异常(内中断)可分为故障(fault )、陷陆(trap)和终止(abort)三类。下列有关内部异常的叙述中,错误的是()。 A.内部异常的产生与当前执行指令相关 B.内部异常的检测由 CPU 内部逻辑实现 C.内部异常的响应发生在指令执行过程中 D.内部异常处理后返回到发生异常的指令继续执行

    【答案】:A->D。D:考虑到特殊情况,如除数为零和自行中断( INT )都会自动跳过中断指令,所以不会返回到发生异常的指令继续执行,故D错误。

  7. 【2016 统考真题】异常是指令执行过程中在处理器内部发生的特殊事件,中断是来自处理器外部的请求事件。下列关于中断或异常情况的叙述中,错误的是(). A."访存时缺页"属于中断 B."整数除以0"属于异常 C."DMA 传送结束"属于中断 D."存储保护错"属于异常

    【答案】:A

  8. 【2020 统考真题】下列关于“自陷”(Trap,也称陷阱)的叙述中,错误的是()。 A. 自陷是通过陷阱指令预先设定的一类外部中断事件 B. 自陷可用于实现程序调试时的断点设置和单步跟踪 C. 自陷发生后CPU 将转去执行操作系统内核相应程序 D. 自陷处理完成后返回到陷阱指令的下一条指令执行

    【答案】:A

  9. 【2021 统考真题】异常事件在当前指令执行过程中进行检测,中断请求则在当前指令执行后进行检测。下列事件中,相应处理程序执行后,必须回到当前指令重新执行的是()。 A.系统调用 B.页缺失 C.DMA 传送结束 D.打印机缺纸

    【答案】:B