特性:页面管理 & 映射
多级页表查询
最后更新于
这有帮助吗?
多级页表查询
最后更新于
这有帮助吗?
riscv有很多种管理页面的手段。对于32位的机器,riscv-32一般采用sv32的方式管理页面;而对于64位的机器,sv39成为riscv64上广受欢迎的方案。
xv6-riscv采用的即为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级分页的分页寻址过程如下:
satp的PPN字段提供最高级页表位置,VA的最高级VPN字段——VPN[k-1]提供页内偏移量,寻找第satp.PPN个基页面处页表的第VPN[k-1]个PTE,其位置为 ;
新获得的PTE(1)的PPN提供下一级页表位置,VA的下一级字段——VPN[k-2]提供页内偏移量,寻找第PTE(1).PPN个基页面处页表的第VPN[k-2]个PTE,其位置为 ;
新获得的PTE(2)的PPN提供下一级页表位置,VA的下一级字段——VPN[k-3]提供页内偏移量,寻找第PTE(2).PPN个基页面处页表的第VPN[k-3]个PTE,其位置为 ;
......
最终,寻找到PTE(k)的时候,我们把它的PPN与VA的最后一部分——offset拼接起来,最后就可以得到我们的物理地址PA。它的长度为PPN的长度加上offset的长度。
以sv32为例:
sv32的PTE为4个字节大小,flags占低10位,PPN占之后的22位;
一个4KB的页表能容纳的PTE数目即为 个,与之对应的是每一个字段的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数目相应调整为 个,每一字段VPN长度调整为9位;
sv39虚拟地址可用部分为39位长,三级分页,VPN总长27位,低12位交给offset;
自然,PA共56位,支持64PB的物理内存。