Skip to main content

操作系统

CPU 中断

参考文档:

CPU 运行时可能产生异常,异常分为三种:

  • 故障(Faults):故障是可以纠正的。例如访问内存指令,但段或页不在内存中,这是异常处理会分配内存或者磁盘换入换出。故障发生时,会将原来引起故障的指令压入栈,中断恢复后就执行原指令。
  • 陷阱(Traps):陷阱通常是指令了截获陷阱条件的指令后产生的。通常用于调试目的。例如断点调试。
  • 终止(Aborts):最严重的错误,例如硬件故障、系统表数据不一致等等。这种异常发生时,程序和任务都无法重新启动。例如中断的异常处理时,又引起了异常就会出发双重故障(Double Fault),此时操作系统会任务从系统中移除。

为了处理这些错误,设置一个中断描述符表(IDT,Interrupt Descriptor Table�)来提供异常处理函数。 异常处理函数和通常的函数调用不相同。异常处理可能来自任何一条产生异常的 CPU 指令。函数调用由 call 指令发起,此时 CPU 会去固定的寄存器、或栈、或其他位置获取参数,如何获取是有系统和语言的 ABI 标准来指定的(C 语言函数使用 System V ABI 标准,但 Rust 就不遵循 C ABI)。

当中断和异常发生时,CPU 可能在 ring0 级,也可能在 ring3 级。如果异常处理函数的特权等级和当前特权等级一致时,不会发生栈切换。如果当前特权等级比异常处理函数的等级低,比如从用户态转移到内核态,会发生栈切换。CPU 不允许程序从高特权等级向低等级转移,此时会发生保护异常(#GP)。