虛擬化技術(VT) 之 虛擬CPU結構VCPU 詳解

CPU虛擬化的實現:

硬件虛擬化使用VCPU描述符來描述虛擬CPU(客戶機, 類似操作系統的PCB) 是一個struct
(1) VCPU標示信息: 用於標示VCPU的一些基本屬性,如ID號, 這VCPU屬於哪一個客戶機
(2) 虛擬寄存器信息:虛擬的寄存器資源, 在使用intel VT-x 的情況下, 這些內容包括在vmcs中
(3) VCPU狀態信息: 類似進程狀態信息, 標示vcpu當前所處的狀態 , 例如睡眠,運行, 供調度器使用
(4) 額外寄存器或部件信息: 主要指未包含在VMCS的一些寄存器或CPU部件,如浮點寄存器, LAPIC
(5) 其他信息: 用於vmm進行優化,或存儲其他信息

由此可見VCPU可以劃分成兩部份,一個是以VMCS為主由硬件使用和刷新部份, 主要是虛擬寄存器部份, 另一個是除VMCS外,由VMM使用和更新的部份

當VMM創建客戶機時, 首先要為他創建VCPU, 整個客戶機的運行實際上可以看作是VMM調度不同的VCPU運行

VCPU的創建:
----------------------------------------------------------------------------
由於VCPU實際上是一個結構體, 那它的創建實際上就是分配相應大小的內存空間

VCPU涉及很多信息, 通常為多級結構

如第一級可以是各平台通用的內容, 中間包含一個指針指向第二級

物理CPU被供電以後, 硬件會自動將CPU初始化為指定狀態, VCPU的初始化也是一個類似的過程
將VCPU描述符的各個部份分置成可用的狀態, 通常初始化包含如下內容:

(1) 分配VCPU標示: 首先標示VCPU屬於哪個客戶機 (唯一標示)
(2) 初始化虛擬寄存器: 指初始化VMCS相關域,通常指CPU當前的值
(3) 初始化VCPU 狀態信息: 設置VCPU在調度前需要配置的必要標誌位
(4) 初始化額外部件: 將未被VMCS包含的虛擬寄存器初始化為物理CPU的值,並配置虛擬LAPIC等部份
(5) 始化化其他信息: 根據VMM的實現初始化VCPU的私有數據

VMCS的創建與初始化:
---------------------------------------------------------------------------
VMCS在分配時,只需要一塊4KB大小的內存空間,並且自動對齊到4KB邊界
(1) 以物理CPU寄存器為作VMCS相應寄存器初始化的值
(2) VMM CPU虛擬化的不同,設置相應的VMCS控制位
1. 客戶機狀態域:
2. 宿主機狀態域:
3. VM-Execution域:
4. VM-Entry控制域:
5. VM-Exit控制域:
6. VM-Exit數據域:


VCPU的運行:
--------------------------------------------------------------------------
1. 上下文切換: 實際上是寄存器的集合(指的是所有寄存器), 由於VT-x的支持,VCPU上下文分成兩部份VMCS硬件切換及VMM軟件切換(非VMCS部份) , 其中硬件切換部份可以更好地保証VMM與客戶機的隔離, 而軟件切換部份,如浮點數寄存器等 不需要每次切換,因而靈活性提高

切換步驟:
(1) VMM保存自己的上下文, 主要是保存VMCS不保存的寄存器, 即宿主機狀態域以外的部份
(2) VMM將保存在VCPU中的由軟件切換部份的上下文加載到物理CPU中
(3) VMM使用VMRESUME/VMLAUNCH 觸發VM-ENTRY, 保存宿主機狀態
(4) CPU恢復VMCS客戶機狀態部份加載到物理CPU,切換到VMX ROOT 模式

此時物理CPU已經處於客戶機的執行環境, RIP/EIP 亦指向了客戶機的指令 , VMM會使用Lazy Save/Restore方式, 上下文切換進行優化, 即不需要一次性切換所有非必要切換的寄存器


例如現在有VCPU1 VCPU2 VCPU3, 只有1,3 需要用到浮點數寄存器, 那VMM了解到這個情況, 則由VCPU1 調度到VCPU2時, 不會加載浮點寄存器, 由VCPU2到VCPU3 則不會保存VCPU2的浮點數寄存器, 則節省了兩步動作

優化:
(1)VCPU的硬件優化:
目的: 減小上下文切換次數, 如一些敏感指令不需要陷入VMM

(2)條件優化: 通過VM-Execution控制域配置敏感指令是否陷入vmm

1. 如訪問CR0:
CR0 是控制寄存器, 控制cpu的狀態, 如保護模式, 實模式的切換, 分頁機制等

從作cr0指令: MOV TO CR0, MOV FROM CR0 , CLTS , LMSW , 這些指令必須在RING0 下執行,否則產生保護異常

VMCS中的VM-Execution控制域->CR0 read shadow 可以用來加速客戶機讀取cr0的指令, 而讓陷入vmm次數減小

由於每個客戶機試圖寫cr0的時侯, 該字段會自動更新, 保存客戶機要寫的值, 由於普通寫入有機會多次陷入VMM, 但有了這個字段, 不用產生VM-Exit進行處理, 而是直接返回這個字段的值, 就可以實現寫入

2. 訪問TSC:
在硬件輔助的虛擬機中, VM-Execution控制域-> rdtsc exiting 字段為1時, 客戶軟件執行RDTSC指令時陷入到VMM時, 由VMM模疑指令, 客戶讀取TSC在某些操作系統是非常頻密的, 為了提高效率, vt-x提件以下加速方法:

