在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等其他寄存器可以正常工作。
答案 0 :(得分:0)
从内核中,您获得了一个访客物理地址(GPA),而在虚拟机管理程序中,您获得了一个主机物理地址(HPA)。
您可以使用gfn_to_pfn
中定义的KVM函数kvm_host.h
进行翻译。