深入理解中断与异常处理机制
1. 异常和中断处理程序的嵌套执行
每一个中断或异常都会引发一个内核控制路径,也就是代表当前进程在内核模式下执行的一系列指令。例如,当一个I/O设备发出中断时,对应的内核控制路径的最初指令是将CPU寄存器的内容保存到内核模式栈中,而最后的指令则是恢复寄存器的内容。
内核控制路径可以任意嵌套,一个中断处理程序可能会被另一个中断处理程序中断,从而导致内核控制路径的嵌套执行,如下图所示:
graph LR A[用户模式进程执行] --> B[中断1触发] B --> C[内核控制路径1开始] C --> D[中断2触发] D --> E[内核控制路径2开始] E --> F[内核控制路径2结束] F --> G[内核控制路径1继续] G --> H[内核控制路径1结束] H --> I[用户模式进程继续执行]允许内核控制路径嵌套的代价是中断处理程序绝不能阻塞,也就是说,在中断处理程序运行期间不能进行进程切换。因为恢复嵌套内核控制路径所需的所有数据都存储在内核模式栈中,而该栈与当前进程紧密绑定。
假设内核没有漏洞,大多数异常只会在CPU处于用户模式时发生,这些异常通常是由编程错误或调试器触发的。然而,“页面错误”异常可能会在内核模式下发生,当进程试图访问属于其地址空间但当前不在RAM中的页面时就会出现这种情况。在处理这种异常时,内核可能会暂停当前进程,并用另一个进程替换它,直到请求的页面可用为止。处理“页面错误”异常的内核控制路径会在进