第10章:VT 技術(簡單了解+EPT 機制)


VMM:Virtual Machine Monitor,虛擬機監控器。也稱為 “Hypervisior”,特權層(Ring -1),能夠監控操作系統的各種行為。
VMX:Virtual Machine Extension,虛擬機擴展。是 CPU 提供的一種功能。
VMCS:Virtual-Machine Control Structure,虛擬機控制結構,一塊內存區域。
APIC:Advanced Programmable Interrupt Controller 高級可編程中斷控制器,硬件設備
MSR:Model Specific Register,一組64位寄存器,通過 RDMSRWRMSR 進行讀寫操作。命名以 IA32_ 為前綴,一系列用於控制 CPU 運行、功能開關、調試、跟蹤程序執行、監測 CPU 性能等方面的寄存器

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 的結構圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM