1

在 KVM 中,我试图获取来宾 VM 的 GDT 的基地址和大小。当我读取 Windows 7 64 位来宾 VM 中的值时,我得到以下值: gdt base 0xfffff80003b37000, gdt limit 0x7f。这些值是我通过驱动程序在内核模式下用 gdtr 读出的。但是,当我在存储所有值的 VMCB 中的 VMEXIT(由 SYSCALL 触发)上读取值时,我得到以下(不同)值: gdt base 0xFFFFFFFFA03F8060, gdt limit 0x8060。我希望这些值是相同的。是否必须进行某种翻译/计算才能获得正确的值?

我在 KVM 中使用以下函数读出了该值:

vmcs_readl(GUEST_GDTR_BASE)
vmcs_read32(GUEST_GDTR_LIMIT)

我实际上对 IDTR 有同样的问题。但是,我只对 GDTR 感兴趣。读出 CR3、RIP 或 RAX 等其他寄存器工作正常。

4

1 回答 1

0

从内核中,您将获得来宾物理地址 (GPA),而从虚拟机管理程序中,您将获得主机物理地址 (HPA)。

您可以使用中gfn_to_pfn定义的 KVM 函数kvm_host.h进行翻译。

于 2015-10-08T09:32:50.810 回答