Skip to content

定义Definition

精确异常与已完成指令前缀

Precise exception · Precise interrupt state

把故障时的架构状态约束为顺序执行前缀,区分停止取指、清除年轻操作和保留较老效果。

形式陈述 ​

设一条顺序执行中的第 k 条指令发生同步故障。对本文可重启教学异常,精确状态要求:所有较老指令 1,…,k−1 的架构效果已经完成;第 k 条没有留下部分数据效果;所有较年轻指令没有架构效果;保存能定位故障指令的PC与原因。

因此,除异常记录和处理入口外,寄存器与数据内存应等于顺序 ISA 状态机执行前 k−1 条后的状态。精确性是对外恢复接口,不要求内部没有执行过年轻指令。

本页另定义一个受限EEI:有效数据区为 [0,0x1ff],四字节load越界在MEM阶段报告故障、不返回值,陷阱记录为 (faultPC, load-access-fault)。处理器停止取指、取消故障load的写回及全部年轻指令,保留较老指令效果。不含设备副作用、嵌套故障和中断优先级;这些是明确的模型限制。

直觉

软件希望看到“停在某一条指令之前”,而不是一份较老指令做了一半、较年轻指令却已改内存的混合状态。精确异常为错误处理、修复映射后重试和调试提供这种整齐的边界。

记录了正确故障PC仍不够。如果年轻store已改了内存,重新执行程序可能重复写入或看到不该出现的值。控制位置和数据效果必须共同对应一个顺序前缀。

例子与边界

故障load后面的store必须取消 ​

初始x1=0x200,x2=0,x3=7,地址0的word为0。程序为:

0x00: addi x2,x0,5
0x04: lw   x3,0(x1)
0x08: sw   x2,0(x0)

在五级教学实现中,故障load到MEM时,较老addi在WB、年轻store在EX。WB前半已经把x2写成5;MEM检测越界后,禁止load产生有效写回,并清除年轻store。陷阱入口应见x2=5、x3仍为7、地址0仍为0,faultPC=0x04。

若只停止新取指,却让已有store进入下一周期MEM,地址0会变成5。此时没有任何“只完成较老指令”的前缀能解释该内存,故状态不精确。若连较老addi也一并撤销而使x2仍为0,同样不符合本页选择的故障边界。

提前发现不等于立即跳走 ​

如果某个故障在ID便能发现,而较老store仍在EX,立即丢弃整条流水线会丢掉本应完成的写。实现必须让较老操作完成,或用能恢复同一前缀的机制处理;只有年轻操作可以无条件取消。若较老分支随后判定这条ID故障指令本就在错误路径上,必须连同其故障记录一起取消,不能一见fault信号就立即向软件报告。

内存原子性不是精确异常 ​

一次load可原子地读到完整word,仍可能在错误路径上不该提交。反过来,多条内部步骤也可以通过暂存与统一提交实现精确异常。原子性讨论并发观察的操作粒度,精确性讨论异常切断哪一个指令前缀。

推论与应用

顺序短流水线可利用固定副作用阶段实现简单精确恢复;乱序或变延迟机器通常需要额外的提交与恢复状态。本页没有由“需要精确异常”推导出唯一一种硬件结构。

分支清除取消错误控制路径,异常恢复取消故障之后的路径,二者都需要按年龄区分指令。异常处理还须保存原因和故障位置,不能只沿用分支目标PC的选择器。

参考资料
  • James E. Smith and Andrew R. Pleszkun, “Implementing Precise Interrupts in Pipelined Processors”, IEEE Transactions on Computers 37(5), 1988, pp. 562–573;顺序状态与流水实现之间的精确中断问题。
  • RISC-V International,RV32I 2.1,固定文档版 v20260120。本文数据有效区、MEM报告时机和陷阱记录格式为自定教学EEI,不声称是RISC-V特权规范的完整实现。
关系图谱7 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组