导图社区 Vol3-24-虚拟机控制结构VMCS
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
编辑于2022-09-16 17:12:04 上海Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
社区模板帮助中心,点此进入>>
Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
虚拟机控制结构VMCS
简介(好像不太像简介)
在VMX Operation中使用VMCS
管理VMX non-root operation的进出(VM entries/VM exits)
管理VMX non-root operation中的处理器行为
由指令 VMCLEAR, VMPTRLD, VMREAD,VMWRITE管理
每个逻辑核都可以有一个VMCS
VMCS Region
逻辑核将内存中的一块区域和每个VMCS关联起来
使用64bit的VMCS Region Pointer寻址VMCS Region
必须4K边界对齐(bit 0:11 为0)
Region Pointer的宽度不能超过处理器的逻辑地址宽度
1. 处理器宽度可以由CPUID的80000008H查得 2. IA32_VMX_BASIC[48]被读为1时,Pointer的63:32bit不能设置
VMCS Region最多需要4KB就可以完成工作,但是具体实现大小各不相同
逻辑核可以维护多个活动的VMCS
处理器可以通过维护内存中,处理器上或 同时两者上的活动VMCS的状态来优化VMX Operation
某个时刻,最多有一个 current VMCS
VMLAUNCH, VMREAD, VMRESUME,VMWRITE指令只作用于 current VMCS
逻辑核如何确定哪些VMCS处于 活动状态以及哪个是current VMCS
VMPTRLD指令的存储操作数是VMCS的地址, 该指令执行后,该VMCS就是逻辑核上的活动和current VMCS. 其他之前活动的VMCS依旧是活动的,只是不再是current VMCS
current VMCS中的VMCS link Pointer 域是该VMCS的地址 如果将"VMCS shadowing"这个VM-exexcution控制设为1, 使VM entry成功执行,则VMCS link Pointer 域指向的VMCS 在逻辑核上变为活动状态。current VMCS不变.
??? current VMCS含有指向自己的地址吗?
VMCLEAR的存储操作数也是VMCS的地址,该指令执行后,该VMCS将既不是Current VMCS,也不是活动VMCS,如果该VMCS之前一直是当前核的current VMCS,那么该核将暂时不存在current VMCS.
VMPTRST指令将逻辑核的current VMCS的地址存储到一个特定的地方,如果不存在current VMCS,就会存储FFFFFFFF_FFFFFFFFH
VMCS的launch state决定 该VMCS应该使用哪个VM entry指令
VMLAUNCH对应的launch state为'clear'
VMRESUME对应的launch state为'launched'
逻辑核将VMCS的launch state维护在对应的VMCS Region里
逻辑核对VMCS的launch state的管理
如果current VMCS的launch state为'clear', VMLAUCH指令 的成功执行会将launch state变为'launched'
VMCLEAR的存储操作数为一个VMCS的地址, VMCLEAR成功执行后,那个VMCS的launch state变为'clear'
没有其他方法修改一个VMCS的launch state(不能被VMWRITE修改), 也没有直接方法找到VMCS的launch state(不能被VMREAD读到).
图中圆圈中的状态均为X的状态
VMPTRLD X使X变为active和current,launch state变为clear
VMPTRLD Y使X不再为current,因为Y变为了current
VMLAUNCH使X(X为current,launch state为clear)的launch state变为launched
VMCLEAR X使X变为inactive、not current,X的launch state变为clear
这幅图没有说明当X为current时,进行VMPTRLD X会发生什么
注意,即使X这个VMCS没有定义(如没有初始化),VMCLEAR X也会变为inactive, not current, clear
由于 shadow VMCS不能用于VM entry,所以shadow VMCS的launch state没有意义
VMCS和其他相关结构的软件操作
VMCS的软件使用
任何一个VMCS都不应在多个逻辑处理器上处于活动状态.
如果一个VMCS要从一个逻辑核迁移到另一个上,那么在其他核为该VMCS执行VMPTRLD之前,第一个逻辑核要为该VMCS执行VMCLEAR,不遵循该原则可能会导致VMCS崩溃
当VMCS是active状态时,软件不应该修改VMCS Region中的shadow VMCS indicator的值,否则会导致VMCS崩溃.在修改VMCS Region中的shadow VMCS之前,应该对该VMCS执行VMCLEAR,确保该VMCS处于非active状态.
软件应该使用VMWRITE/VMREAD访问current VMCS的不同域,而不是使用常规内存操作指令(MOV啥的). 原因1. 因为VMCS是实现不同,结构也不同,难以用常规内存操作获得正确结果. 原因2.部分VMCS信息保存在CPU内,常规内存操作无法获取全部VMCS信息. 软件可以在执行VMPTRLD之前移除任何指向VMCS Region的线性地址,在执行VMPTRLD之后不再将VMCS Region映射到任何线性地址
如果一个逻辑核离开了VMX 操作,那么该逻辑核上的任何active VMCS都可能会崩溃. 为了避免离开VMX操作导致后续可能要重新使用的VMCS崩溃,或者在另一个逻辑核上重新使用该VMCS时异常,应该在执行VMXOFF(离开操作)之前执行VMCLEAR
VMWREAD/VMWRITE和VMCS域的编码
VMCS的每个子域都与一个32bit值(即其编码)相关联. 当软件想访问某个子域时,该编码提供给VMREAD/VMWRITE一个操作数. 在64bit模式时,如果给该操作数提供一个超过32bit的编码,则会造成错误. 每个子域的编码都具有右边的格式.
Field width,编码宽度
Field type,VMCS field的类型,由control,guest-state,host-state,VM exit information.
Index, 与其它具有相同编码宽度和类型的VMCS区别开来
Access type,除了64bit域,bit0必须为0,VMREAD/VMWRITE使用bit0为0的编码访问整个域. 如果该域设置为1,那么VMREAD/VMWRITE使用该域bit0为1的编码访问高32bit
对于不同的编码宽度,VMWRITE/VMREAD有不同的行为
软件在IA32-e模式外修改64bit域时,应该先修改低32bit,再修改高32bit
软件在IA32-e模式外读64bit域时,顺序不重要
VMCS初始化
在使用VMCS做VM entry操作之前,应该用VMWRITE初始化VMCS的域
没必要初始化处理器不用或不支持的VMCS子域
处理器自身维护无法使用VMWRITE编辑的VMCS信息,如VMCS的launch state,此类信息被保存在VMCS Region的data区域. 此类信息和实现相关,因此软件在分配了一块区域当VMCS Region时,无法知道处理器如何从内存区域的内容中确定此类信息.
VMCLEAR能够在作为其操作数的VMCS中初始化任何基于特定实现的信息.为了排除基于特定实现的不确定性,应该在第一次使用VMPTRLD指令使VMCS处于active之前,执行VMCLEAR指令,之后第一次的VM entry操作应该使用VMLAUNCH. 再之后的每一次VM entry操作都应该调用VMRESUME,直到下一次对该VMCS使用VMCLEAR
一般来说,VMRESUME比VMLAUNCH延迟低. 由于将一个VMCS迁移到另一个逻辑处理器需要使用VMCLEAR,这样的迁移在下一次VM entry时需要使用VMLAUNCH,因此软件开发者可以通过减少不必要的VMCS迁移,来降低软件延迟.
软件对其他相关结构的访问
除了VMCS自身的data子域,VM non-root操作行为还会被VMCS中的指针指向的其他数据结构影响,如IO bitmap,虽然这些结构的指针属于VMCS,但这些数据机构本身并不属于VMCS,因此这些数据结构不能被VMREAD和VMWRITE访问,却能使用常规内存操作访问.
软件应该确保在修改这些数据结构时,没有处于non root操作模式的处理器的current VMCS引用这些数据结构
VMXON操作
在执行VMXON之前,软件分配了一块处理器用于支持VMX操作的内存区域(称为VMXON区域).这块区域的物理地址(VMXON pointer)作为操作数提供给VMXON,对于VMCS Pointer的限制对VMX pointer同样适用.
VMXON pointer必须4KB对齐
VMXON pointer不能设置超过处理器物理地址宽度的bit
在执行VMXON之前,软件应该将VMCS Revision Identifier写入VMXON Region
不需要对VMXON Region做其他任何初始化操作.
软件应该为每个逻辑处理器分配不同的VMXON Region,并且在VMXON和VMXOFF操作之间时,不应该对VMXON Region访问.
VMCS类型: ordinary/shadow
VMCS不是ordinary就是shadow
VMCS的类型在VMCS region的shadow-VMCS indicator查询(0-ordinary,1-shadow)
ordinary VMCS和shadow VMCS的区别
ordinary VMCS能用于VM entry,但是shadow不行
在non-root操作下可以用VMREAD/VMWRITE访问shadow但是不能访问ordinary
在root操作下,VMREAD/VMWRITE可以访问这两种VMCS
当VMCS是active状态时,软件不应该修改VMCS Region 中的shadow VMCS indicator的值,否则会导致VMCS崩溃
VMCS DATA的构成
Guest-state area.
当VM exits时,处理器的状态保存在该域, 当VM entry时,从该域读取处理器状态
Host-state area.
当VM exits时,从该域加载处理器状态
VM-execution control fields.
控制VMX non-root操作下的处理器行为. 决定VM exits的部分原因
VM-exit control fields.
控制VM exits
VM-entry control fields.
控制VM entry
VMX control
VM-exit information fields.
接收VM exits的原因和性质,部分处理器上该域为只读
详细说明
Guest-state area.
存储CR0、CR3、CR4、DR7、RSP、RIP、RFLAGS
存储段寄存器(CS、SS、DS、ES、FS、GS、LDTR、TR)的 selector、base address、segment limit、Access rights
GDTR、IDTR的Base address,Lmit
MSRs
SMBASE(逻辑核的SMRAM镜像的基地址)
还包括一些state,但没有对应的寄存器
Activity state
Active
HLT
Shutdown
Wait-for-SIPI
Interruptibility state
可以屏蔽某些event一段时间的功能
Pending debug exceptions
IA-32处理器能在不提交debug exception之前认出 debug exception,该域存储debug exception的相关信息
VMCS link pointer
如果“VMCS shadowing” VM-execution control是1, VMREAD和VMWRITE访问该域指向的VMCS,否则该域应该为全1
VMX-preemption timer value
此字段包含具有该设置的下一个VM ENTRY之后,VMX抢占计时器将使用的值。
Page-directory-pointer-table entries
PDPTEs(页目录指针表)
Guest interrupt status
虚拟中断相关
PML index
包含page-modification log的下一个entry的逻辑index
Host-state area.
CR0、CR3、CR4、RSP、RIP、selector、FS、GS、TR、GDTR、IDTR、MSRs
还有一些没有对应寄存器的状态,在VM exits时也会被加载
见27.5
VM-execution control fields.
Pin-Based VM-Execution Controls组成了一个32bit的向量,处理异步事件(如中断)
主要提供一些中断控制设置来影响VMX non-root操作下的处理器行为
Processor-Based VM-Execution Controls组成了2个(primary,secondary) 32bit向量,处理同步事件(主要是特定指令引发的事件)
Exception Bitmap
32bit,每bit代表一个异常,异常发生且对应bit为1,引发VM exits,不为1则走IDT
I/O-Bitmap Addresses
原理和Exception Bitmap差不多,就是配置由IO引发的VM exits
Time-Stamp Counter Offset and Multiplier
控制RDTSC、RDTSCP指令
控制RDMSR从IA32_TIME_STAMP_COUNTER MSR读指令
TSC offset + TSC值 = 返回到guest 软件
也由可能先乘后加,具体看相关域的设置
Guest/Host Masks and Read Shadows for CR0 and CR4
影响访问CR0和CR4的指令
GUEST尝试将其设置为与相应的读取shadow指令中 的相应位不同的值,从而导致VM exits
GUEST从相应的读取shadow指令中读取这些位的返回值
这些域设置为1时
不从shadow读取,直接从相应的控制寄存器返回
这些域设置为0时
CR3-Target Controls
CR3-target values 64bit
CR3-target count 32bit
如果源操作数匹配这些值中的一个,那么在VMX non-root操作下mov to CR3不会导致VM exits
如果CR3-target为n,那么不会导致VM exits的mov to CR3 操作只能有n个,第n+1个会导致VM exits
如果设置的CR3-target count大于4,VM entry会失败
CR3-target values 的值无限制
查询MSR IA32_VMX_MISC获得该value和count的支持的值
Controls for APIC Virtualization
软件访问逻辑核的local APIC的3条机制
如果loca APIC在xAPIC模式,它可以对IA32_APIC_BASE MSR中 的物理地址引用的4 KB页面中的地址执行内存映射访问
如果local APIC在x2APIC模式,它能使用RDMSR和WRMSR访问local APIC的寄存器
在64bit模式下,它能使用MOV CR8指令访问local APIC的TPR(任务优先级寄存器)
Processor-Based VM-Execution Controls中的5个域与该类访问有关
APIC-access address
包含了4k字节的APIC-access 页的物理地址,访问该页在某些情况下会导致VM exits
Virtual-APIC address
包含了4K字节的virtual APIC页的物理地址.处理器使用该页 来虚拟化对APIC寄存器的访问,也使用该页管理虚拟中断
TPR threshold
该域的3:0决定了阈值,低于该阈值时,VTPR的7:4bit不能下降.如果"virtual-interrupt delivery" VM-execution control为0,使VTPR的7:4bit下降的操作会导致VM exit
只有在支持1-setting of the “use TPR shadow” VM-execution control.的基础上,才会有TPR threshold
EOI-exit bitmap
只有在支持1-setting of "virtual-interrupt delivery" VM-execution control的处理器上才支持该域
决定哪个写入到APIC's EOI 寄存器导致VM exit
Posted-interrupt notification vector
该域只在处理器支持1-setting of the “process posted interrupts” VM-execution control时支持
低8bit包含了用以通知逻辑处理器虚拟中断已经发出的中断向量
Posted-interrupt descriptor address
该域只在处理器支持1-setting of the “process posted interrupts” VM-execution control时支持.
64K byte对齐的posted interrupt 描述符的物理地址
virtual-APIC可能被以下指令访问
MOV CR8
访问APIC-Access页,来访问virtual-APIC(有条件)
RDMSR、WRMSR(有条件)
如果VM-execution control中的'use TPR shadow'为1, VM entry会检查virtual-APIC是否4KB对齐. virtual-APIC 地址退出只在支持上面这个条件的处理器上支持.
MSR-Bitmap Address
在支持1-setting of the “use MSR bitmaps” VM-execution control的处理器上,VM-execution control field包含4个连续的MSR bitmaps的地址,每个maps大小为1KB.
Read bitmap for low MSRs
在MSR-bitmap地址上,包含地址在0-1FFFH内的MSR对应的bit, 该bit决定对相应MSR执行RMDMSR是否会引发VM exit.
Read bitmap for high MSRs
在MSR-bitmap地址+1024上,包含地址在C0000000-C0001FFFH内的MSR对应的bit, 该bit决定对相应MSR执行RMDMSR是否会引发VM exit.
Write bitmap for low MSRs
在MSR-bitmap地址+2048上,包含地址在0-1FFFH内的MSR对应的bit, 该bit决定对相应MSR执行WRDMSR是否会引发VM exit.
Write bitmap for high MSRs
在MSR-bitmap地址+3072上,包含地址在C0000000-C0001FFFH内的MSR对应的bit, 该bit决定对相应MSR执行WRDMSR是否会引发VM exit.
如果这些bitmaps被使用,RCX的值既不是bitmaps范围内的值,对应的MSR bitmaps 中的值也不是1,那么执行WRMSR/RDMSR就会引发VM exits
Executive-VMCS Pointer
Executive-VMCS Pointer是一个64bit的域,用来管理SMI和SMM
Extended-Page-Table Pointer (EPTP)扩展页表指针
EPTP包含EPT PML4 table的基地址,以及其他EPT配置信息
主要是一些页表属性配置
Virtual-Processor Identifier (VPID)
16bit,只在支持1-setting of the “enable VPID” VM-execution control的处理器上支持
Controls for PAUSE-Loop Exiting
只在支持 1-setting of the “PAUSE-loop exiting” VM-execution control的处理器上支持
VM-execution control域包含以下32bit域
PLE_Gap.软件可以将此字段配置为一个循环内的2个成功的PAUSE之间的上限间隔时间
PLE_Window. 软件可以将此字段配置为允许Guest在PAUSE循环中执行的时间上限
使用的计时器跟TSC频率相同
VM-Function Controls
VM-function controls构成了一个64bit的向量,该向 量控制在VMX non-root操作下的VMFUNC指令的使用
只在支持1-settings of both the “activate secondary controls” primary processor-based VM-execution control and the “enable VM functions” secondary processorbased VM-execution control的处理器上支持
EPTP switching
EPTP-list address
对EPTP的操作,改变EPT指针的值为EPTP list中的值
VMCS Shadowing Bitmap Addresses
只在支持1-setting of the “VMCS shadowing” VM-execution control的处理器上支持,如果支持,VMREAD和VMWRITE会询问这些bitmaps
VM-execution control fields 包含VMREAD和VMWRITE bitmap的64bit物理地址
每个bitmap 4KB,即32Kb
ENCLS-Exiting Bitmap
64bit,如果“enable ENCLS exiting” VM-execution control 为1,当该域的bit对应的EAX的值为1时,ENCLS的执行会导致VM exit;如果该域的bit对应的EAX的值为0时,指令正常运行.
ENCLV-Exiting Bitmap
行为类似于ENCLS-Exiting Bitmap
Control Field for Page-Modification Logging页修改日志
PML 地址为64bit.,4KB对齐. PML包含512个64bit entries,用于PML特性.
如果“enable PML” VM-execution control 为1,VM entry会确保PML地址是否为4KB对齐.
Controls for Virtualization Exceptions
在支持 1-setting of the “EPT-violation #VE” VM-execution control 的处理器上,VM-execution control field包含以下内容
virtualization-exception information address (64 bits). 该域包含virtualization-exception information area的物理地址,当一个逻辑处理器遇到一个虚拟异常,它会将异常信息保存到virtualization-exception information address
EPTP index. 当一个EPT violation 导致了一个虚拟异常,处理器将该域的值写到virtualization-exception information area,EPTP-switching VM function 更新该域
XSS-Exiting Bitmap
在支持1-setting of the “enable XSAVES/XRSTORS” VM-execution control的处理器上,VM-execution control 域包含一个64bit的XSS-exiting bitmap.
XSAVE和XRSTORS会查看该bitmap
Sub-Page-Permission-Table Pointer (SPPTP)
如果EPT的sub-page write-permission特性使能,EPT write permissions可能在128字节的粒度上决定.这些permission将由内存中的sub-page-permission structures的层级决定.
上面说的层级根需要参考sub-page-permission-table pointer(SPPTP),SPPTP包含根SPP表的基地址.
VM-exit control fields.
构成了一个32bit向量来操作VM exits
Save debug controls
决定DR7和IA32_DEBUGCTL_MSR是否在VM exit的时候保存.
支持虚拟机扩展的第一个处理器仅支持此控件的1设置。
Host address-space size
在支持Intel 64架构的处理器上,此控件确定在下 一个VM exit后逻辑处理器是否处于64位模式
每一次VM exit,该域的值都会加载到CS.L,A32_EFER.LME, IA32_EFER.LMA
Load IA32_PERF_GLOBAL_CTRL
决定在VM exit的时候IA32_PERF_GLOBAL_CTRL MSR是否被加载
Acknowledge interrupt on exit
影响由于外部中断导致的VM exits
如果VM exit时该域为1,那么逻辑处理器接管中断控制器,接手中断向量. 中断向量存储在VM-exit的interruption-information域,标记为有效.
如果VM exit时该域为0, 逻辑处理器不接管中断控制器, 中断向量存储在interruption-information 域,标记为无效.
Save IA32_PAT + Load IA32_PAT
决定在VM exit时IA32_PAT MSR是否被保存/加载
Save IA32_EFER + Load IA32_EFER
决定在VM exit时IA32_EFER MSR是否被保存/加载
Save VMXpreemption timer value
决定在VM exit时VMX-preemption timer是否被保存
Clear IA32_BNDCFGS
决定在VM exit时IA32_BNDCFGS MSR是否被清除
Conceal VMX from PT
如果该bit为1,在VM exit时,Intel Processor Trace不会产生一个paging information packet (PIP). 在 SMM VM exit时,不会产生一个VMCS packet
VM exits Controls
VM-exit MSR-store count
确定在VM exit时需要存储的MSR的数量.建议该值不超过512
VM-exit MSR-store address
包含需要在VM exit时保存的MSR的区域的地址.该区域为一个entry表,每个entry16字节,entry数量由上面的count提供.格式由table24-12提供,如果count不为0,那么该地址必须16byte对齐.
VM-exit MSR-load count
VM-exit MSR-load address
与上两个域类似,只是由store变为了load
VM-Exit Controls for MSRs
VM-entry control fields.
构成了一个32bit向量来管理VM entry的基础操作
load debug controls
决定DR7和IA32_DEBUG MSR是否在VM entry时载入
支持VMX的第一代处理器只支持该control设置为1
IA-32e mode guest
在支持Intel 64架构的处理器上,该control决定在 VM entry之后逻辑处理器是否处于IA-32e模式
在不支持Intel 64架构的处理器上,该control必须为0
Entry to SMM
该control决定在VM entry之后逻辑处理器是否处于SMM模式
从外部SMM进行VM entry时,该control必须为0
Load IA32_PAT/Load IA32_EFER/Load IA32_BNDCFGS
该control决定在VM entry时是否载入 IA32_PAT/A32_EFER/IA32_BNDCFGS MSR
Conceal VMX from PT
如过该control为1,Intel Processor Trace在VM entry时不会创建一个paging information packet(PIP)/VMCS packet(这里的VMCS packet是从SMM返回时应该创建的)
Load IA32_RTIT_CTL
该control决定在VM entry时是否载入 IA32_RTIT_CTL
VM entry controls
VM-entry MSR-load count
在VM entry时要被载入的MSR的数量,推荐不超过512
VM-entry MSR-load address
包含VM entry MSR载入区域,是一个entry表,每个entry16字节,entry的数量由VM-entry MSR-load count给定,如果count不为0,那么该区域地址必须为16字节对齐.
VM-entry Controls for MSRs
VM-Entry Controls for Event Injection
可以将VM entry配置为通过IDT传递事件来完成,该过程称为event injection
event injection由3个VM-entry控制域管理
VM-entry interruption-information field
提供即将inject的event细节
中断向量,使用IDT中哪个entry
中断类型,如外部中断,NMI等
传输错误码
有效位
VM-entry exception error code
只有在VM-entry interruption-information field的有效 位为1且传输错误码也为1时,该域才会被使用
VM-entry instruction length
对于注入的事件类型为软件中断、软件异常或者 高级软件异常时,使用该域确定push到栈中的RIP值
VM-exit information fields.
VMCS包含一个域,提供最近的VM exit的相关信 息,部分处理器上对该域进行VMWRITE会失败
基础VM exit信息
Exit reason
VM exit的原因
Exit qualification
导致VM exit的附加信息
Guest-linear address
在以下情况使用
执行LMSW,一个操作数为memory时,导致 VM exit
执行INS/OUTS时导致VM exit
在IO指令结束之后SMI中断到达
EPT违例导致VM exit
Guest-physical address
在EPT违例和EPT误配置导致VM exit时使用
由于Vectored事件导致的VM exit信息
VM-exit interruption information
该域接收导致VM exit的事件的相关信息
VM-exit interruption error code
硬件异常导致的VM exit会向栈中传输一个错误码,该域负责接收错误码
在事件交付过程中导致的VM exit信息
IDT-vectoring information
该域接收在传递事件时发生VM exit的事件基础信息
IDT-vectoring error code
硬件异常导致VM exits时会将错误码传送到栈中,该域负责接收错误码
由于指令执行(在non-root操作下执行)导致的VM exits信息
VM-exit instruction length
存储导致VM exit的指令的长度
VM-exit instruction information
由一组特定指令执行导致VM exit的信息
在IO指令结束之后SMI中断到达导致的VM exit,以下域提供IO指令信息
I/O RCX
I/O RSI
I/O RDI
I/O RIP
在IO指令执行前对应寄存器的值
VM指令错误域
32bit VM指令错误域不提供最近VM exit的信息,该域并不在VM exit时修改值,该域只提供VM指令的非常规操作发生时的相关信息
VMCS Region的格式
顶多4KB,具体大小和实现有关. 为了保证VMX Operation不出错,软件必须在writeback cacheable memory中维护VMCS Region和其他相关结构.未来可能允许或者需要在其它类型的meomry type中维护,具体需要查询IA32_VMX_BASIC
前4字节保存VMCS Revision Identifier, 该值不同,VMCS数据的保存格式也不同. 使用相同VMCS Revision Identifier的逻辑 核用到的VMCS Region的大小一样.
VMCS Revision Identifier能够避免在一个使用 不同VMCS Region格式的核上使用另一种VMCS Region格式
前4字节的bit31指示该VMCS是否是一个shadow VMCS
该域应该由软件在该VMCS Region为一个VMCS提供服务之前就写好
该域不由处理器写入
如果VMPTRLD的操作数参照的VMCS Region中的该域与 核使用的该域不一样,VMPTRLD操作就会失败
如果该域的bit31为1,但是核不支持将"VMCS shadowing" VM execution control置1,同样会导致VMPTRLD失败
在SDM中出现了3次
可以读VMX功能MSR--MSR IA32_VMX_PROCBASED_CTLS2获取 核是否支持"VMCS shadowing" VM execution control置1的设置
核使用的该域由VMX功能MSR--IA32_VMX_BASIC提供
软件应该根据VMCS是一个常规VMCS还是shadow VMCS而将bit31设置为0/1
VMX-abort indicator: 如果发生VMX abort, 核会向该域写入非0值. 软件也能对该域进行写入.
VMCS data: 该域视实现而定
浮动主题