VMCS data数据区内的字段与处理器实现相关. 在不同架构下的处理器中, 这些 VMCS 字段位置可能会不一致. 并且, 在一些较早的处理器中也不支持 VMX 架构提出的新特性, 导致在这些早期的处理器中某些字段是不存在的.

软件不能使用 MOV 指令来直接访问 VMCS 字段, 原因是:

(1) 软件并不知道 VMCS 字段的位置, 也无法查询或推测出具体位置.

(2) 使用 MOV 指令对 VMCS 区域进行读写, 可能会读写到一些不正确的字段值, 从而可能导致不可预测的结果发生.

软件必须通过 VMREADVMWRITE 指令来访问 VMCS 字段. 每个字段定义一个唯一的 ID 值累对应, 这个字段 ID 值提供给 VMREAD 与 VMWRITE 指令作为index值来访问相应的字段.

字段 ID 格式

字段 ID 值是 32 位的, 它有几个域组成, 如图 3-2 所示.

3. 访问 VMCS 字段

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 值, 源操作数提供需要写入的值.

对于不同宽度的字段有相应的读写原则.

相关文章:

  • 2022-12-23
  • 2021-04-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-11
  • 2021-06-29
猜你喜欢
  • 2021-09-23
  • 2022-12-23
  • 2021-07-18
  • 2022-12-23
  • 2022-12-23
  • 2021-09-11
  • 2021-08-22
相关资源
相似解决方案