cpu 如何检测执行过程中的异常?

how cpu detect exceptions during execution?

如何在管道执行期间CPU知道它正在执行的指令有一些异常以及需要调用哪个处理程序。谁用那个处理程序地址更新电脑?

如何检测和处理异常的内部实现细节当然特定于每个不同的微体系结构。

一个非常普遍的事情是精确的异常处理(在执行之前执行所有内容,在异常之后不执行)需要按顺序退出指令,即使在乱序 CPU。如果您让一条指令在后面的指令之前提交并离开无序核心,那么如果后面的指令出现异常,您将无法将其回滚。

这在有序 CPU 中很容易发生,但这是乱序 CPU 需要比乱序大的 ROB 的原因- 仍在等待输入的指令的顺序调度程序。

维基百科的经典 RISC 流水线文章在 Exceptions 部分有一些有趣的内容要说,这些内容足够通用,可以应用于典型的有序流水线,而不是特定的实现。

Exceptions are different from branches and jumps, because those other control flow changes are resolved in the decode stage. Exceptions are resolved in the writeback stage. When an exception is detected, the following instructions (earlier in the pipeline) are marked as invalid, and as they flow to the end of the pipe their results are discarded. The program counter is set to the address of a special exception handler, and special registers are written with the exception location and cause.


正如 Margaret 所说,每个不同的异常都分配了一个编号,OS 将处理程序地址放入 table。

例如,在 x86 上,0x06 是无效操作码的异常编号。检测到时,CPU 从 IVT (real mode) or IDT(受保护或 64 位模式)加载条目。

在实际跳转到那里之前,它会将当前 IP/EIP/RIP 和其他异常-return 内容压入内核堆栈。之后,CPU 内部 PC 到处理程序地址。

table的基地址内部存储在CPU(更新为LIDT),但上电默认位置是0000:0000H(物理内存的开始)。

无论如何,table-查找和实际跳转到异常处理程序与管道检测异常的方式完全不同。


在无序的情况下 CPU,如果在推测执行的某些事情中检测到异常(例如,条件分支后的代码),直到知道它是非推测的才真正执行.也就是说,直到分支实际执行并发现它朝着分支预测预测的方向前进。

如果发现 CPU 推测的路径错误,异常将被压缩。