熟悉Intel VT的人都知道. 使用VT的过程, 基本上就是操作VMCS结构的过程. 这个结构非常的大. 非常复杂, 基本上和VT有关的东西都在这里.

*这里是按照Intel 手册描述的VMCS的数据区组成部分依次填写 详细信息参考[开发日志2].VMCS数据区总共6个组成部分. 分别是 1.客户区状态域(Guest State Area) 2.宿主机状态域(Host State Area ) 3.虚拟机运行控制域( VM-Execuction Control Fields ) 4.VMEntry行为控制域( VM-Entry Control Fields ) 5.VMExit行为控制域( VM-Exit Control Fields ) 6.VMExit相关信息域( VM-Exit Information Fields )(只读)

1.客户区状态域(Guest State Area):

1.1客户机寄存器状态内容(Guest Register State ) 控制寄存器: CR0, CR3, CR4 调试寄存器: DR7 Esp, Eip, 和Eflags CS, SS, DS, ES, FS, GS, LDTR, TR选择子, 基址, 段长, 属性 GDTR, IDTR, 基址, 段长 一些MSR寄存器的值, IA32_DEBUGCTL, IA32_SYSENTER_CS, IA32_SYSENTER_ESP, IA32_SYSENTER_EIP,IA32_PERF_GLOBAL_CTRL, IA32_PAT, IA32_EFER

1.2客户机非寄存器状态内容(Guest Non-Register State )

活动性状态(Activity State):活跃的(Active), 中断的(hlt), 关闭的(Shutdown), 等待SIPI中断(Wait-for-SIPI)只有活跃的可以自行Guest指令, 其他都表示发生错误

中断能力状态

推迟调试异常

VMCS连接指针(保留)

VMX抢占计时器

PDPTE项(开启了EPT模式会用到此域)PDPTE0-PDPTE3

2.宿主机状态域(Host State Area ): 这个域只存储Hypervisor的寄存器信息, 在发生#VMExit事件的时候恢复到相应寄存器 控制寄存器: CR0, CR3, CR4 Esp,Eip CS, SS, DS, ES, FS, GS和TR寄存器, 选择子 FS, GS, TR, GDTR, IDTR信息, 基址 一些MSR寄存器, IA32_SYSENTER_CS, IA32_SYSENTER_ESP, IA32_SYSENTER_EIP,IA32_PERF_GLOBAL_CTRL, IA32_PAT, IA32_EFER

3.虚拟机运行控制域(VM-Execution Control Fields ): 这个域用来控制CPU在Non-Root模式下运行行为, 控制某条指令是否产生VM-Exit,还有异常 和中断的配置, 可以看出来, 这个地方很重要了. 要控制什么指令.中断, 异常.产生异常,就是配置这里

3.1基于针脚的虚拟机执行控制(Pin-Based VM-Execution Controls ): 管理中断等异步事件, 如果启用抢占计时器就是在这个域中设置的. 设置要参考IA32_VMX_PINBASED_CTLS和IA32_VMX_TRUE_PINBASED_CTLS两个MSR寄存器的值

3.2基于处理器的虚拟机执行控制(Processor-Based VM-Exection Controls ): 这里就是配置一些指令是否产生#VM-Exit事件的地方了, 还有师傅开启EPT地址翻译 开启VPID, 开启虚拟APIC

3.3异常位图(Exception Bitmap): 该域32位长, 每一位代表当某种异常发生时, 硬件会自动产生#VM-Exit时间, 如果某位 为0, 表示这个异常会通过IDT表正常处理. 要捕获异常就是这里了.当然缺页在另外地方配置

3.4IO位图地址(IO Bitmap Addresses ): 64位长的物理地址, 指向两块IO位图, 只有在Primary Processor-Based VM-Execution Controls.Use I/O Bitmaps[bit 25]=1的情况下才会被使用. 在处理IO指令时根据位图相应产生#VM-Exit.地址要4K对齐

3.5时间戳计数器偏移(Time-Stamp Counter Offset ): 当Guest 利用RDTSC TDTSCP指令或者访问IA32_TIME_STAMP_COUNTER MSR寄存器的时候, 得到的结果是 真实的值+上这个偏移量的和

