VMM:Virtual Machine Monitor,虛擬機監控器。也稱為 “Hypervisior”,特權層(Ring -1),能夠監控操作系統的各種行為。 CR0-CR3:控制寄存器。 CR0:控制處理器操作模式和狀態 CR1:保留不用 CR2:導致頁面錯誤的線性地址 CR3:頁目錄表物理內存基地址 |
VMX 功能啟用時,CPU 模式分為 Root 和 non-Root 模式。只有 VMM 可以使用 Root 模式, 操作系統使用 non-Root 模式。
上圖中 Guest 0 和 Guest 1 都是虛擬機,沒有 VMXOFF指令,就一直處於 #VMExit 和 #VMEntry 的循環中。
記住一點,所有的虛擬操作都是以真實機為主體進行的。
創建一個典型的 VT 技術 HyperVisior 步驟:
· 分配 VMXON 區域和 VMCS 控制塊 · 填寫 VMCS 控制塊,用於控制要監控什么特權指令等等一系列操作。 · 調用 VMXLaunch 指令啟動虛擬機 · 當產生 VMExit 時間后調用 VMExitProc 函數處理 |
要進入 VT ,需要打開 VMX 操作模式,即使用相關的指令。
開啟:VMXON -> VMXClear -> VMPTRLD -> VMWrite -> VMLaunch
關閉:VMXOFF
VMXON:開啟 VMX 模式,可以執行后續的虛擬化相關指令。
VMXOFF:關閉 VMX 模式,后續虛擬化指令的執行都會失敗。
VMLAUNCH:啟動 VMCS指向的虛擬機 Guest OS。
VMRESUME:從 Hypervisor 中恢復虛擬機 Guest OS 的執行。
VMPTRLD:激活一塊 VMCS,修改處理器當前 VMCS 指針為傳入的 VMCS 物理地址。
VMCLEAR:使一塊 VMCS 變為非激活狀態,更新處理器當前 VMCS 指針為空。
VMPTRST:將 VMCS 存儲到指定位置。
VMREAD:讀取當前 VMCS 中的數據。
VMWRITE:向當前 VMCS 中寫入數據。
VMCALL:Guest OS 和 Hypervisor 交互指令,Guest OS 會產生 #VMExit 而陷入 Hypervisor。
INVEPT:使 TLB 中緩存的地址映射失效。
INVVPID:使某個 VPID 所對應的地址映射失效。
一個 VMCS 就代表一個虛擬操作系統,當 VMPTRLD 指令裝載 VMCS 后,就不能直接使用內存操作函數了,而需要使用上面提到的函數。
VMCS 是一個非常復雜的結構,只需要關注關鍵的參數即可。
在產生 #VMExit 事件時,如果出現問題,系統會發生 VMX Abort 事件。對於一個已經激活的 VMCS,Abort 事件並不會導致 VMCS 數據區被修改。VMX 退出原因指示器會指出發生 VMX Abort 事件的原因,邏輯處理器也會因此進入關閉狀態。
VMCS 數據結構
1.虛擬機狀態域 Guest-State Fields #VMEntry 時,即虛擬操作系統運行時,從這個區域加載處理器狀態信息。#VMExit 時,處理器狀態信息保存在這個區域。 這個區域包含了很多信息,比如各種寄存器,通用寄存器和其它類型的寄存器(MSR、GDTR.....)的部分域,處理器狀態信息(處理器狀態、可中斷狀態、VMCS 指針、PDPTE....) 2.宿主機狀態域 Host-State Fields #VMExit 時,處理器狀態信息從該域加載,恢復 VMM 的執行。域中存儲的所有信息都與寄存器相關。例如部分 MSR、段寄存器、IDTR、GDTR... 3.虛擬機執行控制域 VM-Execution Control Fields 可以設置各種退出條件,控制 processor 在虛擬機中的行為,哪些事件會導致 #VMExit,設置 I/O 訪問、MSR 寄存器訪問、CR3 事件、異常等等事件,一共26個字段。 4. 虛擬機 VMEntry 控制域 VMEntry Control Fields 包含兩部分:VM-Entry Controls for MSRs 和 Event Injection(interruption-information field,exception error code,instruction length 都是 32 bit) 規定了發生 #VMEntry 后的一系列操作,VMware 軟件實現硬件虛擬化會用到。 5.虛擬機 VMExit 控制域 VM-Exit Control Fields 包含兩部分:VM-Exit Controls For MSRs 和 VM-Exit Controls。前者指定哪些 MSRs 被存儲和裝載,后者指定 VM-Exit 后的操作。 6.虛擬機VM-Exit 信息域 VM-Exit Information Fields 只讀區域。描述最近 VM-Exit 退出的詳細原因。在某些情況下,還會有虛擬機的 Linear Address、Physical Address、Interruption Information、Interruption Error Code、IDT 向量化信息和錯誤碼 |
EPT 機制
這篇文章給了我莫大的啟發:5. EPT機制_李海偉-CSDN博客
上面的一部分是虛擬地址到物理地址的轉化,下面一部分是 GPA 到 HPA 的轉化。EPT 機制即是實現 GPA -> HPA 。GPA 和 HPA 都存儲在內存上,只是尋址的方式不同罷了。
EPT:Extended Page Table,擴展頁表 EPTP:Extended-Page-Table Pointer,擴展頁表指針 EPT PML4T:EPT Page Map Level 4 Table , EPT PML4E 是其表項 L4 PDPT:Page-Directory-Pointer Table , PDPTE 是其表項 L3 PDT:Page-Directory Table , PDE 是其表項 L2 PT:Page Table , PTE 是其表項 L1 GPA:Guest-Physical Address,虛擬機物理地址 HPA:Host-Physical Address,真實機物理地址 EPT MMU:一塊專門的用作硬件虛擬化的硬件
|
EPT 機制與 Intel CPU 上的分頁機制幾乎一模一樣,互通的。
首先從大體上明白一點:首先通過 EPTP 可以找到 EPT PML4 : 1. 當頁面選擇是 4KB 時,通過5次轉換找到一個 4Kb 大小的頁面, EPT PML4 ——> EPT PML4E ——> PDPTE ——> PDE ——> PTE ——> Page(4KB) 2. 當頁面選擇是 2MB 時,通過4次轉換找到一個 2MB 大小的頁面,EPT PML4 ——> EPT PML4E ——> PDPTE ——> PDE ——> Page(2MB) 3. 當頁面選擇是 1G 時,通過3次轉換找到一個 1G 大小的頁面,EPT PML4 ——> EPT PML4E ——> PDPTE ——> Page(1G) 最后通過一個偏移值找到最終的 HPA 其次,在 IA32 文檔中規定, 物理地址的位數最大只有 48 bits ,最多只有4級查找。 |
首先要了解各個結構的定義,只需要關心目前所需要的位即可。
N 是由處理器支持的物理地址寬度決定的,可以通過 CPUID 查詢到支持的長度。
若后面不再找表,而是直接映射地址(1G),則 Bit 7 置 1;置 0 則繼續索引,后面的表同理。
下面再來看詳細的步驟(假設已經得到一個 GPA 地址 X ):
EPTP 存儲在 VMCS 中,可以查找到。通過 EPTP 的 51:12 位,可以查找到 PML4 的 HPA,再通過 X 中的 47:39 位定位到具體的條目(PLM4E)。因此得到的最終的 HPA 地址如下:
— Bits 63:52 都是 0
— Bits 51:12 來自於 EPTP 的 12:51 位
— Bits 3:11 來自於 X 的 47:39 位,29 因此有 512 個條目
— Bits 2:0 都是 0
以上組成的地址(64位)即可索引到真實機物理地址上存儲的 PLM4E。
PML4E 中的 51:12 不能映射地址,只能表示 PDPT 的實際物理地址。和第一步的方法相同,PDPT 的物理地址由以下組成:
— Bits 63:52 都是 0
— Bits 51:12 來自於 PML4E 的 51:12 位
— Bits 3:11 來自於 X 的 38:30 位,同樣有 512 個條目
— Bits 2:0 都是 0
以上組成的地址(64位),即可索引到真實機物理地址上存儲的 EPT PDPTE。
PDPTE 中的 51:12 既可以映射 1G 的頁(該目錄 7th bit 為 1),也可以繼續向下索引,若直接映射地址則該頁所在的物理地址由以下幾部分組成:
— Bits 63:52 are all 0
— Bits 51:30 are from the EPT PDPTE
— Bits 29:0 are from the X (GPA 的 29:0 ),其中 12:29 全 0, 11:0 是標志位
可找到 1GB 大小的頁地址。若 CPU 支持的物理地址寬度(小於等於 51)為32位則為 30:31 兩個 bit 有效,索引共 4G 的頁,此時 32:51 為 0。
若繼續向下索引則 PDE 的物理地址由以下幾部分組成:
— Bits 63:52 都是 0
— Bits 51:12 來自於 PDPTE 的 51:12 位
— Bits 11:3 來自於 X 的 29:21 位,同樣有 512 個目錄
— Bits 2:0 都是 0
若 EPT PDE 映射 2MB 的頁(該目錄 7th bit 為 1),則該頁所在的物理地址(64 bits)由以下幾部分組成:
— Bits 63:52 是屬性標志位或 ignored
— Bits 51:21 來自 PDE
— Bits 20:0 are from the X (GPA 的 20:0 ),其中 20:12 都為 0,Bits 11:0 是標志位
管理的最小單位大小為 221 = 2 MB 。若 CPU 支持的物理地址寬度為 32 位則 31:21 為有效值,51:32 全 0 。
若繼續向下索引則 PTE 的物理地址由以下幾部分組成:
— Bits 63:52 are all 0.
— Bits 51:12 are from the EPT PDE.
— Bits 11:0 are from 20:12 of the X
以上所組成的64位地址,可以找到 PTE 在真實機上存儲的物理地址。
PTE 只能映射一個 4KB 的頁,該頁的物理地址由以下幾部分組成:
— Bits 63:52 are all 0.
— Bits 51:12 are from the EPT PTE.
— Bits 11:0 are from 11:0 of the X.
以上所組成的64位地址即可訪問到 4KB 的頁在實際物理地址中的位置。
下圖是從 PML4 一直映射到 PTE 的結構圖: