异常和中断

异常和中断

    • 1. 异常:硬件、系统和应用的组合拳
    • 2. 异常的分类
    • 3. 异常处理

1. 异常:硬件、系统和应用的组合拳

异常是一个硬件和软件组合到一起的 处理过程。异常的前半生,也就是异常的发生和捕捉,是在硬件层面完成的。但异常的后半生,其实是由软件来完成的。

计算机会为每一种可能发生的异常分配一个异常代码(Exception Number)。也称为中断向量(Interrupt Vector)。异常发生的时候,CPU 检测到一个特殊的信号。这些信号一般叫做发生了一个事件(Event)。CPU 在检测到事件的时候,其实也就拿到了对应的异常代码。

这些异常代码里,I / O 发出的信号的异常代码,是由操作系统来分配的,也就是由软件来设定的。而像加法溢出这样的异常代码,则是由 CPU 预先分配好的,也就是有硬件来分配的。

拿到异常代码以后,CPU 就会触发异常处理的流程。计算机在内存里会保留一个异常表(Exception Table)。也称为中断向量表(Interrupt Vector Table)。这个异常表里面存放的是不同的异常代码对应的异常处理程序(Exception Handler)所在的地址。

CPU 在拿到了异常码之后,会把当前的程序执行的现场,保存到程序栈里面,然后会根据异常码查询,找到对应的异常处理程序,最后把后续指令执行的指挥权,交给这个异常处理程序。

异常和中断_第1张图片

2. 异常的分类

异常可分为 中断、陷阱、故障 和 中止

  1. 中断(Interrupt)。程序在执行到了一半的时候,被打断了。这个打断执行的信号,来自于 CPU 的外部 I / O 设备。
  2. 陷阱(Trap)。程序员“故意”主动触发的异常。比如应用程序调用系统调用。
  3. 故障(Fault)。陷阱是我们开发程序的时候刻意触发的异常,而故障不是。比如进行加法计算的时候发生了溢出,就是故障类型的异常。
  4. 中止(Abort)。当 CPU 遇到了故障,但是恢复不过来的时候,程序就不得不中止了。

异常和中断_第2张图片

3. 异常处理

异常处理流程:保存现场、异常代码查询、异常处理程序调用。

而中止类型的异常,其实是在故障类型异常的一种特殊情况。当故障发生,但是我们发现没有异常处理程序能够处理这种异常的情况下,程序就不得不进入中止状态,也就是最终会退出当前的程序执行。

  1. 异常情况往往发生在程序正常执行的预期之外,比如中断、故障发生的时候。除了本来程序压栈要做的事情之外,我们还需要把 CPU 内当前运行程序用到的所有寄存器,都放到栈里面。最典型的就是条件码寄存器里面的内容。
  2. 像陷阱这样的异常,涉及程序指令在用户态和内核态之间的切换。对应压栈的时候,对应的数据是压到内核栈里,而不是程序栈里。
  3. 像故障这样的异常,在异常处理程序执行完成之后。从栈里返回出来,继续执行的不是顺序的下一条指令,而是故障发生的当前指令。因为当前指令因为故障没有正常执行成功,必须重新去执行一次。

此文章为2月Day2学习笔记,内容来源于极客时间《深入浅出计算机组成原理》

你可能感兴趣的:(计算机组成原理,学习)