精确异常与非精确异常

来自Jack's Lab
跳转到: 导航, 搜索

这里的异常是指同步的 (Synchronous),非异步的中断。

非精确异常 (Imprecise Exception)

在多发射乱序执行的流水线 CPU 上,从指令进入流水线到异常事件的发生,期间要经过若干流水级,此时 PC 的值已指向其后的某条指令,在实现非精确异常的 CPU 上就把此时的 PC 值作为引起异常指令的所在(为了表达的方便,记为 eptr)。

简单地说就是 eptr 的指向,并非真正的引起异常的指令之所在,而是其后面的某条指令所在。


精确异常 (Precise Exception)

简单地说就是 eptr 的指向就是真正引起异常的指令之所在

而实现精确异常的 CPU,则在最后指令提交时 (commit) 按指令流的顺序提交,异常的抛出也在该指令提交时,这样就能精确计算出引起异常的指令相对于当前 PC 的偏移,从而保证精确异常。


不管是何类异常,eptr 之前的所有指令都会被执行完成 (commit),eptr 之后的指令不会被执行。

关于 eptr 的值,在 MIPS 上用 EPC 置之,在 PowerPC 上用 SRR0/CSRR0 置之,SPARC 上用 TPC[TL] 置之,x86 上当前 CS:EIP 即是,但 x86 将 CS:EIP 保存于栈上。


题外话:

关于 eptr 的指向,还有一些情形值得考虑:

A. 位于延迟槽中的指令 (MIPS, SPARC)

B. 由分支指令引起 (x86)

C. 上下文切换时 (x86)









个人工具
名字空间

变换
操作
导航
工具箱