1. 功能检测的必要性

VMX架构中的很多功能在不同处理器架构有不同的支持, 比如之前提的 VMX-preemption timer 功能.

因此, VMM 需要检测当前VMX架构下的功能, 并进行相应设置.

注: 本书主要参照Intel开发者手册 2012年8月版, order number为: 325462-044US.

2. 检测是否支持VMX架构

VMX 架构是否支持, 使用 CPUID.01H:ECX.VMX[5]位来进行检测(详细见2.2.3)

3. 通过MSR组检查VMX能力

VMX 架构提供了众多项目能力的检测, 包括: VMX的基本信息杂项信息VPID与EPT能力, 还有对VMCS内control fields(控制字段)允许设置的位. 控制字段的位允许被置为1时, 代表着处理器拥有这个能力.

比如, secondary processor-based control字段的bit 7是"Unrestricted guest"位, 当它允许被置为1时, 表明处理器支持 unrestricted guest(不受限制的guest端)功能. 反之, 则表明处理器不支持该功能.

VMX 的这些能力的检测提供在几组共 14MSR(Model Specific Register)里, 如表2-1, 除了这些, 还有 4 个扩展TRUE 系列寄存器, 详见2.5.4节和2.5.5节

5. VMX能力的检测

......

4. 例子 2-1

5. 基本信息检测

IA32_VMX_BASIC寄存器用来检测 VMX 的基本能力信息, 如图 2-6 所示.

5. VMX能力的检测

... ...

bit 55 位为 1 时, 表示支持 4 个 TRUE 寄存器, 这 4 个 TRUE 寄存器将影响最终的 VMCS 中的某些控制位, 如表 2-2 .

5. VMX能力的检测

bit 55 的值决定由谁来控制这些 VMCS 字段固定位的设置. 当 bit 55 为 0 时, 这些 VMCS 字段的

6. 允许为 0 以及允许为 1 位

6.1. 决定 VMX 支持的功能

6.2. 控制字段设置算法

7. VM-execution 控制字段

在 VMCS 区域的三个 VM-execution control 字段需要检查 VMX 能力寄存器来确认 default0 与 default1 位. 如下所示:

7.1. Pin-based VM-execution control 字段

7.2. primary processor-based VM-execution control 字段

7.3. secondary processor-based VM-execution control 字段

8. VM-exit control 字段

9. VM-entry control 字段

10. VM-function control 字段

11. CR0 与 CR4 的固定位

11.1. CR0 与 CR4 寄存器设置算法

12. VMX 杂项信息

13. VMCS 区域字段 index 值

14. VPID 与 EPT 能力

IA32_VMX_EPT_VPID_CAP寄存器提供两方面的能力检测, 包括 EPT(扩展页表)所支持的能力, 以及 EPT 页面 cache( TLBspaging-structure cache )的能力.

当下面的条件满足时, 才支持 IA32_VMX_EPT_VPID_CAP 寄存器.

(1) CPUID.01H:ECX[5]=1, 表明支持 VMX 架构.

(2) IA32_VMX_PROCBASED_CTLS[63]=1, 表明支持 IA32_VMX_PROCBASED_CTLS2 寄存器.

(3) IA32_VMX_PROCBASED_CTLS2[33]=1, 表明支持 "enable EPT" 位.

如图 2-11 是 IA32_VMX_EPT_VPID_CAP寄存器的结构.

5. VMX能力的检测

对于 EPT 能力, bit 0 为 1 时, 允许在 EPT 页表表项里的 bits 2:0 使用 100b(execute-only页)属性. bit 6为 1 时, 表明支持 4 级页表结构. bit 16为1时支持使用 2M 页, bit 17为1时支持使用 1G 页. 最后, bit 21 为 1 时支持在页表项里使用 dirty 标志.

bit 8为 1 时, 允许在 EPTP 字段的 bits 2:0 里设为UC类型(值为0), 而bit 14为1时, 允许在 EPTP 的bits 2:0 里设置为WB类型(值为6). 见4.4.1.3

对于 EPT cache的能力, bit 20 为 1 时支持INVEPT指令, bit 32为 1 时支持INVVPID指令. INVEPT指令支持的刷新类型由 bit 25 和 bit 26 检测. bit 25为1时, 支持 single-context 刷新类型, bit 26为 1时, 支持all-context刷新类型.

INVVPID指令支持的刷新类型由bits 43:40检测. bit 40为1时, 支持 individual-address 类型(type值为0). bit 41为1时, 支持single-context类型(type值为1). bit 42为1时, 支持 all-context类型(type值为2). bit 43为1时, 支持single-context-retaining-globals类型(type值为3).

相关文章:

  • 2021-10-18
  • 2021-04-04
  • 2022-01-15
  • 2021-08-14
  • 2022-12-23
  • 2021-06-18
  • 2021-07-23
  • 2022-12-23
猜你喜欢
  • 2021-09-05
  • 2021-09-24
  • 2022-12-23
  • 2022-12-23
  • 2022-02-07
  • 2021-05-23
  • 2022-12-23
相关资源
相似解决方案