功能和接口发现

来宾软件通过各种机制与虚拟机监控程序交互。 其中许多反映了软件用来与基础处理器交互的传统机制。 因此,这些机制特定于体系结构。 在 x64 体系结构中,使用以下机制:

  • CPUID 指令 - 用于静态功能和版本信息。
  • MSR (特定于模型的寄存器) - 用于状态和控件值。
  • 内存映射寄存器 - 用于状态和控制值。
  • 处理器中断 - 用于异步事件、通知和消息。

除了这些特定于体系结构的接口,虚拟机监控程序还提供一个简单的过程接口,该接口通过 超calls 实现。

虚拟机监控程序发现

在使用任何虚拟机监控程序接口之前,软件应首先确定它是否在虚拟化环境中运行。 在符合此规范的 x64 平台上,通过执行输入 (EAX) 值为 1 的 CPUID 指令来完成此作。 执行后,代码应检查注册 ECX 的位 31(“虚拟机监控程序存在位”)。 如果设置了此位,则存在虚拟机监控程序。 在非虚拟化环境中,位将清晰。

CPUID.01h.ECX:31 // if set, virtualization present

如果设置了“虚拟机监控程序存在位”,则可以查询其他 CPUID 叶,以获取有关符合性虚拟机监控程序及其功能的详细信息。 保证有两个这样的叶子可用: 0x400000000x40000001。 后续编号的叶子也可能可用。

标准虚拟机监控程序 CPUID 离开

查询叶 0x40000000 时,虚拟机监控程序将返回提供最大虚拟机监控程序 CPUID 叶数和供应商 ID 签名的信息。

Register 提供的信息
EAX 虚拟机监控程序 CPUID 信息的最大输入值
EBX 虚拟机监控程序供应商 ID 签名
ECX 虚拟机监控程序供应商 ID 签名
EDX 虚拟机监控程序供应商 ID 签名

如果查询叶 0x40000001 ,它将返回表示供应商中性虚拟机监控程序接口标识的值。 这决定了叶子的0x40000020x400000FF语义。

Register 提供的信息
EAX 虚拟机监控程序接口签名。
EBX 已预留
ECX 已预留
EDX 已预留

这两个离开允许来宾独立查询虚拟机监控程序供应商 ID 和接口。 供应商 ID 仅用于信息性和诊断目的。 建议仅对通过叶 0x40000001报告的接口签名做出基本兼容性决策。

Microsoft虚拟机监控程序 CPUID 离开

在符合Microsoft虚拟机监控程序 CPUID 接口的虚拟机监控程序上, 0x400000000x40000001 叶寄存器将具有以下值。

虚拟机监控程序 CPUID 叶范围 - 0x40000000

EAX 确定最大虚拟机监控程序 CPUID 叶。 EBX-EDX 包含虚拟机监控程序供应商 ID 签名。 供应商 ID 签名应仅用于报告和诊断目的。

Register 提供的信息
EAX 虚拟机监控程序 CPUID 信息的最大输入值。 在Microsoft虚拟机监控程序上,这至少 0x40000005是这样。
EBX 0x7263694D — “Micr”
ECX 0x666F736F — “osof”
EDX 0x76482074 — “t Hv”

虚拟机监控程序供应商中性接口标识 - 0x40000001

EAX 包含虚拟机监控程序接口标识签名。 这决定了叶子的0x400000020x400000FF语义。

Register 提供的信息
EAX 0x31237648 — “Hv#1”
EBX 已预留
ECX 已预留
EDX 已预留

符合“Hv#1”接口的虚拟机监控程序也至少提供以下离开。

虚拟机监控程序系统标识 - 0x40000002

Register 比特 提供的信息
EAX 生成号
EBX 31-16 主要版本
15-0 次要版本

虚拟机监控程序功能标识 - 0x40000003

EAX 和 EBX 根据当前分区特权指示分区可用的功能。

