VMX概要
两类软件:VMM(虚拟机监视器)和客户软件(VM客户机)
VMX模式中的两种VMX cpu操作级别:vmx root 和vmx non-root,两种级别之间的称为VMX转换(VMX Transition).
VM entries:从vmx root级别切到vmx non-root级别
VMX模式与非VMX模式的区别:可以使用VMX指令,并且特定控制寄存器的值的加载有限制
对客户机来说,没有软件可见的方法来判断是否处理vmx non-root模式中,这样使得客户机不知道自己是否运行一个虚拟机中。
VMX模式指令:VMXON VMXOFF VMXLAUNCH VMXRESUME……
VMCS(虚拟机控制结构体):通过一个64bit的指向VMCS的指针管理,读写指针指令:VMPTRST,VMPTRLD,读写结构体指令:VMREAD,VMWRITE,VMCLEAR. 多CPU的虚拟机可以为每一个CPU创建一个VMCS。
检测是否支持vmx架构:cpuid.1:ecx.vmx[bit5] = 1
vmx特性(能力集):通过检查VMX capability MSRs,
启用vmx:CR4.VMXE[bit 13] = 1, IA32_FEATURE_CONTROL MSR[bit 0 1 2] = 1
一个逻辑处理器与一个内存区(4k-aligned)和响应的VMCS关联。该内存区叫做VMCS region。软件使用一个64位的物理地址指针引用VMCS region。
一个逻辑处理器可以维护多个处于active状态的VMCS。在特定的时间,只有一个active的VMCS是current VMCS. VMLAUNCH, VMREAD, VMRESUME, VMWRITE指令进仅当前的VMCS进行操作。
VMCS的状态:active/inactive, current/non-current, launched/clear, 【具体查看状态变迁图】
VMCS结构的组织:前32bit为VMCS revision identifier,紧接着是32bit的vmx-abort indicator,后面是VMCS数据(不同的实现组织方式不一样)
VMCS data分为6个组成部分:
1. 客户机状态区。cpu状态保存在这里,进入时加载,退出时保存。
2. 宿主机状态区。退出客户机时从这里恢复宿主机的状态信息。
3. VM-excution 控制域。
4. VM-exit 控制域。
5. VM-entry 控制域。
6. VM-exit 信息域。该域描述了vm-exit的情况和原因,只读。
3,4,5有时候合起来叫VMX controls
VMX架构定义了两种控制切换:VM entries、VM exits,合起来称为VMX转换。
分页细节:
VMX转换同时修改CR0, CR4, IA32_EFER状态寄存器,所以可以在不同的分页模型中切换。
-- VM entries允许从IA-32分页直接迁移到其他32-bit分页模型,或者PAE分页
-- VM exits反过来,允许其他32-bit分页、PAE分页切换到IA-32分页
VMX转换变成PAE分页的时候,会加载PDPTE寄存器
-- VM entries从CR3寄存器里的地址或者从VMCS(虚拟机控制结构)里加载PDPTE寄存器值
-- VM exits从CR3寄存器里的地址加载PDPTE寄存器
VMX转换会使TLB无效、分页结构体(paging-structure)缓存无效,这通常基于特定的控制设置。
VMX对地址转换的支持,与分页直接关联的有两种特性:VPIDs(虚拟处理器id),EPT(扩展页表)
VPIDs提供一种为软件提供了一种方法来区分不同‘虚拟处理器’的地址空间,处理器可以用该方法来同时维护TLB中多个地址空间的信息和分页结构体的缓存。
使用EPT时,分页结构体里的地址不直接用于访问物理内存或者内存映射的IO地址。它们被当成客户机的物理地址,通过一堆EPT分页结构体来转换一下产生实际的物理地址
EPT可以设置自己的内存类型和页面的权限设置。