计算机在运行过程中,其程序计数器PC的数值从时间轴上看是一个序列:
a0 a1 a2 a3 a4 a5 a6 ....
其中第k个对应于指令Ik的地址,每次从k到k+1 的过程发生控制转移。而这样的序列称为控制流。
如果k到k+1在地址上不连续,那么发生控制突变,通常由于跳转、调用、返回引起。
计算机执行过程中,可能发生三大类型的控制突变,即异常控制流:
- 硬件层面,硬件检查到事件发生,触发控制转移到异常处理程序
- 系统层面,内核通过上下文切换context_switch将控制转移到另一个用户进程中
- 应用层面,一个进程发送信号到另一个进程,接收者可能转移到信号处理程序中
异常:控制流的突变,以响应状态的某种变化
处理器的状态发生一个重大的变化,将发生异常:
- 与正在执行的指令有关:虚拟内存缺页、算术溢出、除0错误等
- 与外部事件有关:一个IO请求完成(相应硬件发出信号)
处理器检测到异常信号时,通过异常表,进行一个过程调用,跳转到异常处理程序。完成异常处理程序后,会出现以下情况:
- 处理程序将控制转移回发生跳转前的指令current
- 处理程序终止被中断的程序
【异常处理】
异常需要处理器(硬件)以及相应的异常处理程序(软件)来共同完成,Linux系统中为每种类型的异常分配了一个非负的异常号。(Exception Number)
其中