说明一下这个三级页表的查询,会需要上面的L2,L1,L0
如果在二级页表level就是2,PGSHIFT是12,那么就是往左移12+9*2位置,在&9bit就得到L2,其他以此类推
也表查询,首先有跟页表的地址pagetable,这是一个指针,然后我们拿到L2作为索引,就可以在根页表里面找512个项
下一级页表地址测试右移10位(去掉标志),然后填充12个零得到,这个就是下一级页表的地址
这里返回了最后一级页表的某一项,然后我们把这个项拿到拼上最后12位,就得到了物理地址
下面说说页表到底怎么映射
首先,一共56位,12位是4096,是一页,所以理论上物理内存有2^44个页表
假设我们现在程序内存上站两个物理页,那么虚拟地址上表现就是(可以不是最底下两个,因为是连续的,只要两个页表项相邻就好)
| 25 | L2(9) | L1(9) | xxxxxxxx1 | offset(12) |
| 25 | L2(9) | L1(9) | xxxxxxxx0 | offset(12) |
这样是两个连续的虚拟地址,
那么页表需要映射这两个地址,
offset提供索引,所以最后一级页表内存肯定是这俩物理页的其实地址,分配物理地址不需要连续,我们只需要拿出两个物理地址页就好了,假设物理地址分别是x和y,那么我们有这样的最后一级页表
这个页表的地址,我们需要存在上一级页表里,存这个页表的物理地址地址,那么很显然对于两个虚拟内存的L1来说,都是xxxxxxxx0,跟页表同理,放次级页表的物理地址。
最后再由stap寄存器放根页表的物理地址。
那么顺着来就是这样,我们需要映射一片连续的虚拟地址空间,那么我们从所有物理页里面拿一份作为我们的物理地址,根据索引(L2)来选择在根页表的某一个地方来记住这个物理地址(完全是看虚拟地址的需要)
然后在根据L1在次级页表选择一个地方,放子页表的地址
最后根据L0来在子集页表里面放两个项,用来找实际的物理地址,这里面表所存的物理地址是不需要连续的,这是操作系统分配的,连续的只是索引。
这里的每一次索引,都会到内存上去找东西,也就是到物理地址上找