首页/指令库/机器模式返回
MRET

RISC-V MRET 指令详解

指令手册I-type

机器模式陷阱返回:pc<-mepc,返回模式由 mstatus.MPP 和(H 扩展下的)MPV 确定,MIE<-MPIE,并按特权规范更新 MPIE、MPP、MPV 和相关状态。

指令语法

mret
操作数说明
RV32/RV64 机器级特权指令;32 位 SYSTEM 固定编码 0x30200073,没有显式操作数。
只能在 M-mode 执行;rd/rs1 字段固定为 x0,不是通用寄存器操作数。较低特权级执行产生非法指令异常。
先由 MPP 及 H 下的 MPV 选择返回模式,再恢复 PC 与中断使能;MPP=M 时忽略 MPV。MIE←MPIE、MPIE←1、MPP←最低支持特权级,H 下 MPV←0;返回低于 M 时 MPRV←0。
mepc[0] 恒为零,IALIGN=32 时隐式读取屏蔽 bit 1;xRET 可但不必须清除 LR 保留。MDT、SDT、ELP 等扩展条件状态按各自规范处理。
Privileged系统与特权

指令行为说明

MRET 是机器模式陷阱处理程序使用的特权返回指令。它先由 mstatus(RV32 上也可能为 mstatush)中的 MPP 和 MPV 确定返回模式,再将 MPV 清零、MIE 恢复为 MPIE、MPIE 置 1、MPP 置为最低支持特权级,最后将 pc 设为 mepc;返回到低于 M 的模式时 MPRV 也被清零。MPV 仅在实现 H 扩展时参与虚拟化返回模式的选择,且 MPP=M 时被忽略。MRET 只能在 M-mode 执行,较低特权级执行会触发非法指令异常。

MRET 指令解析与返回动画

从 SYSTEM 固定编码开始,展示 xRET 的权限检查、EPC 到 PC 的恢复,以及 previous interrupt-enable 和 previous privilege 字段更新。

无显式操作数
mretmret
执行环境mode=M
31..20
19..15
14..12
11..7
6..0
001100000010
funct12
00000
rs1=x0
000
funct3
00000
rd=x0
1110011
SYSTEM
instruction
0x30200073
opcode
1110011 -> SYSTEM
funct3
000 -> privileged return form
fixed
funct12=001100000010, rs1=x0, rd=x0
permission
M-mode may execute MRET
mepc
mepc=0x0000000000008040 -> pc=0x0000000000008040 (bit 1 masked)
MPP
MPP=S, MPV=0 -> privilege=S
MPV (H)
0 -> 0
MPIE
MIE=MPIE=1; MPIE=1
final
尚未提交返回状态

假定在 M-mode 执行且 U/S/M 均受支持(MPP 最终置 U);H 复选框选择 MPV=1 的虚拟化分支。mepc 输入为已存储值,bit 0 必须为零;IALIGN=32 时隐式读取屏蔽 bit 1。较低特权级执行 MRET 会产生非法指令异常。步骤是教学视图。

该动画展示核心 xRET 状态及 MRET 的 MPV 返回分支;不模拟扩展条件状态(例如 MDT、ELP)、操作系统调度、handler 内容、流水线、延迟或平台策略。

快速理解与检索要点

MRET 把机器模式 trap handler 保存的返回上下文恢复到架构状态:PC 来自 mepc,返回模式由 MPP 和(H 扩展下的)MPV 确定,中断使能来自 MPIE。它不是函数返回或普通跳转。

SYSTEM 编码中 funct12=001100000010,rs1=x0、rd=x0、funct3=000。
执行后 MPP 和(H 扩展下的)MPV 先确定返回模式,随后 MPV<-0、MIE<-MPIE、MPIE<-1、MPP<-最低支持特权级、pc<-mepc。
若返回到低于 M 的特权级,MPRV 被清零;xRET 可但不必须清除 LR/SC reservation。
mepc[0] 恒为零;IALIGN=32 时 MRET 的隐式读取还会屏蔽 mepc[1]。

常见使用场景

M模式中断/异常处理程序返回

结合 «mret # Return from M-mode trap» 等实际代码理解该场景。

固件/SEE返回

结合 «mret # Return from M-mode trap» 等实际代码理解该场景。

使用前检查清单

语法检查
  • RV32/RV64 机器级特权指令;32 位 SYSTEM 固定编码 0x30200073,没有显式操作数。
  • 只能在 M-mode 执行;rd/rs1 字段固定为 x0,不是通用寄存器操作数。较低特权级执行产生非法指令异常。
语义检查
  • 先由 MPP 及 H 下的 MPV 选择返回模式,再恢复 PC 与中断使能;MPP=M 时忽略 MPV。MIE←MPIE、MPIE←1、MPP←最低支持特权级,H 下 MPV←0;返回低于 M 时 MPRV←0。
  • mepc[0] 恒为零,IALIGN=32 时隐式读取屏蔽 bit 1;xRET 可但不必须清除 LR 保留。MDT、SDT、ELP 等扩展条件状态按各自规范处理。

容易混淆 / 常见误区

只能在 M-mode 执行;S/U-mode 执行触发非法指令异常。
MRET 不是普通跳转:目标 PC 来自 mepc,返回模式和中断使能来自 mstatus.MPP/MPV/MPIE;MPP=M 时忽略 MPV。
返回到低于 M 的特权级时 MPRV 会被清零;不要假设 trap handler 后仍保持原 MPRV 数据访问设置。
xRET 允许但不要求清除 LR/SC 保留;需要时陷阱处理程序应显式清除。

常见问题

MRET 和普通 JALR 返回有什么区别?

MRET 从 mepc 取得目标,同时恢复特权级与中断使能;它依据陷阱状态返回,不从通用源寄存器取得目标。

MRET 会写通用寄存器吗?

不会。它的编码中 rd 固定为 x0,架构效果是 PC、当前特权级和相关 mstatus 字段的更新。