VMCS结构存放在一个物理地址区域里, 这个区域被称为"VMCS region".
VMCS区域需要对齐在4K边界上. VMCS区域的大小由IA32_VMX_BASIC[44:32]域里得到(见2.5.4节), 以KB为单位, 最高4KB.
IA32_VMX_BASIC[53:50]域报告了VMCS区域支持的cache类型, 支持UC与WB类型.
执行 VMCLEAR 与 VMPTRLD 指令时, 需要提供目标 VMCS 区域的物理指针作为操作数. 而 VMREAD、VMWRITE、VMLAUNCH、VMRESUME 及 VMPTRST 指令隐式地使用 current-VMCS pointer 作为目标 VMCS 指针.
前面提到, 使用 VMCLEAR 指令对 current-VMCS 指针进行初始化时, current-VMCS 指针值变成 FFFFFFFF_FFFFFFFFh. 这时, 执行上面隐式使用 current-VMCS pointer的指令, 会产生 VMfailInvalid 失败.
1. VMXON 区域
2. Executive-VMCS 与 SMM-transfer VMCS
在 SMM 双重监控处理机制下, 还有两类 VMCS, 分别是: Executive-VMCS 与 SMM transfer VMCS. Executive-VMCS 对应 VMM 在 VMX operation 模式(包括 root 与 non-root )下的 VMCS, 而 SMM-transfer VMCS 对应 VMM 进入 SMM 模式时使用的 VMCS .
3. VMCS 区域格式
VMCS 区域寄存在物理地址空间, 有一个 8 字节的头部和 VMCS 数据区域, 如图 3-1 所示.
注: DWORD, 双字, 四字节
3.1. VMCS ID
VMCS 的首 DWORD 值是 VMCS ID, 这个 VMCS ID 值需要在初始化 VMCS 区域时写入, 必须等于 IA32_VMX_BASIC[31:0] 值(见2.5.4). 注意, VMXON 区域的首 DWORD 值也是 VMCS ID, 也必须等于 IA32_VMX_BASIC[31:0] 值.
3.2. VMX-abort ID
接下来的 DWORD 值是 VMX-abort ID. 当进行 VM-exit 操作遇到一个错误时, 会产生 "VMX-abort". VMX-abort 导致处理器进入 shutdown 状态, 处理器会写入一个非零值到 current-VMCS 的 VMX-abort ID 字段(见5.17)
3.3. VMCS data
VMCS 数据区包括 6 个区域, 每个区域有若干字段, 如下.
(1) guest-state 区域: 在 VM-entry 时, 处理器的状态信息从 guest-state 区域中加载. 在 VM-exit 时, 处理器的当前状态信息保存在 guest-state 区域.
(2) host-state 区域: 在 VM-exit 时, 处理器的状态信息从 host-state 区域中加载.
(3) VM-execution 控制区域: 在进入 VM 后, 处理器的行为由 VM-execution 控制区域中的字段控制. 例如, 可以设置某些条件使得在 guest 执行中产生 VM-exit.
(4) VM-exit 控制区域: 控制处理器在处理 VM-exit 时的行为, 也影响返回 VMM 后处理器的某些状态.
(5) VM-entry 控制区域: 控制处理器在处理 VM-entry 时的行为, 也决定进入 VM 后处理器的某些状态.
(6) VM-exit 信息区域: 记录引起 VM-exit 事件的原因及相关的明细信息. 也可记录 VMX 指令执行失败后的错误编号.