VMXON
从INTEL手册31章(31.5)
开始
- 创建vmxon所需要的4K非分页内存,为VMXONRegion,传入vmxon的参数时,需要换算成物理地址,然而分别传入所分配地址的物理地址的低地址和高地址。
- 通过
rdmsr 480
结果的后31位读取版本号
并以此版本号初始化g_VMXCPU.pVMXONRegion非分页内存的首字节。 -
检查VMXON是否开启成功
填写VMCS
- 初步概览
- Guest state fields
- Host state fields
- vm-control fields (INTEL 24.6,24.7,24.8)
3.1 vm execution control
3.2 vm exit control
3.3 vm extry control
(24.6.1 Pin-Based VM-Execution Controls)
即读取rdmsr 0x481
,获取结果的高32位(原来是1的表示这些位可以设置为1,原来是0的必须设置为0,and运算);低32位(原来是1的这些位必须设置为1,原来是0的可以设置为0,or运算)24.6.2 Processor-Based VM-Execution Controls
VMLAUNCH
vmcs 虚拟机控制结构(VirtualMachineControlStructure)
VMX非root操作和VMX转换是由一个称为虚拟机控制结构(的VMCS)数据结构所控制。
访问VMCS结构是通过一个被称为VMCS指针的处理器状态组件所管理的(每个逻辑处理器一个)。该VMCS指针的值是VMCS结构的64位地址。VMCS结构指针利用VMPTRST指令和VMPTRLD指令来读取和写入。VMM使用VMREAD,VMWRITE和VMCLEAR指令配置VMCS结构。
VMM可以为每个虚拟机使用不同的VMCS。对于具有多个(虚拟处理器)逻辑处理器的虚拟机,VMM可以为每个虚拟处理器使用不同的VMCS。
vmclear
MS文档
(INTEL手册31.6中)
- VMLaunch启动失败错误查询
通过Vmx_VmRead(VM_INSTRUCTION_ERROR)
(VM_INSTRUCTION_ERROR为0x00004400)获取错误码
然后在INTEL手册30.4中查询对应的错误码VM-Instruction Error Numbers - VMExit Reason错误查询
INTEL手册24.9
如果最高位为1,则表示VM ENTRY ERROR表示第一次进入VM错误,(而不是一般的VM EXIT),低位的BasicrReason可以在INTEL附录C
中查询