
Essay2026 / 04 / 19
ECF-异常与进程
1-异常(exception)
我们先来回答这么几个问题,为什么要有异常,以及什么是异常,以及异常的工作机制
1.1-Why we need exception
在底层CPU中我们已经知道它通过流水线,乱序执行等等技术勤勤恳恳地执行我们的指令。但问题在于,你无法保证CPU执行这个instruction flow的过程中哪一步出错或者异常情况(如除以0,缺页),即正常的流可能遇到突发问题。而在整个计算机体系结构内,底层CPU上一层为 操作系统(operating system) .那么对于这种突发在流内的事件(event),OS与底层CPU之间必须能够协调响应这些事件,来保证安全性效率等等.这也就是exception这个概念为什么要出现的原因
1.2-What is exception
那么什么是异常(exception)呢.异常就是为了响应这些”事件”,将控制权转移到OS的控制转移(control transfer).它就是一套机制用来CPU与操作系统之间同步事件的通知机制.它会打断你的程序的正常执行跳转到 **操作系统内核(kernal)**中的特定处理函数,在执行完毕后决定是否返回继续执行你的程序.注意exception是存在于CPU与操作系统之间的一套机制,对于我们的prgram来说是不可见的,我们将会在后面的signal讲到我们program如何看见.
英文定义原文: A transfer of control to OS kernal in response to some events
1.3-How exception works
在CSAPP内,exception分为四种.但准确来说interrupt直接算interrupt而不是exception
- Interrupt 异步的,产生于非CPU的其他硬件
- Trap 同步的,主要就是在用户与内核的系统调用.处理完成返回到下一条指令执行
- Fault 同步的,由故障情况引起.一般可以修正.处理完成返回到原指令执行.但如果无法修正则会到abort这种情况.
- Abort 同步的,由不可恢复的致命错误引起.发生后控制权不会被交会给程序,而是终止程序
整个exception的工作流程为
- CPU检测到异常 如除以0,缺页,无效操作码,系统调用指令.这些会在电气层面触发CPU检测到异常情况
- 查找异常处理程序入口 CPU内有寄存器IDTR(Interrupt Description Table register).其指向内存中的OS kernal维护的跳转表IDT(Interrupt Description Table).CPU内通过异常编号等计算出相应exception的处理程序地址.
- 保存上下文 CPU会将当前进程的上下文压入栈中.其中如果控制权从用户转移到内核则压入内核栈中而非用户栈.
- 跳转执行 此时CPU跳转至内存中的异常处理程序的位置开始读指令执行.
- 控制转移 根据exception的类型以及处理结果,内核程序如果将控制权转移回程序,就会恢复此前在栈中保存的上下文信息.如果步转移那么就会终止程序.