“对缺页等可重启同步故障,硬件提供精确异常状态:故障指令之前的效果已完成,故障指令及其后没有不可撤回的数据效果。OS 16中故障的指向应重试指令;显式系统调用指令长度固定4B,软件在完成请求后…”
形式陈述
设一条顺序执行中的第
因此,除异常记录和处理入口外,寄存器与数据内存应等于顺序 ISA 状态机执行前
本页另定义一个受限EEI:有效数据区为 (faultPC, load-access-fault)。处理器停止取指、取消故障load的写回及全部年轻指令,保留较老指令效果。不含设备副作用、嵌套故障和中断优先级;这些是明确的模型限制。
直觉
软件希望看到“停在某一条指令之前”,而不是一份较老指令做了一半、较年轻指令却已改内存的混合状态。精确异常为错误处理、修复映射后重试和调试提供这种整齐的边界。
记录了正确故障PC仍不够。如果年轻store已改了内存,重新执行程序可能重复写入或看到不该出现的值。控制位置和数据效果必须共同对应一个顺序前缀。
例子与边界
故障load后面的store必须取消
初始x1=
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=
若只停止新取指,却让已有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特权规范的完整实现。