硬件虛擬化 之VMCS結構

/* VMCS結構:
* 1. Guest-state area: //客戶機狀態域(如vmware) , 進入VMM時保存 離開VMM時恢復
Cr0, Cr3, Cr4
Dr7
Rsp, Rip 或對應的32位寄存器
所有段選擇子(包括16位選擇子號,段基址,訪問權限,段大小)
GDTR,LDTR
以下MSR:
IA32_DEBUGCTL
IA32_SYSENTER_CS
IA32_SYSENTER_ESP & EIP
IA32_PERF_GLOBAL_CTRL
IA32_PAT
IA32_EFER
SMBASE寄存器

Activity State(32bit) //CPU活動狀態
0: Active //活動中
1: HLT //正在執行HLT指令
2: ShutDown //由於3次錯誤,導致關機
3: Wait-for-SIPI //等待主虛擬CPU,發送啟動Startup-IPI

Interruptibility State(32bit) //可中斷性狀態
bit[0]: Blocking by STI //表示STI屏蔽目前生效中
bit[1]: Blocking by mov SS //表示MOV SS屏蔽目前生效中
bit[2]: Blocking by SMI //表示SMI屏蔽目前生效中
bit[3]: Blocking by NMI //表示NMI屏蔽目前生效中
bit[31:4]: 0 //保留位, 非零會錯誤

Pending debug Exceptions(64/32bit)
bit[3:0]: B3-B0 // 每一位表示對應的斷點狀態, DR7沒有設置為會陷入VMM狀態
bit[11:4]: 保留位 // 清零, 非零則VM entry失敗
bit[12]: enabled bp // 表示最小有一個或多個數據斷點或I/O斷點 斷下 並且他已在DR7激活
bit[14]: bs // 表示該調試異常會觸發單步異常
bit[15]: 保留位 // 清零, 非零則VM entry失敗
bit[16]: RTM // 表示調試事件發生在RTM區域
bit[63:17]: 保留位 // 清零, 非零則VM entry失敗

VMCS Link Pointer(64bit) // 如果VMCS Shadow = 1時生效, 那讀寫vmcs則在這個VMCS中讀寫, 否則在原有VMCS讀寫(可利用?)
// 不用時全設置為1

vmx-preemption timer value(32bit) // activate VMX-preemption timer = 1 生效
// 設置搶占式計時器的值

Page-directory-pointer-table entry(64bit) // Enable EPT = 1 時生效
// PDPTE類似於X86 頁表項

Guest Interrupt status(16bit) // virtual-interrupt delivery = 1時生效
Request virtual interrupt // 位8位,
Servcing virtual interrupt // 高8位

PML Index(16bit) // Enable PML = 1 時生效 , PML表索引 / PML address VM-exec. 基址 , 索引範圍為0~511 ,
// 以上生效時, 同時設置EPTP[6]設置為1, 如這個位為1 則:把所有訪問當成寫入,並設置dirty bit
// 對應項用於設置曾被訪問標誌(bit[8], 訪問時設置) 及 dirty bit (bit[9], 寫入時設置)
// 保存EPT PML4物理地址(4字節對齊) 類似頁目錄
// Ia32VmxEptVpidCapMsr 可以知道是否支持PML

* 2. Host-state area //宿主機狀態域(物理機器), 離開VMM時保存 進入VMM時恢復
只有Guest-state area的寄存器域

* 3. VM-execution control fields // 這個vm的設置
3.1 Pin-based VM-execution control: // 要查看MSR保留位如何設置
External-Interrupt exiting // 是否捕獲外部中斷
NMI Exiting // 是否捕獲nmi中斷
virtual NMI // 是否捕獲虛擬NMI中斷
Activate VMX-Preemption Timer // 激活搶占式計時器
Process posted interrupts //

3.2 Processor-based VM-execution control //分為主要字段 及 次要字段
3.2.1 Primary Process-based VM-exec. control(32bit): //主要字段

bit[2]: Interrupt-Window //任意指令RFLAGS.IF = 1 以及沒有屏蔽中斷則陷入VMM
bit[3]: Use TSC offseting //MSR時間寄存器相關
bit[7]: HLT exiting //執行HLT指令時 , 是否發生VMEXIT(陷入VMM)
bit[9]: INVLPG exiting //同上
bit[10]: MWAIT exiting //同上
bit[11]: RDPMC exiting //同上
bit[12]: RDTSX exitng //同上
bit[15]: CR-3 loading //寫入CR3的值,是否發生VMEXIT
bit[16]: CR-3 store //讀取CR3的值,是否發生VMEXIT
bit[19]: CR-8 loading //同上
bit[20]: CR-8 loading //同上
bit[21]: Use TRP shadow //是否使用TRP虛擬化/ APIC虛擬化
bit[22]: NMI-Window exiting //沒有NMI屏蔽時, 任何指令都產生VMEXIT
bit[23]: MOV DR exiting //執行mov dr 指令 是否發生VMEXIT
bit[24]: Unconditional I/O //無條件I/O, 是否在執行任意I/O指令時發生VMEXIT
bit[25]: Use I/O bitmap //I/O位圖 , 如使用I/O bitmap, 則忽略無條件I/O
bit[27]: Monitor trap flag //是否監視單步異常
bit[28]: Use MSR bitmaps //是否使用MSR寄存器位圖 來控制RDMSR及WRMSR指令
bit[29]: MONITOR exiting //執行MONITOR 是否VMEXIT
bit[30]: PAUSE exiting //執行PAUSE 是否VMEXIT
bit[31]: Activate Secondary Control //是否使用次要字段(激活ept功能的表)

3.2.2 Secondary Process-based VM-exec. control(32bit): //次要字段
bit[0]: Virtual APIC access //APIC虛擬化相關
bit[1]: Enable EPT //是否啟用EPT頁表
bit[2]: Descriptor table exiting //執行描述符操作時 是否產生VMEXIT
bit[3]: Enable RDTSCP //執行RDTSCP 是否產生#UD
bit[4]: Virtualize x2APIC //APIC虛擬化相關
bit[5]: Enable VPID //虛擬cpu id 用於緩沖對應的線性地址, 提高效率
bit[6]: WBINVD exiting //WBINVD指令 是否產生VMEXIT
bit[7]: Unrestricted guest //決定客戶機可以運行在非分頁保護模式 或 實模式
bit[8]: APIC-register virtualization //APIC虛擬化相關
bit[9]: Virtual-interrupt delivery //中斷虛擬化 以及模疑寫入APIC的寄存器 控制中斷優先級
bit[10]: PAUSE-loop exiting //
bit[11]: RDRAND exiting //執行RDRAND 是否產生VMEXIT
bit[12]: Enable INVPCID //執行INVPCID 是否產生#UD異常
bit[13]: Enable VM function //是否啟動VMFUNC
bit[14]: VMCS Shadowing //VMREAD/VMWRITE 訪問影子VMCS
bit[16]: RDSEED exiting //RDSEED 是否產生VMEXIT
bit[17]: Enable PML //是否啟用Page-modification log, 訪問內存時設置dirty bit
bit[18]: EPT-violation (#VE) //訪問的虛擬物理地址 沒有在EPT中找到(一開始只有連續的內存塊存放到EPT頁表)
bit[20]: Enable XSAVES/SRSTORS //XSAVES/XRSTORS 是否產生#UD異常
bit[25]: Use TSC scaling //執行RDTSC/RDTSCR/RDMSR指令, 是否返回被修改的值
3.3 Exception Bitmap(32bit) //異常位圖, 異常發生時->在32bit選出1位, 如這個位的值是1, 異常則產生VMEXIT, 否則正常地由IDT處理
3.6 VM-Function Controls(64bit) //次要字段:Enable VM function = 1 , 以及設置功能號時使用(除功能號外其他置0)
3.7 I/O Bitmap Address(64bit physical address) A/B //use I/O bitmaps = 1 時使用
A包含: 0000~07fff
B包含: 8000~fffff
3.8 Time-stamp Counter Offset and Multipler (64bit) //跟時鐘有關係
3.9 Guest/Host masks CR0/CR4 //寫入CR0/CR4 的mask 誰寫入誰擁有讀寫這個寄存器的權
3.10 read shadow for CR0/CR4(32/64bit) //讀取cr0 或cr3,讀取的時侯,返回對應的read shadow中的值
3.11 CR3-Target controls(32/64bit) //有4個cr3-target values 以及 1個cr3-target count
//CR3-count = N, 等如只考慮首N個CR3 是否一樣, 如果一樣,則陷入VMM
//CR3-count = 0, 則寫入CR3時無條件發生VMEXIT, 陷入VMM
3.12 Control for APIC Virtualization
物理上:
- LAPIC如果在xAPIC模式, 則可以透過內存映射訪問LAPIC寄存器, 其物理地址在IA32_APIC_BASE MSR
- LAPIC如果在x2APIC模式, 則可以透過RDMSR或WRMSR讀寫LAPIC寄存器
- 64位模式, 可以使用MOV CR8, 訪問TPR
虛擬上:
APIC-access Address(64bits) //如virtualize APIC accesses = 1 時生效 , = 0 則不存在
Virtual-APIC Address(64bits) //如上,及Use TPR shadow = 1(只存在於這樣設置的CPU核心)
//但地址指向4kb的物理地址,為虛擬APIC頁
//用於虛擬化中斷 和讀寫APIC寄存器
TPR threshold(32bits) //如

3.13 MSR-Bitmap address //Use MSR bitmap = 1, 如讀寫msr時, ecx在範圍內 則產生VMEXIT 陷入VMM
Read bitmap for low MSRs [000000000~00001FFF]
Read bitmap for high MSRs [C00000000~C0001FFF]
Write bitmap for low MSRs [000000000~00001FFF]
Write bitmap for high MSRs[C00000000~C0001FFF]
3.14 Executive-VMCS Pointer //用於SMM+SMI 這裡沒用
3.15 EPT Pointer(64bits) //enable EPT = 1 時有效
bit[2:0] - Memory Type //EPT類型: 6-回寫/0-不可緩沖 , 應查看MSR IA32_VMX_EPT_VPID_CAP 支持的EPT類型
bit[5:3] - Page walk lenght //EPT總層數
bit[6] - enabled accesses/dirty bit //上面解釋了, 不是所有CPU支持這個功能, 應查看MSR 同上
bit[11:7]- 保留為 //清0
bit[N-1:12] - 4KB對齊的PML4物理地址 //N代表是否物理地址寬度, 例如EAX的物理地址寬度為[7:0]
3.16 VPID //虛擬cpu的id,用於清除TLB緩沖區
3.17 Control for PAUSE-Loop exit(32bit field) //PLE_GAP / PLE_WINDOW
3.17 Page-Modification Logging(64bit address) //次要字段:Enable PML = 1 時使用
3.18 VM Function Control //控制調用的VM函數, 比如調用號為0 那就把0位設置為1 其他置0
3.19 vmcs shadowing bitmap address(64bit physical addr)// VMCS Shadowing = 1, vmread / vmwrite 訪問這個地址 而不是原設的vmcs
3.20 Virtualization Exception //包含地址,錯誤描述的地址,eptp index : 發生錯誤的eptp索引
3.21 xss-exiting bitmap //enable XSAVES/XRSTORES = 1, 則使用他們時會訪問這個BITMAP 而不是xss寄存器
* 5. VM-exit control fields

* 6. VM-entry control feilds

* 7. VM-exit information fields
*/

Comments

Popular posts from this blog

Android Kernel Development - Kernel compilation and Hello World

How does Nested-Virtualization works?

Understanding ACPI and Device Tree