特性:页面管理 & 映射

多级页表查询

riscv有很多种管理页面的手段。对于32位的机器,riscv-32一般采用sv32的方式管理页面;而对于64位的机器,sv39成为riscv64上广受欢迎的方案。

xv6-riscv采用的即为sv39的方式:

上:sv39虚拟页面映射;下:一个sv39页表项

riscv64采用64位的地址,在启动分页前为物理地址,启动后则使用虚拟地址。sv39标准下,虚拟地址只使用低39位,而高25位不予采用;64位的页表项(page table entry,PTE)仅使用低54位,高10位不予采用。这两个未采用部分都可以作为新标准可能需要的扩展空间。

分页模式的架构如下:

  • 虚拟地址(virtual address,VA)是启用分页模式之后系统直接使用的地址。它分为虚拟页号(virtual page number,VPN)偏移量(offset)两部分。VPN又通常分为若干个字段,不同字段对应分页寻址中的不同等级的页表寻址;

  • 物理地址(physical address,PA)是数据在实际的物理存储元件中的地址。它由寻址过程中最后一步得到;

  • 基页面为页面的最小单位,由页表来找到相应的地址。大小一般为4KB

  • 页表项(page table entry,PTE)为记载页面地址信息的数据结构,由物理页面号(physical page number,PPN)和标志位(flags)组成;

  • 页表为页表项的集合,被划分为多个等级,每一个页表拥有若干PTE,由更高级的页表来找到对应的位置。最高级别的页表不需要另外寻找位置,而是在启动分页模式时手动将它的位置存放在satp寄存器的低位PPN处。页表本身也是一个基页面。

  • satp(Supervisor Address Translation and Protection)寄存器存放关于分页系统的设置。高位包含了选择分页模式的MOD字段,优化分页性能的ASID字段;低位包含了PPN字段,其长度与PTE内的长度完全相同。

具体来说,设PAGESIZE为基页面大小(前面提到了,这个值目前为定值4096),PTESIZE为单个PTE大小,拥有k级分页的分页寻址过程如下:

  1. satpPPN字段提供最高级页表位置,VA的最高级VPN字段——VPN[k-1]提供页内偏移量,寻找第satp.PPN个基页面处页表的第VPN[k-1]个PTE,其位置为 (satp.PPN×PAGESIZE)+(VPNk1×PTESIZE)(satp.PPN\times PAGESIZE)+(VPN_{k-1}\times PTESIZE) ;

  2. 新获得的PTE(1)PPN提供下一级页表位置,VA的下一级字段——VPN[k-2]提供页内偏移量,寻找第PTE(1).PPN个基页面处页表的第VPN[k-2]个PTE,其位置为 (PTE1.PPN×PAGESIZE)+(VPNk2×PTESIZE)(PTE_{1}.PPN\times PAGESIZE)+(VPN_{k-2}\times PTESIZE) ;

  3. 新获得的PTE(2)PPN提供下一级页表位置,VA的下一级字段——VPN[k-3]提供页内偏移量,寻找第PTE(2).PPN个基页面处页表的第VPN[k-3]个PTE,其位置为 (PTE2.PPN×PAGESIZE)+(VPNk3×PTESIZE)(PTE_{2}.PPN\times PAGESIZE)+(VPN_{k-3}\times PTESIZE) ;

  4. ......

最终,寻找到PTE(k)的时候,我们把它的PPN与VA的最后一部分——offset拼接起来,最后就可以得到我们的物理地址PA。它的长度为PPN的长度加上offset的长度。

sv32的寻址示例;sv39的原理基本一致
sv32的PTE

以sv32为例:

  • sv32的PTE为4个字节大小,flags占低10位,PPN占之后的22位;

  • 一个4KB的页表能容纳的PTE数目即为 2102^{10} 个,与之对应的是每一个字段的VPN长度为10位,从而实现查找到页表中每一个PTE;

  • 正如其名字一样,sv32的虚拟地址为32位长,且这种方案为二级分页,因此VA中VPN总长为20位,剩余低12位交给offset

  • 最终PA为PPN和offset的拼接,共34位,即支持最大16GB的物理内存。

sv39的原理和sv32几乎完全相同,除了一些小差别:

  • sv32的PTE为8个字节大小,flags占低10位,PPN占之后的44位;

  • 页表中PTE数目相应调整为 292^{9} 个,每一字段VPN长度调整为9位;

  • sv39虚拟地址可用部分为39位长,三级分页,VPN总长27位,低12位交给offset

  • 自然,PA共56位,支持64PB的物理内存。

最后更新于

这有帮助吗?