CSR 位字段

RISC-V mepc CSR 寄存器详解

地址 0x341特权级 M模式访问 读写 / MXLENMachine 状态、trap 与中断 CSR

机器异常程序计数器,保存进入 M 模式陷阱时被中断或发生异常的指令虚拟地址。

字段映射

按 bit 字段理解 mepc

1 个关键字段
MXLEN-1:0

EPC

WARL

M 模式异常返回 PC。mepc[0] 始终为 0;仅支持 IALIGN=32 的实现中 mepc[1:0] 始终为 0。若 IALIGN 可在 16/32 间切换,则 IALIGN=32 时 mepc[1] 读取被屏蔽为 0,但仍可写。

这个字段控制什么

  • - M 模式异常返回 PC。mepc[0] 始终为 0;仅支持 IALIGN=32 的实现中 mepc[1:0] 始终为 0。若 IALIGN 可在 16/32 间切换,则 IALIGN=32 时 mepc[1] 读取被屏蔽为 0,但仍可写。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

官方依据与检索要点

mepc 是地址 0x341 的 MXLEN 位 M 模式异常 PC CSR。进入 M 模式陷阱时写入相关指令的虚拟地址;MRET 从该值恢复 PC。低位受 IALIGN 规则约束,整个字段为 WARL。

官方 CSR 表列出 mepc 地址 0x341,M 模式读写。
mepc[0] 恒为 0;仅 IALIGN=32 实现中 mepc[1:0] 恒为 0;动态 IALIGN=32 时 mepc[1] 读取被屏蔽但仍可写。
mepc 是 WARL,必须保存所有有效虚拟地址,不必保存所有可能的无效地址。

读这个 CSR 时先看什么

  • - mepc 是 MXLEN 位 M 模式读写 CSR,地址 0x341,字段行为为 WARL。
  • - 进入 M 模式陷阱时,硬件把被中断或发生异常的指令虚拟地址写入 mepc。
  • - MRET 对 mepc 的隐式读取同样受 IALIGN=32 时 mepc[1] 读取屏蔽规则影响。

写入前的风险检查

  • - mepc 必须能保存所有有效虚拟地址;实现可在写入前把无效地址转换为另一个可保存的无效地址。
  • - 写入低位时必须考虑 IALIGN:mepc[0] 恒为 0,IALIGN=32 读取时 mepc[1] 表现为 0。

放回真实流程里理解

1

陷阱处理程序读取 mepc,确定进入 M 模式陷阱前的指令地址。

2

若需要跳过或重试指令,软件按 IALIGN 和 WARL 规则写入新的 mepc。

3

执行 MRET 时,处理器从 mepc 指定的地址恢复执行。

常见问题

mepc 可以在任意特权级访问吗?

不能只看 CSR 名称判断。官方 CSR 地址表给出最低访问特权级;mepc 位于 0x341,最低访问级为 M 模式。权限不足或访问未实现 CSR 时会触发非法指令异常。

写 mepc 时最容易忽略什么?

写 mepc 时最容易忽略低位和 WARL 规则。mepc[0] 恒为 0;IALIGN=32 时读取的 mepc[1] 表现为 0;无效地址可能被实现转换为另一个可保存的无效地址。