SRET 和 MRET 的主要区别是什么?
SRET 使用 sepc 和 SPP/SPIE 恢复 supervisor trap 返回状态;MRET 使用 mepc 和 MPP/MPIE 恢复 machine trap 返回状态。
S 模式陷阱返回:pc<-sepc,特权级<-sstatus.SPP,SIE<-SPIE;S-mode 下 TSR=1 时触发非法指令异常。
SRET 是 supervisor 陷阱处理程序使用的特权返回指令。执行时,pc 设置为 sepc,当前特权级恢复为 sstatus.SPP,SIE 恢复为 SPIE,SPIE 置 1,SPP 清零。SRET 可在 S-mode 或更高特权级执行;若 mstatus.TSR=1,在 S-mode 执行 SRET 会触发非法指令异常,U-mode 执行也会触发非法指令异常。
从 SYSTEM 固定编码开始,展示 xRET 的权限检查、EPC 到 PC 的恢复,以及 previous interrupt-enable 和 previous privilege 字段更新。
该动画只展示特权架构定义的 ISA 可见返回状态;不模拟操作系统调度、handler 内容、流水线、延迟或平台策略。
SRET 把 supervisor trap handler 保存的返回上下文恢复到架构状态:PC 来自 sepc,返回特权级来自 SPP,中断使能来自 SPIE。TSR 可让 S-mode 中的 SRET 陷入非法指令异常。
结合 «sret # Return from S-mode trap» 等实际代码理解该场景。
SRET 使用 sepc 和 SPP/SPIE 恢复 supervisor trap 返回状态;MRET 使用 mepc 和 MPP/MPIE 恢复 machine trap 返回状态。
当 mstatus.TSR=1 且当前在 S-mode 执行 SRET 时,规范要求触发非法指令异常,而不是完成返回。