Register 比特 提供的信息
EAX 对应于 31-0 位HV_PARTITION_PRIVILEGE_MASK
EBX 对应于 63-32 位HV_PARTITION_PRIVILEGE_MASK
ECX 4-0 已预留
5 固定 Mperf 可用
6 监督器阴影堆栈可用
7 体系结构 PMU 可用
8 异常陷阱截获可用
31-9 已预留
EDX 0 已弃用(以前指示 MWAIT 指令的可用性)
1 来宾调试支持可用
2 性能监视器支持可用
3 支持物理 CPU 动态分区事件
4 支持通过 XMM 寄存器传递 hypercall 输入参数块
5 支持虚拟来宾空闲状态可用
6 支持虚拟机监控程序睡眠状态
7 支持查询 NUMA 距离
8 支持确定计时器频率
9 支持注入合成计算机检查
10 对来宾崩溃 MSR 的支持可用
11 支持调试 MSR
12 支持 NPIEP 可用
13 DisableHypervisorAvailable
14 ExtendedGvaRangesForFlushVirtualAddressListAvailable
15 支持通过 XMM 寄存器返回超输出
16 已预留
17 SintPollingModeAvailable
18 HypercallMsrLockAvailable
19 使用直接合成计时器
20 支持适用于 VSM 的 PAT 注册
21 支持适用于 VSM 的 bndcfgs 注册
22 已预留
23 支持可用的合成时间未吸入计时器
25-24 已预留
26 支持 Intel 的最后一个分支记录(LBR)功能
31-27 已预留

实施建议 - 0x40000004

指示虚拟机监控程序建议实现 OS 以实现最佳性能的行为。

Register 比特 提供的信息
EAX 0 建议将 Hypercall 用于地址空间开关,而不是将 MOV 用于 CR3 指令。
1 建议将 hypercall 用于本地 TLB 刷新,而不是将 INVLPG 或 MOV 用于 CR3 指令。
2 建议将 hypercall 用于远程 TLB 刷新,而不是处理器间中断。
3 建议使用 MSR 访问 APIC 寄存器 EOI、ICR 和 TPR,而不是其内存映射的对应项。
4 建议使用虚拟机监控程序提供的 MSR 启动系统 RESET。
5 建议对此分区使用宽松的计时。 如果使用,VM 应禁用依赖于外部中断及时传递的任何监视程序超时。
6 建议使用 DMA 重新映射。
7 建议使用中断重新映射。
8 预留。
9 建议弃用 AutoEOI。
10 建议使用 SyntheticClusterPi hypercall。
11 建议使用较新的 ExProcessorMasks 接口。
12 指示虚拟机监控程序嵌套在 Hyper-V 分区中。
13 建议对 MBEC 系统调用使用 INT。
14 建议使用启发式 VMCS 接口的嵌套虚拟机监控程序。 此外,还表明其他嵌套启发可能可用(请参阅叶0x4000000A)。
15 UseSyncedTimeline – 指示分区应使用根分区提供的 QueryPerformanceCounter 偏差。
16 已预留
17 UseDirectLocalFlushEntire – 指示来宾应切换 CR4。用于刷新整个 TLB 的 PGE,因为这比创建超负载更高性能。
18 NoNonArchitecturalCoreSharing - 指示无法进行核心共享。 这可用作优化,以避免 STIBP 的性能开销。
31-19 已预留
EBX 建议在通知虚拟机监控程序失败之前重试旋转锁失败的尝试次数。 0xFFFFFFFF指示从不通知。
ECX 6-0 ImplementedPhysicalAddressBits – 报告系统的物理处理器报告的物理地址宽度(MAXPHYADDR)。 如果所有位都包含 0,则不支持该功能。 请注意,报告的值为实际物理地址位数,而不是用于表示该数字的位位置。
31-7 已预留
EDX 已预留

虚拟机监控程序实现限制 - 0x40000005

介绍当前虚拟机监控程序实现中支持的规模限制。 如果任何值为零,虚拟机监控程序不会公开相应的信息;否则,它们具有这些含义。

Register 提供的信息
EAX 支持的最大虚拟处理器数
EBX 支持的最大逻辑处理器数
ECX 可用于中断重新映射的物理中断向量的最大数量。
EDX 已预留

