CPU硬件輔助虛擬化技術

目前主要有Intel的VT-x和AMD的AMD-V這兩種技術。其核心思想都是經過引入新的指令和運行模式,使VMM和Guest OS分別運行在不一樣模式(ROOT模式和非ROOT模式)下,且Guest OS運行在Ring 0下。一般狀況下,Guest OS的核心指令能夠直接下達到計算機系統硬件執行,而不須要通過VMM。當Guest OS執行到特殊指令的時候,系統會切換到VMM,讓VMM來處理特殊指令。數據結構

一、Intel VT-x技術

爲彌補x86處理器的虛擬化缺陷,市場的驅動催生了VT-x,Intel推出了基於x86架構的硬件輔助虛擬化技術Intel VT(Intel Virtualization Technology)。架構

目前,Intel VT技術包含CPU、內存和I/O三方面的虛擬化技術。性能

  • CPU硬件輔助虛擬化技術,分爲對應安騰架構的VT-i(Intel Virtualization Technology for ltanium)和對應x86架構的VT-x(Intel Virtualization Technology for x86)。
  • 內存硬件輔助虛擬化技術包括EPT(Extended Page Table)技術。
  • I/O硬件輔助虛擬化技術的表明VT-d(Intel Virtualization Technology for Directed I/O)。

Intel VT-x技術解決了早期x86架構在虛擬化方面存在的缺陷,可以使未經修改的Guest OS運行在特權級0,同時減小VMM對Guest OS的干預。Intel VT-d技術經過使VMM將特定I/O設備直接分配給特定的Guest OS,減小VMM對I/O處理的管理,不但加速數據傳輸,且消除了大部分性能開銷。以下圖所示。CPU硬件輔助虛擬化技術簡要說明流程圖:優化

wKioL1afGVfxeUomAAAz5_tFJmI638.png

效法IBM 大型機,VT-x提供了2 個運行環境:根(Root)環境和非根(Non-root)環境。根環境專門爲VMM準備,很像原來沒有VT-x 的x86,只是多了對VT-x 支持的幾條指令。非根環境做爲一個受限環境用來運行多個虛擬機。編碼

wKiom1afGTSh8RorAABRoN9MaUU781.png

如上圖所示,根操做模式與非根操做模式都有相應的特權級0至特權級3。VMM運行在根模式的特權級0,GuestOS的內核運行在非根模式的特權級0,GuestOS的應用程序運行在非根模式的特權級3。運行環境之間相互轉化,從根環境到非根環境叫VMEntry;從非根環境到根環境叫VMExit。VT-x定義了VMEntry操做,使CPU由根模式切換到非根模式,運行客戶機操做系統指令。若在非根模式執行了敏感指令或發生了中斷等,會執行VMExit操做,切換回根模式運行VMM。spa

根模式與非根模式之問的相互轉換是經過VMX操做實現的。VMM 能夠經過VMXON 和VMXOFF打開或關閉VT-x。以下圖所示:操作系統

wKiom1afGVDjubB0AAA3uBxIztk294.png

VMX操做模式流程:翻譯

1)、VMM執行VMXON指令進入VMX操做模式。3d

2)、VMM可執行VMLAUNCH指令或VMRESUME指令產生VM Entry操做,進入到Guest OS,此時CPU處於非根模式。指針

3)、Guest OS執行特權指令等狀況致使VMExit的發生,此時將陷入VMM,CPU切換爲根模式。VMM根據VMExit的緣由做出相應處理,處理完成後將轉到2),繼續運行GuestOS。

4)、VMM可決定是否退出VMX操做模式,經過執行VMXOFF指令來完成。

爲更好地支持CPU虛擬化,VMX新定義了虛擬機控制結構VMCS(Virtual Machine ControlStructure)。VMCS是保存在內存中的數據結構,其包括虛擬CPU的相關寄存器的內容及相關的控制信息。CPU在發生VM Entry或VMExit時,都會查詢和更新VMCS。VMM也可經過指令來配置VMCS,達到對虛擬處理器的管理。VMCS架構圖以下圖所示:

