前言:
我们知道CPU从通过总线从内存中取指令,程序计数器寄存器指示了CPU将执行下一条指令的地址。我们把程序计数器中存放的指令地址按时间顺序排成一个序列,这个序列叫做CPU的控制流。两条连续的指令之间的过渡称为控制转移。
最简单的控制流是平滑流,也就是连续指令在内存中是相邻存放的。平滑流的突变(时间上连续的指令在空间上不连续),叫做异常控制流,异常控制流通常是由跳转、调用和返回等程序指令造成的。实际上,异常控制流可以发生在计算机系统的各个层次,这里不做展开。
下面总结了一些概念和问题,帮助大家理解。
什么是异常?
• 异常是异常控制流的一种形式,一部分由硬件实现,一部分有操作系统实现。
• 处理器状态中的变化(称为事件)触发从应用程序到异常处理程序的突发控制转移(异常)。在异常程序完成处理后,它将控制返回给被中断的程序或者终止
哪些情况会引起异常?
• 事件的发生引起异常。
• 事件可能和当前指令的执行直接相关:比如虚拟内存缺页、算术溢出、除零等情况;
• 事件也可能和当前指令的执行没关系:比如系统调用,来自外部I/O设备的信号、I/O请求的完成等等。
怎么处理异常?
当处理器检测到事件发生,会通过一张叫做异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序(或者叫异常处理程序)。当异常处理程序完成处理后,根据引起异常的事件的类型,执行三种不同情况的操作:1.执行Icurr 2.执行Inext 3.终止程序。
如何实现异常表?
系统中可能的每种类型的异常都分配了一个唯一的非负整数异常号。CPU中异常表基址寄存器存放异常表的起始地址,用起始地址加上异常号就能跳转到不同地址的异常处理程序。
异常和过程调用有何不同?
• 1. 返回地址可能不同;
• 2. 异常处理时处理器会把额外的处理器状态压到栈中;
• 3. 如果控制从用户程序转移到内核,则处理器状态以及返回地址等会被压到内核栈中,而不是用户栈;
• 4. 如果异常处理程序运行在内核模式下,这意味着它们对所有的系统资源都有完全的访问权限。