实现硬件功能 - 0x40000006

指示已检测到哪些特定于硬件的功能,并且当前正由虚拟机监控程序使用。

Register 比特 提供的信息
EAX 0 检测到并正在使用 APIC 覆盖助手。
1 检测到并正在使用 MSR 位图的支持。
2 检测到并正在使用体系结构性能计数器。
3 检测到并正在使用二级地址转换的支持。
4 检测到并正在使用 DMA 重新映射的支持。
5 检测到并正在使用中断重新映射的支持。
6 指示硬件中存在内存巡逻清理器。
7 DMA 保护正在使用中。
8 请求 HPET。
9 合成计时器是可变的。
13-10 当前来宾的虚拟机监控程序级别 -“0”(如果非嵌套)。
14 需要物理目标模式。
15 将 VMFUNC 用于别名映射开关。
16 存在对硬件内存零的支持。
17 存在对“无限制来宾”的支持。
18 目前支持资源分配(RDT-A、PQOS-A)。
19 目前支持资源监视(RDT-M、PQOS-M)。
20 存在对来宾虚拟 PMU 的支持。
21 存在对来宾虚拟 LBR 的支持。
22 存在对来宾虚拟 IPT 的支持。
23 存在对 APIC 仿真的支持。
24 检测到 ACPI WDAT 表并将其用于虚拟机监控程序。
31-25 已预留
EBX 已预留
ECX 已预留
EDX 已预留

嵌套虚拟机监控程序功能标识 - 0x40000009

描述运行嵌套时虚拟机监控程序向分区公开的功能。 EAX 描述对虚拟 MSR 的访问。 EDX 描述对超calls 的访问。

Register 比特 提供的信息
EAX 1-0 已预留
2 AccessSynicRegs
3 已预留
4 AccessIntrCtrlRegs
5 AccessHypercallMsrs
6 AccessVpIndex
11-7 已预留
12 AccessReenlightenmentControls
31-13 已预留
EBX 已预留
ECX 已预留
EDX 3-0 已预留
4 XmmRegistersForFastHypercallAvailable
14-5 已预留
15 FastHypercallOutputAvailable
16 已预留
17 SintPollingModeAvailable
31-18 已预留

虚拟机监控程序嵌套虚拟化功能 - 0x4000000A

指示嵌套虚拟机监控程序可以使用哪些嵌套虚拟化优化。

Register 比特 提供的信息
EAX 7-0 启发式 VMCS 版本(低)
15-8 启发式 VMCS 版本(高)
16 已预留
17 指示支持直接虚拟刷新超卡。
18 指示对 HvCallFlushGuestPhysicalAddressSpace 和 HvCallFlushGuestPhysicalAddressList hypercalls(在 x64 平台上)的支持。
19 指示支持使用启发式 MSR 位图。
20 指示支持在页面错误异常类中合并虚拟化异常。
21 指示对 VMCS 中0x00002802(GuestIa32DebugCtl)字段的非零值的支持。
22 指示对 AMD 平台上启发式 TLB 的支持。 ASID 刷新不会影响从《条约》派生的 TLB 条目。 Hypercalls 必须用于使《不扩散核武器条约》TLB 条目失效。 还指示对 HvCallFlushGuestPhysicalAddressSpace 和 HvCallFlushGuestPhysicalAddressList hypercalls 的支持。
31-21 已预留
EBX 0 指示对启发式 VMCS 中的 GuestPerfGlobalCtrl 和 HostPerfGlobalCtrl 字段的支持。
31-1 已预留
ECX 已预留
EDX 已预留

版本控制

虚拟机监控程序版本信息以叶 0x40000002编码。 提供了两个版本号:主版本和服务版本。

主版本包括主版本号和次要版本号和内部版本号。 这些版本对应于Microsoft Windows 版本号。 服务版本描述对主版本所做的更改。

强烈建议客户端通过使用 CPUID 离开 0x40000003 而不是 0x40000005 与版本范围进行比较来检查虚拟机监控程序功能。