You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RISC-V架构指令访问故障时mtval寄存器填充规则疑问

RISC-V指令访问故障时mtval的填充规则解析

先明确RISC-V ISA规范中的核心定义:

当指令取指、加载或存储发生断点、地址未对齐、访问故障或页故障异常,且mtval被写入非零值时,mtval将包含出错虚拟地址。
在支持变长指令的系统中,当发生指令访问故障或页故障异常且mtval被写入非零值时,mtval将包含导致故障的指令部分的虚拟地址,而mepc指向指令起始地址。

核心规则拆解

  • 启用C扩展(变长指令系统)时,mepc始终记录整个指令的起始虚拟地址(即使该地址未对齐,因为C扩展允许非对齐指令取指)。
  • mtval则记录触发访问故障/页故障的那一段指令的虚拟地址——也就是硬件在取指过程中,第一个遇到权限或访问错误的地址。

对你测试场景的解释

你提到的“指令第二个2字节允许访问但第一个2字节不被允许时,mtval设为非对齐PC”的情况,本质是硬件取指的顺序逻辑:

  1. 硬件首先尝试读取指令的第一个2字节(对应起始PC,即mepc),如果这个地址触发PMP访问故障,硬件会立即抛出异常,不会继续读取后续字节。此时mtval就是这个触发故障的起始PC地址。
  2. 只有当第一个2字节的访问被允许,且硬件识别出这是一条需要读取后续2字节的4字节指令时,才会尝试访问mepc+2地址。如果此时该地址触发故障,mtval才会被设置为mepc+2。

你预期的mtval=mepc-2的情况不会出现,因为指令取指是从当前PC开始按变长规则逐步推进的,硬件不会回溯到PC之前的地址进行检查——跨4字节边界的4字节指令,只会涉及PC和PC+2两个地址,起始PC必然是指令第一个字节的位置。

另外需要注意:PMP区域按4字节对齐的要求,不影响指令取指时的地址检查逻辑——硬件会直接校验当前访问的指令片段地址是否在允许的PMP区域内,不管该地址本身是否对齐。比如非对齐的起始PC如果落在禁止访问的PMP区域,就会触发故障,此时mtval就是这个非对齐的PC地址。

内容的提问来源于stack exchange,提问作者Ömer GÜZEL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:09