我正在尝试从虚拟机管理程序级别遍历(和打印)进程分页结构。我正在运行的guest是32位操作系统(ubuntu 12.04),它使用PAE(物理地址扩展)分页。
以下来自intel手册的图片显示了使用PAE分页时不同结构的详细信息
我对如何使用这些信息感到困惑:
要访问不同的PDPTE:我应该使用CR3 + i
(包括忽略的位)还是将CR3右移4,然后添加偏移量(CR3 >> 4) + i
?
类似地,对于来自PDPTE的页面目录的地址,我理解我应该从条目及其40位(12:51)中排除标志。但是,对于所有PDPTE,我只得到0个PDE(我使用CR3 + i
)...
我使用kvm_read_guest(vcpu->kvm, cr3 + i, &pdpte, 8)
读取PDPTE,kvm_read_guest(vcpu->kvm, (pdpte >> 12) + i, &pde, 8)
读取PDPTE中的PDE
如果有人对此有任何解释,我将非常感谢:)