一个 VMM 上的不同虚拟机 运行 是否共享来宾物理地址 space?
Do different virtual machines running on one VMM share guest physical address space?
我记得读过关于同一 VMM 上的不同 VM 运行 如何(显然)有自己独立的(来宾)虚拟地址 space 但它们都是 'share' 一个(来宾)物理地址 space。也就是说,如果 VM1
中的进程将其虚拟地址 0x000a0000
映射到物理地址 0xfffa0000
,则没有 VM2
的进程(也没有 [=12= 的任何其他进程) ]) 可以将其任何虚拟地址映射到物理地址 0xfffa0000
.
我找不到任何说明这一点的文档,但我知道扩展页 table 指针 (EPTP
) 是一个硬件寄存器,意味着只有一页 table 可以将guest物理地址翻译成host物理地址,所以不同VM之间不能有重叠的guest物理地址。
但是,我还发现 EPTP
的值保存在虚拟机控制结构 (VMCS
) 中,所以可能在 vmexit
或 vmenter
上 [=18 的值=] 可以在不同的 VM 之间更改吗?
简而言之,我想知道不同的虚拟机是否可以(或必须)共享一个访客物理地址space。
提前致谢!
虚拟化的全部意义在于让每个 VM 看起来都拥有自己的机器。如果 VMM 无法在多个 VM 中映射相同的 GPA,那将是不可能的。当然,您无法阻止来宾 OS 将相同的 GPA 映射到来宾中的多个进程。因此每个 VM 都必须有一个单独的 EPTP,其中包含该 VM 的 GPA 到 HPA 映射。
VMM 为每个 VM 中的每个 VCPU 使用单独的 VMCS,因此它可以将所有 VM- 和 VCPU-specific 状态保留在 VMCS 中,包括 EPTP,即使另一个 VM 正在执行.当从一个 VM 切换到另一个 VM 时,VMM 加载不同的 VMCS 指针。 VMM 将相同的 EPTP 值写入单个 VM 的所有 VMCS。
我记得读过关于同一 VMM 上的不同 VM 运行 如何(显然)有自己独立的(来宾)虚拟地址 space 但它们都是 'share' 一个(来宾)物理地址 space。也就是说,如果 VM1
中的进程将其虚拟地址 0x000a0000
映射到物理地址 0xfffa0000
,则没有 VM2
的进程(也没有 [=12= 的任何其他进程) ]) 可以将其任何虚拟地址映射到物理地址 0xfffa0000
.
我找不到任何说明这一点的文档,但我知道扩展页 table 指针 (EPTP
) 是一个硬件寄存器,意味着只有一页 table 可以将guest物理地址翻译成host物理地址,所以不同VM之间不能有重叠的guest物理地址。
但是,我还发现 EPTP
的值保存在虚拟机控制结构 (VMCS
) 中,所以可能在 vmexit
或 vmenter
上 [=18 的值=] 可以在不同的 VM 之间更改吗?
简而言之,我想知道不同的虚拟机是否可以(或必须)共享一个访客物理地址space。
提前致谢!
虚拟化的全部意义在于让每个 VM 看起来都拥有自己的机器。如果 VMM 无法在多个 VM 中映射相同的 GPA,那将是不可能的。当然,您无法阻止来宾 OS 将相同的 GPA 映射到来宾中的多个进程。因此每个 VM 都必须有一个单独的 EPTP,其中包含该 VM 的 GPA 到 HPA 映射。
VMM 为每个 VM 中的每个 VCPU 使用单独的 VMCS,因此它可以将所有 VM- 和 VCPU-specific 状态保留在 VMCS 中,包括 EPTP,即使另一个 VM 正在执行.当从一个 VM 切换到另一个 VM 时,VMM 加载不同的 VMCS 指针。 VMM 将相同的 EPTP 值写入单个 VM 的所有 VMCS。