异常和中断的主要功能

  1. 实现CPU与I/O设备的并行工作
  2. 处理硬件故障和软件错误
  3. 实现人机交互,用户干预机器需要用到中断系统
  4. 实现多道程序、分时操作,多道程序的切换需借助于中断系统
  5. 实时处理需要借助中断系统来实现快速响应
  6. 实现应用程序和操作系统(管态程序)的切换,称为“软中断”
  7. 多处理器系统中各处理器之间的信息交流和任务切换

异常

由CPU内部产生的意外事件被称为异常,也称内中断。
异常是CPU执行一条命令时,由CPU在其内部检测到的,与正在执行的指令相关的同步事件。

异常的分类

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

故障(Fault)

在引起故障的指令启动后,执行结束前被检测到的异常事件。

指令译码时,出现“非法操作码”

取数据时,发生“缺段”或“缺页”

执行整数除法指令时,发现“除数为零”

该异常属于程序性异常(软件中断)

自陷(Trap)

自陷也称陷阱或陷入,它是预先安排的一种“异常”事件,当自陷指令是转移指令时,并不是返回到下一条指令执行,而是返回到转移目标指令执行。例如

系统调用指令

条件自陷指令

该异常属于程序性异常(软件中断)

终止(Abort)

在执行指令过程中发生了使计算机无法继续执行的硬件故障,此时,程序将无法继续执行,只能终止。这种异常与故障和自陷不同,不是由特定指令产生的,而是随机发生的。

该异常属于硬件中断

中断

由来自CPU外部的设备向CPU发出的中断请求被称为中断,通常用于信息的输入和输出,也称外中断。

中断是一种典型的由外部设备触发的,与当前正在执行的指令无关的异步事件。

CPU每执行完一条指令就检查中断请求信号线,如果检测到中断请求,则进入中断响应周期。

中断的分类

可屏蔽中断

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

不可屏蔽中断

通过专门的不可屏蔽中断请求先NMI向CPU发出的中断请求,这类中断请求囊括不可被屏蔽。

中断和异常间两个重要的不同点

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

异常和中断的相应过程

CPU对异常和中断响应的过程可分为:关中断、保存断点和程序状态、识别异常和中断并转到相应的处理程序。这些过程被称作中断隐指令

1. 关中断

在保存断点和程序状态期间不能被新的中断打断,因此要禁止响应新的中断,即关中断。

2. 保存断点和程序状态

为了能在异常和中断处理后正确返回到被中断的程序继续执行,必须将程序的断点(返回地址)保存在栈中。

异常和中断处理后可能还要回到被中断的程序继续执行,被中断时的程序状态字寄存器PSWR的内容也需要保存在栈中,在异常和中断返回时恢复到PSWR中。

注意:异常指令通常并没有执行成功,异常处理后要重新执行,所以其断点是当前指令地址,中断的断点则是下一条指令的地址。

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

异常和中断源的识别有软件识别和硬件识别两种方式。

异常大多采用软件识别方式,而中断可以采用软件识别方式或硬件识别方式。

软件识别方式指CPU设置一个异常状态寄存器,用于记录异常原因。操作系统使用一个统一的异常或中断查询程序,按优先级顺序查询异常状态寄存器,以检测异常和中断类型,先查询到的先被处理,然后转到内核中相应的处理程序。
硬件识别方式又称向量中断,异常或中断处理程序的首地址称为中断向量。所有中断向量都存放在中断向量表中。每个异常或中断都被指定一个中断类型号。在中断向量表中,类型号和中断向量一一对应,将相对应的中断向量送入程序计数器PC,进而执行对应的中断服务程序。

中断处理过程

1. 关中断

2. 保存断点和程序状态

3. 中断服务程序寻址

4. 保存现场和屏蔽字

进入中断服务程序后首先要保存现场和中断屏蔽字,现场信息指用户可见的工作寄存器的内容,它存放着程序执行到断点处的现行值。

注意:现场和断点这两类信息都不能被中断服务程序破坏,现场信息因为用指令可直接访问,所以通常在中断服务程序中通过指令把他们保存到栈中,即由软件实现;而断点信息由CPU在中断响应时自动保存到栈或指定寄存器中,即由硬件实现。

5. 开中断

允许更高级的中断请求得到响应,实现中断嵌套。

6. 执行中断服务程序

7. 关中断

保证在恢复现场和屏蔽字时不被中断。

8. 恢复现场和屏蔽字

将现场和屏蔽字恢复到原来状态。

9. 开中断、中断返回

中断服务程序的最后一条指令通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序。