CPU 虚拟化的已知限制¶
当 CPU 特性的完美仿真不可能或过于困难时,KVM 必须在完全不实现该特性或引入虚拟机与裸机系统之间行为差异之间做出选择。
本文档记录了 KVM 在虚拟化 CPU 特性方面的一些已知限制。
x86¶
KVM_GET_SUPPORTED_CPUID
问题¶
x87 特性¶
与大多数其他 CPUID 特性位不同,CPUID[EAX=7,ECX=0]:EBX[6] (FDP_EXCPTN_ONLY) 和 CPUID[EAX=7,ECX=0]:EBX]13] (ZERO_FCS_FDS) 如果特性存在则清零,如果特性不存在则设置。
在 CPUID 中清除这些位对客户机操作没有影响;如果这些位在硬件上设置,则在运行在该硬件上的任何虚拟机上都不会存在这些特性。
解决方法: 建议始终在客户机 CPUID 中设置这些位。但请注意,任何预期这些特性存在的软件(例如 WIN87EM.DLL
)可能早于这些 CPUID 特性位,因此无论如何也无法检查它们。
KVM_SET_VCPU_EVENTS
问题¶
对于错误代码,无效的 KVM_SET_VCPU_EVENTS 输入可能导致 Intel CPU 上的 VM 入口失败。Pre-CET Intel CPU 要求通过 VMCS 注入异常时正确设置“错误代码有效”标志,例如,注入 #GP 时要求设置该标志,注入 #UD 时清除该标志,注入软异常时清除该标志等。将 IA32_VMX_BASIC[56] 枚举为 '1' 的 Intel CPU 放宽了 VMX 的一致性检查,而 AMD CPU 则没有任何限制。KVM_SET_VCPU_EVENTS 不会对向量与“has_error_code”进行健全性检查,即 KVM 的 ABI 遵循 AMD 的行为。
嵌套虚拟化特性¶
待定
x2APIC¶
当 KVM_X2APIC_API_USE_32BIT_IDS 启用时,KVM 会激活一项 HACK/变通方案,允许即使目标 vCPU 启用了传统 xAPIC,也可以使用其 x2APIC ID 将事件发送到单个 vCPU,例如在拥有 > 255 个 vCPU 的虚拟机上通过 INIT-SIPI 启动热插拔的 vCPU。此变通方案的一个副作用是,如果多个 vCPU 具有相同的物理 APIC ID,KVM 将仅向具有最低 vCPU ID 的 vCPU 传递针对该 APIC ID 的事件。如果 KVM_X2APIC_API_USE_32BIT_IDS 未启用,KVM 在处理中断时遵循 x86 架构(所有匹配目标 APIC ID 的 vCPU 都会接收中断)。
MTRR¶
KVM 不虚拟化客户机 MTRR 内存类型。KVM 模拟对 MTRR MSR 的访问,即客户机中的 {RD,WR}MSR 将按预期运行,但 KVM 在确定有效内存类型时不会遵循客户机 MTRR,而是将所有客户机内存视为具有回写 (WB) MTRR。
CR0.CD¶
KVM 不虚拟化 Intel CPU 上的 CR0.CD。与 MTRR MSR 类似,KVM 模拟 CR0.CD 访问,使得对 CR0 的加载和存储按预期运行,但设置 CR0.CD=1 对客户机内存的可缓存性没有影响。
请注意,此勘误表不影响 AMD CPU,AMD CPU 完全在硬件中虚拟化 CR0.CD,即当 CR0.CD=1 时,即使在客户机中运行,也会将 CPU 缓存置于“不填充”模式。