页表实现提示
理解监控程序中的页表机制
请先阅读以下内容:
- 监控程序文档
- (非必须)RISC-V Privileged, 3.1.16 Machine Trap Value Register (mtval)
- RISC-V Privileged, 4.1.12 Supervisor Address Translation and Protection (satp) Register
- RISC-V Privileged, 4.3 Sv32: Page-Based 32-bit Virtual-Memory Systems
在开始实现之前,请确认可以回答下面的问题,正确理解监控程序如何使用页表机制之后,再开始实现。
- 监控程序使用的是动态页表映射还是静态的?
- 监控程序本身使用的地址是虚拟地址吗?
- G 指令指定的用户程序地址应为虚拟地址还是物理地址?A 指令呢?
- (非必须)缺页异常处理程序应该如何获得发生缺页的虚拟地址?
查询页表
- 在 IF 段和 MEM 段的访存状态机中,根据 RISC-V Privileged, 4.3 小节中的状态机查询页表,检查权限。
- 如果在 EX 段处理异常,则需要在 EX 段提前查询页表,检查缺页异常。这可能需要一个额外的 wishbone master。
- 如果在 MEM 段处理异常,则需要在检查完页表之前,阻拦潜在的 EX 段跳转和 CSR 写入。
- 拼出来的 34 位物理地址可以直接去掉最高的两位当作 32 位地址进行使用。
- 不需要实现 RSW,D,A,G 位的相关内容。
Page Table Walker / MMU 设计
MMU,即 Memory Management Unit,是 CPU 中实现内存管理相关功能的核心模块。在我们的简易 RISC-V 32 位 CPU 当中,MMU 仅需要被实现为最简单的 Page Table Walker 就可以了。
Page Table Walker 主要完成以下功能:
- 从内存请求方获取虚拟地址
va
- 按照 Privileged Spec,访问页表,检查权限,翻译地址
- 将翻译得到的物理地址
pa
返回给内存请求方,供后续使用
下面是一种可行的 Page Table Walker 设计思路:
- 编写为独立的 MMU 模块
- 从 Wishbone 总线上读取虚拟地址访存请求,再向下游发送页表请求 / 物理地址访存请求
- 将编写好的 MMU 模块接入到 CPU 原来的 Wishbone 总线结构当中
实现完成之后,将用户程序写入 0x80100000
的物理地址,并在 G 命令中指定运行地址为 0x0
应该可以正常执行用户程序。到此,我们已经完成一个支持第三版本监控程序的 CPU 的实现。
最后更新:
2024年11月14日
作者: