在虛擬化中,為了實現vCPU,既要模擬CPU的運行,又要記錄vCPU的狀態(包括對vCPU運行的控制信息),在Intel x86處理器的VMX(Virtual Machine Extension)功能中,通過引入根運行模式(VMX root operation)和非根模式(VMX non-root operation),直接讓vCPU運行在邏輯CPU上,在軟體上省去了對vCPU運行的模擬,同時也大大提升了性能。剩下的就是對vCPU狀態的記錄了,為此Intel引入了VMCS(Virtual Machine Control Structure)功能。
VMCS(Virtual Machine Control Structure)是Intel x86處理器中實現CPU虛擬化,記錄vCPU狀態的一個關鍵數據結構。該數據結構主要包含如下六方面的信息:
- Guest-state area,即vCPU的狀態信息,包括vCPU的基本運行環境(如通用寄存器等)和一些非寄存器信息,如當前vCPU是否接收中斷,是否有掛起的exception,VMCS的狀態等等。
- Host-state area,即主機物理CPU的狀態信息,因為物理CPU是在主機CPU和vCPU之間來回切換運行的,所以在VMCS中既要記錄vCPU的狀態,也需要記錄主機CPU的狀態,這樣vCPU才能有足夠的信息恢復到原來主機CPU的狀態,繼續主機CPU的運行。其包含的具體信息和前面記錄的vCPU的狀態信息大體相同。
- VM-execution control fields,該方面信息主要用於對vCPU的運行行為進行控制,這是VMM對vCPU進行配置最複雜的一部分,如
- 控制vCPU在接收到某些中斷事件的時候,是否直接在vCPU中處理掉,即虛擬機直接處理掉該中斷事件還是需要退出到VMM中,讓VMM去處理該中斷事件。
- 是否使用EPT(Extended Page Table)功能。
- 是否允許vCPU直接訪問某些I/O口,MSR寄存器等資源。
- vCPU執行某些指令的時候,是否會出發VM Exit等等。
- VM-exit control fields,即對VM Exit的行為進行控制,如VM Exit的時候對vCPU來說需要保存哪些MSR寄存器,對於主機CPU來說需要恢復哪些MSR寄存器。
- VM-entry control fields,即對VM Entry的行為進行控制,如需要保存和恢復哪些MSR寄存器,是否需要向vCPU注入中斷和異常等事件(VM Exit的時候不需要向主機CPU注入中斷/異常事件,因為可以讓那些事件直接觸發VM Exit)。
- VM-exit information fields,即記錄下發生VM Exit發生的原因及一些必要的信息,方便於VMM對VM Exit事件進行處理,如vCPU訪問了特權資源造成VM Exit,則在該區域中,會記錄下這個特權資源的類型,如I/O地址,內存地址或者是MSR寄存器,並且也會記錄下該特權資源的地址,好讓VMM對該特權資源進行模擬。
VMCS有點類似於Linux進程中的上下問,只是它保存的是vCPU/CPU的狀態和控制信息,而不是進程/線程的狀態和控制信息。
每個vCPU都有自己的一份VMCS數據結構,並且在同一個VM中的vCPU可能會通過VMCS中的指針共享一些數據,如I/O bitmap,MSR bitmap和EPT表等。VMCS的大小需要查看VMX capability MSR IA32_VMX_BASIC寄存器來決定,不同的處理器可能要求的不一樣,最大不超過4KB。
每個VMCS都會有一個8位元組的頭部,前面4位元組主要用來表示VMCS的版本號並且表示VMCS是否為shadow VMCS。然後從偏移量8開始,就是VMCS的數據區,不同版本號的VMCS數據區分布會不一樣。