什么是异常
「现代操作系统」和国内的教材都没有讲清楚「中断、异常」这一组概念,再加上自己懒,一直没弄出个所以然,今天看了CSAPP上的解释,醍醐灌顶。
对于特定的进程来说,程序计数器按照时间升序所得的序列反映了指令的执行顺序,即控制流。理论上说,程序的控制流在编译期就已经决定。而实际中,经常会出现一些需要暂停执行当前程序,而转去处理更高优先级任务的情况。在这个过程中,程序的控制流就发生了改变。CSAPP中把控制流的非自愿改变定义为异常。强调非自愿,是因为程序自己也可以改变控制流,但那不属于异常。
异常按照类型可以分为四类
- 中断(Interrupt)
- 自陷(Trap)
- 错误(Fault)
- 中止(Abort)
发生异常时,CPU会根据某种规则来执行对应的处理程序。根据异常类型的不同,处理的结果也不尽相同。
中断
中断指,在程序执行过程中,因为外部事件导致当前控制流被改变。因为外部事件的不确定性,中断信号可能会在指令执行的任意阶段发生,因此也称中断具有异步性
典型的例子有:DMA传输完成,键盘敲击等。
自陷
自陷指,在程序执行过程中,需要请求操作系统提供的服务而发生的自愿性中断。普通程序在用户态运行,当需要进行I/O时,它通过自陷,转入内核态,由操作系统执行对应的I/O指令。
IA32中提供int 80
指令触发自陷
错误
错误指,在指令执行过程中,出现了某些错误,导致当前指令无法继续执行。但错误可能可以恢复。处理程序处理完成后,可以尝试重现执行出错的指令。如缺页错误(Page fault)。
中止
中止是指,执行过程中发生了不可恢复的错误,这时管理权被交给OS,典型情况下,OS会杀死出错的进程,转而调度其他进程执行。例如内存越界(Access violation)