wKiom1afGaLTpUkXAAA7ZB52HHU125.png

每一個虛擬處理器都需將VMCS與內存中的一塊區域聯合起來,此區域稱爲VMCS區域。對VMCS區域的操縱是經過VMCS指針來實現的,這個指針是一個指向VMCS的64位的地址值。VMCS區域是一個最大不超過4KB的內存塊,且需4KB對齊。

VMCS區域分爲三個部分:

  • 偏移0起是VMCS版本標識,經過不一樣的版本號,CPU可維護不一樣的VMCS數據格式;
  • 偏移4起是VMX停止指示器,在VMX停止發生時,CPU會在此處存入停止的緣由;
  • 偏移8起是VMCS數據區,這一部分控制VMX非根操做及VMX切換。

VMCS 的數據區包含了VMX配置信息:VMM在啓動虛擬機前配置其哪些操做會觸發VMExit。VMExit 產生後,處理器把執行權交給VMM 以完成控制,而後VMM 經過指令觸發VMEntry 返回原來的虛擬機或調度到另外一個虛擬機。

VMCS 的數據結構中,每一個虛擬機一個,加上虛擬機的各類狀態信息,共由3個部分組成,如以前的VMCS架構圖所示:

1) Gueststate:該區域保存了虛擬機運行時的狀態,在VMEntry 時由處理器裝載;在VMExit時由處理器保存。它又由兩部分組成:

  • Guest OS寄存器狀態。它包括控制寄存器、調試寄存器、段寄存器等各種寄存器的值。

  • Guest OS非寄存器狀態。用它能夠記錄當前處理器所處狀態,是活躍、停機(HLT)、關機(Shutdown)仍是等待啓動處理器間中斷(Startup-IPI)。

2) Hoststate:該區域保存了VMM 運行時的狀態,主要是一些寄存器值,在VMExit 時由處理器裝載。

3) Control data:該區域包含幾部分數據信息,分別是:

  • 虛擬機執行控制域(VM-Execution control fields)。VMM 主要經過配置該區域來控制虛擬機在非根環境中的執行行爲。基於針腳的虛擬機執行控制。它決定在發生外部中斷或不可屏蔽中斷(NMI)要不要發生VMExit。基於處理器的虛擬機執行控制。它決定虛擬機執行RDTSC、HLT、INVLPG 等指令時要不要發生VMExit。

  • VMExit 控制域(VMExit control fields)。該區域控制VMExit 時的行爲。當VMExit 發生後處理器是否處於64 位模式;當由於外部中斷髮生VMExit 時,處理器是否響應中斷控制器而且得到中斷向量號。VMM 能夠用它來定製當VMExit 發生時要保存哪些MSR 而且裝載哪些MSR。MSR是CPU的模式寄存器,設置CPU的工做環境和標識cpu的工做狀態。

  • VMEntry 控制域(VMEntry control fields)。該區域控制VMEntry 時的行爲。它決定處理器VMEntry 後是否處於IA-32e 模式。與VMExit 的MSR控制相似,VMM 用它來定製當VMEntry 發生時要裝載哪些MSR。VMM 能夠配置VMEntry 時經過虛擬機的IDT向其發送一個事件。在此能夠配置將使用IDT 的向量、中斷類型(硬件或軟件中斷)、錯誤碼等。

  • VMExit 信息域(VMExit information fields)。該只讀區域包括最近一次發生的VMExit 信息。試圖對該區域執行寫操做將產生錯誤。。此處存放VMExit 的緣由以及針對不一樣緣由的更多描述信息、中斷或異常向量號、中斷類型和錯誤碼、經過 IDT 發送事件時產生的VMExit 信息、指令執行時產生的 VMExit 信息。

有了VMCS結構後,對虛擬機的控制就是讀寫VMCS結構。後面對vCPU設置中斷,檢查狀態實際上都是在讀寫VMCS數據結構。

