對於Intel x86處理器,在打開VMX(Virtual Machine Extension),即執行VMXON指令的時候需要提供一個4KB對齊的內存區間,稱作VMXON region,該區域的物理地址作為VMXON指令的操作數。該內存區間用於支持邏輯CPU的VMX功能,該區域在VMXON和VMXOFF之間一直都會被VMX硬體所使用。

VMXON Region內存區域的要求跟VMCS類似,也是需要4KB對齊,並且在使用之前,需要先初始化一下VMCS revision,即從IA32_VMX_BASIC MSR寄存器中獲取到的31bit的VMCS revision identifier。對於每個支持VMX功能的邏輯CPU而言,都需要一個相應的VMXON Region。

對於軟體而言,除了在執行VMXON之前初始化一下VMCS的版本號之外,不需要再做其他事情,特別是在VMXON和VMXOFF之間,軟體不應該訪問,甚至是更改VMXON Region這段內存,否則可能會造成不可預知的後果。

在KVM模塊中,KVM的模塊載入過程vmx_init()中,會調用到alloc_kvm_area()函數,為每個邏輯CPU分配一個VMXON Region。

源碼中,分配VMXON Region的時候完全是以分配VMCS的方式進行分配的,這個可能容易讓人將VMXON Region和VMCS Region混起來。

注意:VMXON Region和VMCS Region是不一樣的兩個內存區域,VMXON是針對邏輯CPU的,每個邏輯CPU都會有一份,並且在整個VMX功能使用期間硬體都會使用;而VMCS Region則是針對vCPU的,每個vCPU都會有一份VMCS Region,用於輔助硬體對vCPU的模擬。

VMXON Region看樣子完全是為了滿足VMX功能在硬體上的需求,裡面具體有什麼數據,Intel並沒有公開,軟體要做的就是分配一個這樣的數據區,標明VMCS revision,讓後扔該硬體自個兒玩去,VMM沒有必要也沒有資格管。

推薦閱讀:

相关文章