我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们就来简单的聊一聊。
在此啰嗦一句(仅为自己记录需要^_^,与本主题无多大关系),异常是位于硬件和操作系统交界的部分,系统调用是为应用程序提供到操作系统的入口点的异常,而进程和信号位于应用和操作系统的交界处。
现在正式开始。
异常说白了就是控制流中的突变,用来响应处理器状态中的某些变化。在处理器中,状态被编码成了不同的位和信号。状态变化就被称为事件,事件可能和当前指令的执行直接相关,例如发生虚拟存储器缺页、算术溢出等,但也可能和当前指令无关,比如一个系统定时器产生信号或者一个I/O请求完成。
异常可分为四类:中断、陷阱、故障、终止,它们的区别如下表:
[table]
| 类别 | 原因 | 同步/异步 | 返回行为 |
|中断 |来自I/O设备的异常 | 异步 | 下一条指令 |
|陷阱 |有意的异常 | 同步 | 下一条指令 |
|故障 |潜在可恢复错误 | 同步 | 可能返回当前指令 |
|终止 |不可恢复错误 | 同步 | 不会返回 |
[/table]
当处理器在任意时刻检测到有事件发生时,它就会通过一张叫做异常表的跳转表,其会在系统启动时由操作系统分配和初始化,跳转表里面存有异常号和其对应的异常处理程序,异常号是到异常表中的索引,而异常表的起始地址放在一个叫做异常表基址寄存器的特殊cpu寄存器里。异常触发时就利用异常号来进行一个间接过程调用,调用一个专门用来处理这类事件的操作系统子程序,即异常处理程序。当异常处理程序完成处理后,就会根据引起异常事件的类型,执行相应操作,即将控制权返回给事件发生时正在执行的指令或下一条指令,或直接终止被中断的程序。
在此啰嗦一句(仅为自己记录需要^_^,与本主题无多大关系),异常是位于硬件和操作系统交界的部分,系统调用是为应用程序提供到操作系统的入口点的异常,而进程和信号位于应用和操作系统的交界处。
现在正式开始。
异常说白了就是控制流中的突变,用来响应处理器状态中的某些变化。在处理器中,状态被编码成了不同的位和信号。状态变化就被称为事件,事件可能和当前指令的执行直接相关,例如发生虚拟存储器缺页、算术溢出等,但也可能和当前指令无关,比如一个系统定时器产生信号或者一个I/O请求完成。
异常可分为四类:中断、陷阱、故障、终止,它们的区别如下表:
[table]
| 类别 | 原因 | 同步/异步 | 返回行为 |
|中断 |来自I/O设备的异常 | 异步 | 下一条指令 |
|陷阱 |有意的异常 | 同步 | 下一条指令 |
|故障 |潜在可恢复错误 | 同步 | 可能返回当前指令 |
|终止 |不可恢复错误 | 同步 | 不会返回 |
[/table]
当处理器在任意时刻检测到有事件发生时,它就会通过一张叫做异常表的跳转表,其会在系统启动时由操作系统分配和初始化,跳转表里面存有异常号和其对应的异常处理程序,异常号是到异常表中的索引,而异常表的起始地址放在一个叫做异常表基址寄存器的特殊cpu寄存器里。异常触发时就利用异常号来进行一个间接过程调用,调用一个专门用来处理这类事件的操作系统子程序,即异常处理程序。当异常处理程序完成处理后,就会根据引起异常事件的类型,执行相应操作,即将控制权返回给事件发生时正在执行的指令或下一条指令,或直接终止被中断的程序。