异常的发生和捕获是在硬件层面完成的、异常的处理是软件完成的
异常分类
中断Interrupt
触发CPU内部开关值发生变化的信号
陷阱 Trap
主动触发的异常、比如调试断点
故障 Fault
非主动的错误、处理完异常之后回来处理当前指令、而不是去执行程序中的下一条指令
终止 Abort
故障的一直特殊情况、当CPU遇到故障、但无法恢复时、程序就必须终止了
异常处理、上下文切换
1 2 3 4 5 6 7 8
| 类似异常处理函数调用、指令的控制权被切换到另外一个`函数`里、但比函数调用更复杂一些 1. 因为异常情况往往发生在正常执行的预期之外、eg. 中断、故障发生的时候、所以、除了本来程序压桟要做的事情之外、还需要把CPU内当前运行程序用到的所有寄存器都放在桟里边. eg. 条件码寄存器的内容
2. 类似陷阱这种异常、涉及程序指令在用户态和内核态之间的切换、对应压桟的时候、对应数据是压到内核栈、而不是程序桟
3. 类似故障这样的异常、在异常处理执行完成之后、从桟里返回出来、继续执行的不是顺序的下一条指令、而是故障发生的当前指令、因为当前指令因为故障没有正常执行成功、必须重新执行一次
对于异常这样的处理流程、不像是顺序执行的指令间的函数调用关系、更像是两个不同的独立进程之间在CPU层面的切换、称为 `上下文切换`
|