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 快取置於“不填充”模式。