问题描述
我有一个虚拟化当前运行的系统的管理程序(在我的例子中是 Windows)。我尝试在下面运行一个代码,它运行良好。该函数在vm-exit发生时在VMX Root模式下执行。
void Cr3test()
{
UINT64 GuestCr3;
UINT64 HostCr3 = __readcr3();
UINT64 GuestRIP;
UINT64 PhysAddress;
__vmx_vmread(VMCS::GUEST_CR3,&GuestCr3);
__vmx_vmread(VMCS::GUEST_RIP,&GuestRIP);
__writecr3(GuestCr3);
PhysAddress = MmGetPhysicalAddress((PVOID)GuestRIP).QuadPart;
__writecr3(HostCr3);
}
我有一个问题:在 Cr3 交换之后,我们可以毫无困难地访问代码获取、堆栈和 RIP 相关数据。这个怎么运作 ?为什么程序不改变以前映射到新进程上下文的物理地址?在 Windows 中,系统地址空间可用于具有某些条件或什么的任意进程?
解决方法
哇,我傻了。在提问之前我应该这样做:D
1: kd> !vtop 12531e000 fffff8023c2e9008
Amd64VtoP: Virt fffff8023c2e9008,pagedir 000000012531e000
Amd64VtoP: PML4E 000000012531ef80
Amd64VtoP: PDPE 0000000004409040
Amd64VtoP: PDE 000000000440af08
Amd64VtoP: PTE 0000000189937748
Amd64VtoP: Mapped phys 00000001b215b008
Virtual address fffff8023c2e9008 translates to physical address 1b215b008.
1: kd> !vtop 1ad000 fffff8023c2e9008
Amd64VtoP: Virt fffff8023c2e9008,pagedir 00000000001ad000
Amd64VtoP: PML4E 00000000001adf80
Amd64VtoP: PDPE 0000000004409040
Amd64VtoP: PDE 000000000440af08
Amd64VtoP: PTE 0000000189937748
Amd64VtoP: Mapped phys 00000001b215b008
Virtual address fffff8023c2e9008 translates to physical address 1b215b008.
12531e000 - 用户空间目录库,1ad000 - 系统空间目录库。 Windows 内核被映射到每个进程地址空间中,并带有管理员专用访问位。这就是为什么。