3.6虚拟机/Hypervisor屏蔽和 CR0/CR4访问隐藏设置: 这个域主要对CR0/CR4进行保护, 虚拟机/Hypervisor屏蔽中置位1的部分说明会产生#VM-Exit事件.

3.7 CR3访问控制. 包含最多4个CR3目标值, 如果是这几个CR3中的一个那么赋值CR3的时候不产生#VM-Exit

3.8 APIC访问控制:

VT技术对APIC的虚拟化, 这边先不管

3.9 MSR 位图地址(MSR Bitmap Address ): 指向MSR位图区域的物理地址, 当Primary Processor-Based VM-Execution Controls.Use MSR Bitmaps[bit 28 ] = 1 使用, MSR位图4K大小, 当配置好时, 相应的MSR访问会产生#VM-Exit.

3.10 执行体VMCS指针(Executive-VMCS Pointer ): 64位, 用于VT技术对系统管理中断(SMI)和系统管理模式(SMM)进行监管.

3.11 EPT指针( Extended Page Table Pointer ): 指向EPT页表的基地址(EPML4级页表的物理地址)以及一些EPT的配置信息. 当Secondary Processor-Based VM-Execution Controls.Enable EPT[bit 1]=1时启用.

3.12 虚拟机标识符(Virtual Processor Identifier, VPID): 虚拟机标识符16位长, 当Secondary Processor-Based VM-Execution Controls.Enable EPT[bit 5]=1时启用

4.VMEntry行为控制域( VM-Entry Control Fields ) : 定义在#VM-Entry事件发生后, 硬件要立即做的事情

4.1 #VM-Entry 基本操作控制设置 1.加载调试寄存器内容, (DR7, IA32_DEBUGCTL MSR 寄存器. 2.虚拟机是否进入x64模式, x86用于为0 3.进入系统管理模式 4.关闭Dual-Monitor Treatment 5.加载IA32_PERF_GLOBAL_CTRL MSR寄存器 6.加载IA32_PAT MSR寄存器 7.加载IA32_EFER MSR寄存器

4.2 #VM-Entry MSR寄存器操作控制设置 这个域可以配置在进入#VM-Entry的时候加载一些有关虚拟机状态的MSR寄存器.

4.3 #VM-Entry 注入事件控制设置 #VM-Entry可以在所有虚拟机状态恢复完毕后, 通过客户机IDT表触发一个中断.通过这个域配置

5.VMExit行为控制域( VM-Exit Control Fields ): 定义在#VM-Exit事件发生后, 硬件要立即做的事情.

5.1 #VM-Exit 基本操作控制设置 1.保存调试寄存器内容, (DR7, IA32_DEBUGCTL MSR 寄存器. 2.Hypervisor地址空间大小(x86永远为0) 3.加载IA32_PERF_GLOBAL_CTRL MSR 寄存器 4.VMExit保留外部中断原因信息(Acknowledge Interrupt on Exit ) 5.保存IA32_PAT MSR寄存器 6.加载IA32_PAT MSR寄存器 7.保存IA32_EFER MSR寄存器 8.加载IA32_EFER MSR寄存器 9.保存VMX抢占计时器值.

5.2 #VM-Exit MSR寄存器操作控制设置 和#VM-Entry类似

6.VMExit相关信息域(只读区域)

6.1 #VM-Exit事件基本信息区(Basic VM-Exit Information): 1. 退出原因( Exit Reason) 2. 退出条件( Exit Qualification ) 3. 客户机线性地址( Guest-Linear Address ) 4. 客户机物理地址( Guest-Physical Address )

6.2 向量化事件 #VM-Exit 信息区(VM Exits Due to Vectored Events ): 1. #VM-Exit中断信息 2. #VM-Exit中断异常号

6.3 事件分发时#VM-Exit信息区(VM Exits Occur During Event Delivery): 1. IDT向量表信息 2. IDT向量表异常号

6.4 指令执行时VMExit信息区(VM Exits Due to Instruction Execution ): 1. VMExit指令长度 2. VMExit指令信息 6.5 VM指令错误信息区(VM Instruction Error Field ): 描述了执行虚拟机操作指令, 发生的最后一个Non-Faulting 错误的信息