二、AMD-V技術

       咱們在上面小節介紹了 Intel 的硬件輔助虛擬化技術,那麼 AMD 的硬件輔助虛擬化技術又有什麼特色呢?AMD 從 2006 年便開始致力於硬件輔助虛擬化技術的研究,AMD-V全稱是AMD Virtualization,AMD-V從代碼的角度分別稱爲 AMD和 SVM,AMD開發這項虛擬化技術時的內部項目代碼爲Pacifica,是AMD推出的一種硬件輔助虛擬化技術。

wKioL1afGj7xq-X4AAISdUtYJcE211.png

Intel VT-x 和 AMD-V 提供的特徵大多功能相似,但名稱可能不同,如 Intel VT-x 將用於存放虛擬機狀態和控制信息的數據結構稱爲 VMCS, 而 AMD-V 稱之爲VMCB; Intel VT-x 將 TLB 記錄中用於標記 VM 地址空間的字段爲 VPID, 而AMD-V 稱之爲 ASID; Intel VT-x 將二級地址翻譯稱之爲 EPT, AMD 則稱爲 NPT,等等一些區別。儘管其類似性,Intel VT-x 和 AMD-V 在實現上對 VMM 而言是不兼容的。

AMD-V 在 AMD 傳統的x86-64 基礎上引入了「guest」操做模式。「guest」操做模式就是 CPU 在進入客操做系統運行時所處的模式。 「guest」操做模式爲客操做系統設定了一個不一樣於 VMM 的運行環境而不須要改變客操做系統已有的 4 個特權級機制,也就是說在「guest」模式下,客操做系統的內核仍然運行在 Ring 0, 用戶程序仍然在 Ring 3。 裸機上的操做系統和 VMM 所在的操做模式依然和傳統的 x86 中同樣,且稱之爲「host」操做模式。 VMM 經過執行 VMRUN 指令使CPU 進入「guest」操做模式而執行客操做系統的代碼; 客操做系統在運行時,遇到敏感指令或事件,硬件就執行 VMEXIT 行爲,使 CPU 回到「host」模式而執行 VMM 的代碼。 VMRUN 指令運行的參數是一個物理地址指針,其指向一個 Virtual Machine Control Block (VMCB) 的內存數據結構, 該數據結構包含了啓動和控制一個虛擬機的所有信息。

wKiom1afGimzbOjaAABAsxMi2CI065.png

「guest」模式的意義在於其讓客操做系統處於徹底不一樣的運行環境,而不須要改變客操做系統的代碼。「guest」模式的設立在系統中創建了一個比 Ring 0 更強的特權控制,即客操做系統的 Ring 0 特權必須讓位於 VMM 的 Ring 0 特權。客操做系統上運行的那些特權指令,即使是在 Ring 0 上也變的能夠被 VMM 截取的了,「Ring Deprivileging」由硬件自動搞定。此外,VMM 還能夠經過 VMCB 中的各類截取控制字段選擇性的對指令和事情進行截取,或設置有條件的截取,全部的敏感的特權或非特權指令都在其控制之中。

wKioL1afGpTiDMn-AABqRRMT8Wk023.jpg

VMCB 數據結構主要包含以下內容 :

1. 用於描述須要截取的指令或事件的字段列表。其中 :

  • 2 個 16 位的字段用於控制對 CR 類控制寄存器讀寫的截取

  • 2 個 16 位的字段用於控制對 DR 類調試寄存器的讀寫的截取

  • 一個 32 位的字段用於控制 exceptions 的截取

  • 一個 64 位的字段用於控制各類引發系統狀態變化的事件或指令的截取,如 INTR, NMI, SMI 等事 件, HLT, CPUID,INVD/WBINVD,INVLPG/INVLPGA,MWAIT 等指令, 還包括兩位分別標誌是否對 IO 指令和 MSR 寄存器的讀寫進行控制

  • 指向IO端口訪問控制位圖和MSR讀寫控制位圖的物理地址指針字段。該位圖用於差異性地控制虛擬機對不一樣的 IO 端口和 MSR 寄存器進行讀寫訪問。

  • 描述虛擬機CPU狀態的信息。包含除通用寄存器外的大部分控制寄存器,段寄存器,描述符表寄存器,代碼指針等。 RAX 寄存器也在其中,由於 RAX 在 VMM 執行 VMRUN 時是用來存放VMCB 物理地址的。 對於段寄存器,該信息中還包含段寄存器對應的段描述符,也就那些傳統 x86 上對軟件隱藏的信息。

  • 對虛擬機的執行進行控制的字段。主要是控制虛擬機中斷和 NPT 的字段。

  • 指示虛擬機進入「guest」模式後要執行的行動的字段。包括用來描述 VMM 向虛擬機注入的中斷或異常的信息的字段。 注入的中斷或異常在 VMRUN 進入「guest」模式後當即執行,就象徹底發生在虛擬機內同樣。

  • 提供VMEXIT信息的字段。包括致使 VMEXIT 的事件的代碼,異常或中斷的號碼,page fault 的線性地址,被截獲的指令的編碼等。