vmcs中 TSC偏移量表示該VMCS所代表的虛擬CPU TSC 相對於 物理CPU TSC的偏移, 即虛擬TSC = 物理TSC+ TSC偏移值 , 當客戶軟件執行RDTSC時, 處理器直接返回虛擬TSC, 不產生VM-Exit, 從而進行優化.


3: GDTR/LDTR/IDTR/TR的訪問
VMCS為客戶機和VMM提供一套GDTR,IDTR,LDTR,TR 分別都保存在客戶機及宿主機狀態域(宿主機狀態域不包含LDTR,因VMM不需要使用到) , 進行訪問時, 只是直接把這些寄存器對應的 虛擬寄存器的物理地址返回就即可, 從而優化

4: 讀CR2
缺頁異常時, CR2保存產生缺頁錯誤的虛擬地址, 由於他經常發生, 因此也是優化重點之一:
讀取CR2 必須在RING0上執行, 否則產生保護錯誤

使用VT-X 技術, VM-ENTRY/VM-EXIT時會切換CR2 , 並且客戶機的操作系統是在NON-ROOT模式的RING0 執行CR2指令, 不產生保護錯誤, 故無須VMM模疑該指令, 如果在RING0以外的級別執行讀CR2 指令, 會產生保護錯誤, 而該錯誤是否陷入VMM, 由Exception bitmap控制

5. 比較重要的SYSENER / SYSEXIT
客戶機的系統調用: 由於操作系統在NON-ROOT模式 並在RING0下執行, 故SYSENTER/SYSEXIT 不會陷入VMM

6. APIC訪問控制

簡介apic:
*APIC本質上為了多核而設計,他由IOAPIC及LAPIC組成
其中IOAPIC在南橋上,
而LAPIC則每個CPU都有一個,
CPU上的LAPIC能夠智能的決定是否接受系統總線上傳遞的中斷信息

*LAPIC所有寄存器被映射到一段4KB的系統內存空間, 映射到分頁內存

LAPIC為中斷交互非常重要的一員, LAPIC中有很多寄存器,通常操作系統會以MMIO方式來訪問他們, 在這些寄存器中, 操作系統使用其中的TPR寄存器, 來屏蔽中斷優先級小於或等於TPR的外部中斷

通過虛擬化MMU 當客戶機試圖訪問LAPIC時, 會發生一個缺頁異常類型的VM-exit,VMM分析後,知道客戶機正在訪問LAPIC, 就會模疑客戶機對LAPIC的訪問

通常, 對於每一個客戶機的每一個虛擬CPU, VMM都會分配一個虛擬LAPIC的結構體,負責扮演虛擬中斷的角色, 客戶機的MMIO操作不會真的影響物理上的LAPIC, 而是反映到相應的虛擬LAPIC結構體, 但VMM的這種模疑有非常大的開銷, 如每一次訪問LAPIC而導致一次缺頁異常,VM-EXIT會頻繁之極

因此,VT-x提供了硬件加速支持, 設置vmcs中的Use TPR shadow=1 , virtualize API accesses =1, 設置Virtual APIC page為虛擬LAPIC結構地址, 同時修改VCPU的頁表, 使得客戶機訪問LAPIC時不發生缺頁異常,
對於TRP以外的LAPIC類寄存器訪問, 會產生LAPIC-Access類型的VM-exit, 陷入VMM, 此時vmm直接告知LAPIC寄存器

其他參考INTEL 手册..

7. 異常控制, I/O控制, MSR位圖
分別由不同位置設置後,有相應的措施, 而不用全面陷入VMM

VCPU-VM EXIT
----------------------------------------------------------
(1) 訪問了特權資源會使用 影子特權資源 ,虛擬特權資源兩種方式
虛擬特權資源(即客戶機讀寫時的特權資源)
影子特權資源(即客戶機真正執行時的特權資源)

當寫入特權寄存器時VMM首先將值寫入虛擬寄存器,然後根據虛擬寄存器的值以及虛擬化策略來更新影子寄存器, 最後將影子寄存器的值應用到VCPU上, 將值寫入VMCS"客戶機狀態域"的對應字段

例如:
mov EAX, 0x00000001
mov CR0 , EAX

以上語句表示關閉頁模式, 但為子實現內存隔離, VT-X不允許客戶機的頁模式關掉, 因此VMM會將Virtual CR0 按照客戶機要求設置0x00000001 但影子CR0 沒有改變, 此外VMM會通知內存虛擬化模塊, 作對應處理, 如不再使用客房機的頁面

(2) 引發了異常/中斷
特別的異常會用事件注入方式,返回到客戶機, 由他的IDT自行處理(如缺頁異常)


多核cpu的虛擬化
----------------------------------------------------------
分配多個VCPU, 讓他們共享一個物理VCPU分時執行或分散到多個物理CPU同時執行,類似線程調度
(1) VCPU發現的問題: 客戶操作系妃知道它所擁有的VCPU信息, 如VCPU個數, VCPU ID, 通過虛擬BIOS負責
(2) 多個VCPU初始化問題: 類似於物理cpu, 在初始化時會選擇一個VCPU主要CPU(BSP), 將其他VCPU設置為Wait-for-SIPI 狀態, 等到BSP發送SIPI
(3) VCPU同步問題: 一般解決是作群體調度, 即只在可以多物理CPU同時執行時, 才調度

Comments

Popular posts from this blog

Android Kernel Development - Kernel compilation and Hello World

How does Nested-Virtualization works?

Understanding ACPI and Device Tree