操作系统只能通过虚拟地址访问页表来修改页表
如何设置页表的虚拟地址
对于虚拟地址管够的64位系统,将高虚拟地址空间全部保留给内核,物理地址通过加上一个偏移量转为虚拟地址。
为了找到某级页表的虚拟地址,只需顺着多级页表访问直到得到其物理地址,然后转为虚拟地址即可访问。
2.recursive paging Advanced Paging | Writing an OS in Rust 以一个具有四层页表结构的地址转换方式为例 其中SSSSSS的设置与x86要求有关,可忽略
| 虚拟地址 | 地址结构(八进制) |
|---|---|
| 页 | 0o_SSSSSS_AAA_BBB_CCC_DDD_EEEE |
| 一级表项 | 0o_SSSSSS_RRR_AAA_BBB_CCC_DDDD |
| 二级表项 | 0o_SSSSSS_RRR_RRR_AAA_BBB_CCCC |
| 三级表项 | 0o_SSSSSS_RRR_RRR_RRR_AAA_BBBB |
| 四级表项 | 0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA |
其中四级表即最外层目录
在四级表中设置一个递归项RRR,通过控制陷入这个表项的次数可以实现对多级页表的访问
对于访问一级页表项,由于有一个层级浪费在自递归上,最终我们得到的物理地址是位于一级页表区域中的物理地址,而不是一级页表项中指向的物理地址。
解决完虚拟地址页号的问题再来看看页内偏移。9位DDD表示一级页表中的索引,当它在地址结构中被移动到页内偏移这里时,将它乘上一级页表项的大小,即可保证该虚拟地址对应它的一级页表项的物理地址。
图中红字表示访问三级表项的地址翻译过程,蓝字为访问四级表项

该方式给定一个虚拟地址,该虚拟地址翻译中涉及的各级页表的虚拟地址是确定的,是可以从虚拟地址直接计算得到的。