VMCS data数据区内的字段与处理器实现相关. 在不同架构下的处理器中, 这些 VMCS 字段位置可能会不一致. 并且, 在一些较早的处理器中也不支持 VMX 架构提出的新特性, 导致在这些早期的处理器中某些字段是不存在的.
软件不能使用 MOV 指令来直接访问 VMCS 字段, 原因是:
(1) 软件并不知道 VMCS 字段的位置, 也无法查询或推测出具体位置.
(2) 使用 MOV 指令对 VMCS 区域进行读写, 可能会读写到一些不正确的字段值, 从而可能导致不可预测的结果发生.
软件必须通过 VMREAD 与 VMWRITE 指令来访问 VMCS 字段. 每个字段定义一个唯一的 ID 值累对应, 这个字段 ID 值提供给 VMREAD 与 VMWRITE 指令作为index值来访问相应的字段.
字段 ID 格式
字段 ID 值是 32 位的, 它有几个域组成, 如图 3-2 所示.
bit 0 指示访问的类型, 为 0 时使用 full 类型, 为 1 时使用 high 类型访问 64 位字段的高 32 位. 除了 64 位字段外, 其他宽度字段都是 full 类型.
bits 9:1 是 VMCS 字段的 index 值.
bits 11:10 指示字段的类型, 包括下面的值.
- 0: 属于控制区域内的字段. 包含 VM-execution 控制字段, VM-exit控制字段以及 VM-entry 控制字段.
- 1: 属于只读类型的字段. 典型的比如 VM-exit 信息域.
- 2: 属于 guest-state 字段.
- 3: 属于 host-state 字段
bits 14:13 指示字段的宽度, 包括:
- 0: 16位
- 1: 64位
- 2: 32位
- 3:
natural-width字段
natural-width 字段在支持 64 位架构的处理器中为 64 位, 在不支持 64 位架构的处理器中为 32 位. 其他几类则属于固定宽度, 不会改变.
注意: 固定为 64 位的字段对应着两个字段 ID 值, 分别是 full 类型字段与 high 类型字段. 例如, guest-state 区域内的 IA32_EFER 字段是 64 位字段, 它对应如下两个字段ID:
不同宽度的字段处理
VMREAD 指令的源操作数提供字段 ID 值, 目标操作数接收读取的 VMCS 字段值.
VMWRITE 指令的目标操作数提供字段 ID 值, 源操作数提供需要写入的值.
对于不同宽度的字段有相应的读写原则.