跳转至

页表实现提示

理解监控程序中的页表机制

请先阅读以下内容:

  • 监控程序文档
  • (非必须)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

在开始实现之前,请确认可以回答下面的问题,正确理解监控程序如何使用页表机制之后,再开始实现。

  1. 监控程序使用的是动态页表映射还是静态的?
  2. 监控程序本身使用的地址是虚拟地址吗?
  3. G 指令指定的用户程序地址应为虚拟地址还是物理地址?A 指令呢?
  4. (非必须)缺页异常处理程序应该如何获得发生缺页的虚拟地址?

查询页表

  • 在 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 主要完成以下功能:

  1. 从内存请求方获取虚拟地址 va
  2. 按照 Privileged Spec,访问页表,检查权限,翻译地址
  3. 将翻译得到的物理地址 pa 返回给内存请求方,供后续使用

下面是一种可行的 Page Table Walker 设计思路:

  • 编写为独立的 MMU 模块
  • 从 Wishbone 总线上读取虚拟地址访存请求,再向下游发送页表请求 / 物理地址访存请求
  • 将编写好的 MMU 模块接入到 CPU 原来的 Wishbone 总线结构当中

实现完成之后,将用户程序写入 0x80100000 的物理地址,并在 G 命令中指定运行地址为 0x0 应该可以正常执行用户程序。到此,我们已经完成一个支持第三版本监控程序的 CPU 的实现。


最后更新: 2024年11月14日
作者:cuibst