精确异常与非精确异常

这里的异常是指同步的 (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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值