wKiom1afGuOSVGDWAACiyrhiMUI787.png

VMCB 以及其涉及的控制位圖,徹底經過物理地址進行指向,這就避免了「guest」和「host」模式切換的過程依賴於「guest」空間的線性地址 ( 傳統操做系統內用戶空間到內核的切換確實依賴於 IDT 中提供的目標的線性地址 ),使得 VMM 能夠採用和客操做系統徹底不一樣的地址空間。

VMCB 的內容在物理上被分紅了倆部分,其中用於保存虛擬機 CPU 狀態的信息佔據 2048 字節的後半部分,咱們可稱之爲 VMCB.SAVE; 其餘信息,佔據前 1024 字節範圍,咱們可稱之爲 VMCB.CONTROL。

VMRUN 命令以 VMCB 爲參數,使CPU 進入「guest」狀態, 按 VMCB.SAVE 的內容恢復虛擬機的 CPU 寄存器狀態,並按 VMCB.SAVE 中 CS:RIP 字段指示的地址開始執行虛擬機 的代碼, 並將以前 VMM 的 CPU 狀態保存在MSR_VM_HSAVE_PA 寄存器所指向的物理內存區域中。VMRUN 所保存的 VMM 的 CPU狀態的 CS:RIP 實際上就是 VMM 的代碼中 VMCB 的下一個指令,當虛擬機因某種緣由而致使 #VMEXIT 時,VMM 會從 VMRUN 後的一條指令開始執行。CPU 執行 #VMEXIT 行爲時,會自動將虛擬機的狀態保存到 VMCB.SAVE 區,並從 MSR_VM_HSAVE_PA 指定的區域加載 VMM 的 CPU 狀態。

VMLOAD 和 VMSAVE 指令是對 VMRUN 的補充,他們用來加載和恢復一些並不須要常用的 CPU 狀態,如 FS, GS, TR, LDTR 寄存器以及其相關的隱含的描述符寄存器的內容,VMLOAD 和 VMSAVE 可讓 VMM 的實現對「guest」進入和退出的過程進行優化,讓多數狀況下只使用 VMRUN 進行最少的狀態保存和恢復。

VMMCALL 指令是 AMD-V 爲客操做系統內核提供的明確的功能調用接口,相似於 syscall 指令 ( 從 Ring3 到 Ring 0), VMMCALL 讓客操做系統直接執行 #VMEXIT 而進入 VMM,請求VMM 的服務。

三、總結

回顧一下CPU虛擬化技術的實現,純軟件的CPU虛擬化使用了陷入-模擬的模式來模擬特權指令,而在x86架構中因爲只能模擬特權指令,沒法模擬某些敏感指令而沒法實現徹底的虛擬化。(在x86架構中,特權指令必定是敏感指令,可是敏感指令比特權指令多,形成某系敏感指令不是特權指令而沒法模擬,使得CPU虛擬化異常),而硬件輔助虛擬化引入了根模式(root operation)和非根模式(none-root operation),每種模式都有ring0-3的四級特權級別。因此,在硬件輔助虛擬化中,陷入的概念實際上被VM-EXIT操做取代了,它表明從非根模式退出到根模式,而從根模式切換到非根模式是VM-Entry操做。

相關文章
相關標籤/搜索