来宾软件通过各种机制与虚拟机监控程序交互。 其中许多反映了软件用来与基础处理器交互的传统机制。 因此,这些机制特定于体系结构。 在 x64 体系结构中,使用以下机制:
- CPUID 指令 - 用于静态功能和版本信息。
- MSR (特定于模型的寄存器) - 用于状态和控件值。
- 内存映射寄存器 - 用于状态和控制值。
- 处理器中断 - 用于异步事件、通知和消息。
除了这些特定于体系结构的接口,虚拟机监控程序还提供一个简单的过程接口,该接口通过 超calls 实现。
虚拟机监控程序发现
在使用任何虚拟机监控程序接口之前,软件应首先确定它是否在虚拟化环境中运行。 在符合此规范的 x64 平台上,通过执行输入 (EAX) 值为 1 的 CPUID 指令来完成此作。 执行后,代码应检查注册 ECX 的位 31(“虚拟机监控程序存在位”)。 如果设置了此位,则存在虚拟机监控程序。 在非虚拟化环境中,位将清晰。
CPUID.01h.ECX:31 // if set, virtualization present
如果设置了“虚拟机监控程序存在位”,则可以查询其他 CPUID 叶,以获取有关符合性虚拟机监控程序及其功能的详细信息。 保证有两个这样的叶子可用: 0x40000000 和 0x40000001。 后续编号的叶子也可能可用。
标准虚拟机监控程序 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 接口的虚拟机监控程序上, 0x40000000 和 0x40000001 叶寄存器将具有以下值。
虚拟机监控程序 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 与版本范围进行比较来检查虚拟机监控程序功能。