load page fault cause 13
RISC-V Page Fault 示例动画
load 指令 -> Sv39 walk/权限检查 -> cause 13 + xtval -> handler 修复/拒绝 -> 重试或终止
Step 1 / 4
流程PC 是 load 指令地址;VA 是这条 load 访问的数据虚拟地址。scause / stval
Load
→
Trap entry
→
Handler
→
xRET
Page Fault Trap 分层流程图
按 U/S/M 特权级分层展示 page fault 的跳转路径;节点只展示 trap 路由、handler 和重试路径。
scause/stval · sret
当前步骤1/4
load 指令与访问地址PC 0x0000000000011048 / VA 0x0000004000a130
U-mode 指令用户态执行一条 load,虚拟地址进入地址翻译和权限检查。 satp 提供页表上下文;访问类型是 load。 page fault 是翻译或保护检查失败的结果,不是一条单独指令。
本页只跟踪 load page fault 示例。
U-mode
1U-mode
load PC 与访问 VA
PC/VAPC 是触发异常的 load 指令地址,写入 EPC;VA 是访问失败的数据虚拟地址,可由信息性 tval 报告。用户态在 PC 0x0000000000011048 执行 ld a0, 0(a1);该 load 访问 VA 0x0000004000a130,随后 VA 进入翻译和权限检查。
重试 load
PC=0x0000000000011048
S-mode
->
hart 将触发异常的 load 指令地址写入 sepc,将 13 写入 scause 记录这次 load page fault;本示例按信息性 stval 显示访问失败的虚拟地址,然后让 PC 跳到 stvec.BASE。
2Trap entry
S-mode trap entry
BASE当前入口是 stvec.BASE。medeleg[13] 选择 S-mode 目标;委托改变目标特权级和 CSR 名称,不改变 cause=13。硬件写 sepc=load PC、scause=13;本示例按信息性 stval 显示 fault VA,再跳到 stvec.BASE。
->
3Handler
handler 修复映射
PTE修复路径强调 page fault 与 ECALL 的差异:handler 通常不把 EPC 加到下一条,而是让原访存指令重试。OS handler 读取 cause、EPC 和可用的 tval 信息,修复 PTE。EPC 仍指向原 load。
->
4Trap return
Trap return 恢复 U-mode
retryEPC 仍是 faulting load 的 PC;返回后不是跳过 faulting load,而是重做同一条访存。SRET 将 PC 设为 EPC 保存的原 load PC(0x0000000000011048),并按返回状态恢复特权级。
M-mode
读图重点
SRET 从 EPC 取回原 load PC;这和 ECALL 常见的 EPC +4 不同,修复后的 page fault 通常重试同一条访存。
关键说明
Page fault 容易混淆的边界
virtual-memory
page fault 的来源在地址翻译和 PTE 检查;继续看虚拟地址翻译页面可观察 VA 拆分、PTE、superpage 和 PA 组合。
EPC
修复成功时 EPC 通常保留 faulting load 的 PC,用来重试同一条访存。
medeleg[13]
medeleg[13] 改变 trap 目标,不改变 load page fault 的 cause=13。
官方语义边界
真实 page fault 分为 instruction page fault(cause 12)、load page fault(cause 13)和 store/AMO page fault(cause 15);本页只固定 load page fault cause 13 的 trap 处理路径。具体 fault 由地址翻译、PTE 有效性/保留位、权限、U/SUM/MXR、A/D 规则、superpage 对齐、访问类型和当前特权状态共同决定。