上一篇文章中,出现了错误,以至于我的页表都无法实现。

上一篇中我错误将物理页帧(Frame)、物理页号(PPN)、物理地址给混淆了,但其实是不同的三个概念。正确的应该是:

  • 物理地址:物理内存的某个位置
  • 物理页帧(Frame):在开启了页表的情况下(Sv39),物理内存被分为 4k 大小的页,每一页被成为一个物理页帧,页帧的地址用物理地址表示
  • 物理页号(PPN):物理地址被分隔为 12 为的偏移地址和物理页号,Sv39 下物理页号为 44 位大小

错误的理解:

在页表项里有 44 位的 PPN 字段,我错误的认为物理地址放在页表项的 PPN 字段里就变成了物理页号,实际上任何的物理页号都是物理地址右移 12 位。

在 Risc-V 的 private-ISA 手册里第 10.3.2 里介绍页表转换过程里的第四步:

file

pte.ppn x PAGESIZE 里应该能察觉到(但文档我没有找到明确说物理页号是物理地址右移 PAGESIZE 位,因为物理地址的分解图里总分成 PPN[0]、PPN[1],太误导人了(╯▔皿▔)╯)

为什么我在上一篇里修改?因为要修改很多地方懒得写

为什么上一篇不删除?因为写得很费力气不想删