次の方法で共有


機能とインターフェイスの検出

ゲスト ソフトウェアは、さまざまなメカニズムを介してハイパーバイザーと対話します。 これらの多くは、基になるプロセッサと対話するためにソフトウェアによって使用される従来のメカニズムを示しています。 そのため、これらのメカニズムはアーキテクチャ固有です。 x64 アーキテクチャでは、次のメカニズムが使用されます。

  • CPUID 命令 – 静的な機能とバージョン情報に使用されます。
  • MRS (モデル固有のレジスタ) – 状態と制御の値に使用されます。
  • メモリ マップト レジスタ – 状態と制御の値に使用されます。
  • プロセッサ割り込み – 非同期イベント、通知、およびメッセージに使用されます。

これらのアーキテクチャ固有のインターフェイスに加えて、ハイパーバイザーには、ハイパーカルを使用して実装された単純な手続き 型インターフェイスが提供されます

ハイパーバイザー検出

ハイパーバイザー インターフェイスを使用する前に、ソフトウェアは、仮想化された環境内で実行されているかどうかを最初に判断する必要があります。 この仕様に準拠する x64 プラットフォームでは、入力 (EAX) 値 1 で CPUID 命令を実行します。 コードを実行すると、レジスタ ECX のビット 31 ("ハイパーバイザーが存在するビット") を確認する必要があります。 このビットが設定されている場合は、ハイパーバイザーが存在します。 非仮想化環境では、ビットは明確になります。

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

"hypervisor present bit" が設定されている場合は、追加の CPUID リーフに対してクエリを実行して、準拠するハイパーバイザーとその機能の詳細を確認できます。 このような 2 つのリーフが使用できると保証されます。 0x400000000x40000001。 後で番号付けされたリーフも使用できます。

Standard Hypervisor の CPUID リーフ

のリーフに対して 0x40000000 クエリが実行された場合、ハイパーバイザーは最大ハイパーバイザー CPUID リーフ番号とベンダー ID 署名を提供する情報を返します。

登録 情報提供済み
EAX ハイパーバイザー CPUID 情報の最大入力値
EBX Hypervisor Vendor ID Signature
ECX Hypervisor Vendor ID Signature
EDX Hypervisor Vendor ID Signature

のリーフに対して 0x40000001 クエリが実行された場合、ベンダーに依存しないハイパーバイザー インターフェイスの識別を表す値が返されます。 これにより、 から のリーフのセマンティクスが決定 0x4000002 されます 0x400000FF

登録 情報提供済み
EAX ハイパーバイザー インターフェイス署名。
EBX 予約されています。
ECX 予約されています。
EDX 予約されています。

これら 2 つのリーフを使用すると、ゲストはハイパーバイザー ベンダー ID とインターフェイスに対して個別にクエリを実行できます。 ベンダー ID は、情報と診断の目的でのみ提供されます。 リーフ を介して報告されるインターフェイスシグネチャに対するソフトウェアの基本互換性の決定のみを行うのが推奨されます 0x40000001

Microsoft Hypervisor の CPUID リーフ

Microsoft ハイパーバイザーの CPUID インターフェイスに準拠しているハイパーバイザーでは0x400000000x40000001、 と リーフ レジスタの値は次のようになります。

ハイパーバイザー CPUID リーフ範囲 - 0x40000000

EAX は、ハイパーバイザー CPUID リーフの最大数を決定します。 EBX-EDX には、ハイパーバイザー ベンダー ID 署名が含まれている。 ベンダー ID 署名は、レポートと診断の目的でのみ使用する必要があります。

登録 情報提供済み
EAX ハイパーバイザー CPUID 情報の最大入力値。 Microsoft ハイパーバイザーでは、これは少なくとも になります 0x40000005
EBX 0x7263694D— "Micr"
ECX 0x666F736F— "osof"
EDX 0x76482074—"t Hv"

Hypervisor Vendor-Neutral Interface Identification - 0x40000001

EAX には、ハイパーバイザー インターフェイス識別署名が含まれている。 これにより、 から のリーフのセマンティクスが決定 0x40000002 されます 0x400000FF

登録 情報提供済み
EAX 0x31237648— "Hv#1"
EBX 予約されています。
ECX 予約されています。
EDX 予約されています。

"Hv#1" インターフェイスに準拠するハイパーバイザーでは、少なくとも次のリーフも提供されます。

ハイパーバイザー システム ID - 0x40000002

登録 Bits 情報提供済み
EAX ビルド番号
EBX 31-16 メジャー バージョン
15-0 マイナー バージョン

ハイパーバイザー機能の識別 - 0x40000003

EAX と EBX は、現在のパーティション特権に基づいて、パーティションで使用できる機能を示します。

登録 Bits 情報提供済み
EAX ビット 31 から 0 のビットに対応HV_PARTITION_PRIVILEGE_MASK
EBX 63 ~ 32 ビットのビットに対応HV_PARTITION_PRIVILEGE_MASK
ECX 予約されています。
EDX 0 非推奨 (以前に示された MWAIT 命令の可用性)
1 ゲスト デバッグのサポートが利用可能
2 パフォーマンス モニターサポートが利用可能です
3 物理 CPU 動的パーティション 分割イベントのサポートを利用できます
4 XMM レジスタ経由でハイパーコール入力パラメーター ブロックを渡すサポートを利用できます
5 仮想ゲストアイドル状態のサポートを利用できます
6 ハイパーバイザーのスリープ状態のサポートが利用可能
7 NUMA 距離のクエリのサポートを利用できます
8 タイマーの頻度を決定するためのサポートを利用できます
9 合成マシン チェックの挿入のサポートを利用できます
10 ゲスト クラッシュ MRS のサポートを利用できます
11 デバッグ MRS のサポートを利用できます
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 の Last Branch Record (LBR) 機能がサポートされています
31-27 予約されています。

実装おすすめ - 0x40000004

最適なパフォーマンスを得る OS の実装をハイパーバイザーで推奨する動作を示します。

登録 Bits 情報提供済み
EAX 0 MOV から CR3 への命令ではなく、アドレス空間スイッチにハイパーコールを使用することをお勧めします。
1 INVLPG または MOV から CR3 への手順ではなく、ローカル TLB フラッシュにハイパーコールを使用することをお勧めします。
2 プロセッサ間の割り込みではなく、リモート TLB フラッシュにハイパーコールを使用することをお勧めします。
3 APIC にアクセスするために MCR を使用することをお勧めします。対応するメモリマップではなく、EOI、ICR、TPR が登録されます。
4 ハイパーバイザー提供の MSR を使用してシステム RESET を開始することをお勧めします。
5 このパーティションには緩いタイミングを使用することをお勧めします。 使用する場合、VM は、外部割り込みのタイム タイム デリバリーに依存するウォッチドッグ タイムアウトを無効にする必要があります。
6 DMA の再マップを使用することをお勧めします。
7 割り込み再マッピングを使用することをお勧めします。
8 予約済み。
9 AutoEOI を非推奨にすることをお勧めします。
10 SyntheticClusterIpi ハイパーコールを使用することをお勧めします。
11 新しい ExProcessorMasks インターフェイスを使用することをお勧めします。
12 ハイパーバイザーが Hyper-V パーティション内で入れ子にされた状態を示します。
13 MBEC システム呼び出しには INT を使用することをお勧めします。
14 対応する VMCS インターフェイスを使用して、入れ子になったハイパーバイザーを推奨します。 また、入れ子になった追加の対応を使用できる可能性も示します (「リーフ サービス」を0x4000000A。
15 UseSyncedTimeline – パーティションがルート パーティションによって提供される QueryPerformanceCounter バイアスを消費する必要がある場合に示します。
16 予約されています。
17 UseDirectLocalFlushEntire – ゲストが CR4 を切り替える必要がある場合に示します。PGE は、ハイパーコールを作成するよりもパフォーマンスが高い TLB 全体をフラッシュします。
18 NoNonArchitecturalCoreSharing - コア共有ができないかどうかを示します。 これは、STIBP のパフォーマンス オーバーヘッドを回避する最適化として使用できます。
31-19 予約されています。
EBX ハイパーバイザーにエラーを通知する前に、スピンロックエラーを再試行する試行の推奨回数。 0xFFFFFFFFは通知を受け取らないことを示します。
ECX 6-0 ImplementedPhysicalAddressBits – システムの物理プロセッサによって報告された物理アドレス幅 (MAXPHYADDR) を報告します。 すべてのビットに 0 が含まれている場合、この機能はサポートされません。 報告される値は物理アドレス ビットの実際の数であり、その数値を表すビット位置ではありません。
31-7 予約されています。
EDX 予約されています。

ハイパーバイザーの実装の制限 - 0x40000005

現在のハイパーバイザー実装でサポートされているスケール制限について説明します。 値が 0 の場合、ハイパーバイザーは対応する情報を公開します。それ以外の場合は、これらの意味を持ちます。

登録 情報提供済み
EAX サポートされている仮想プロセッサの最大数
EBX サポートされている論理プロセッサの最大数
ECX 割り込み再マップに使用できる物理割り込みベクトルの最大数。
EDX 予約されています。

実装ハードウェア機能 - 0x40000006

ハイパーバイザーによって検出され、現在使用されているハードウェア固有の機能を示します。

登録 Bits 情報提供済み
EAX 0 APIC オーバーレイ 支援のサポートが検出され、使用されています。
1 MSR ビットマップのサポートが検出され、使用されています。
2 アーキテクチャ パフォーマンス カウンターのサポートが検出され、使用されています。
3 第 2 レベルのアドレス変換のサポートが検出され、使用されています。
4 DMA 再マッピングのサポートが検出され、使用されています。
5 割り込み再マッピングのサポートが検出され、使用されています。
6 メモリ スクラブ がハードウェアに存在する場合に示します。
7 DMA 保護が使用されています。
8 HPET が要求されます。
9 合成タイマーは揮発性です。
13-10 現在のゲストのハイパーバイザー レベル - 入れ子でない場合は "0"。
14 物理宛先モードが必要です。
15 予約されています。
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 では、仮想 MRS へのアクセスについて説明します。 EDX では、ハイパーカルへのアクセスについて説明します。

登録 Bits 情報提供済み
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

入れ子になったハイパーバイザーで使用できる入れ子になった仮想化の最適化を示します。

登録 Bits 情報提供済み
EAX 7-0 対応 VMCS バージョン (低)
15-8 対応 VMCS バージョン (高)
16 予約されています。
17 直接仮想フラッシュ ハイパーカルのサポートを示します。
18 HvFlushGuestPhysicalAddressSpace および HvFlushGuestPhysicalAddressList ハイパーカル (Intel プラットフォーム上) のサポートを示します。
19 対応する MSR ビットマップの使用のサポートを示します。
20 ページ フォールト例外クラスでの仮想化例外の組み合わせのサポートを示します。
21 予約されています。
22 AMD プラットフォームでの対応 TLB のサポートを示します。 ASID フラッシュは、NPT から派生した TLB エントリには影響を与え "されません"。 NPT TLB エントリを無効にするには、ハイパーカルを使用する必要があります。 また、HvFlushGuestPhysicalAddressSpace および HvFlushGuestPhysicalAddressList ハイパーカルのサポートも示します。
31-21 予約されています。
EBX 予約されています。
ECX 予約されています。
EDX 予約されています。

バージョン管理

ハイパーバイザーのバージョン情報はリーフ でエンコードされます 0x40000002。 メイン バージョンとサービス バージョンの 2 つのバージョン番号が提供されます。

メイン バージョンには、メジャー バージョン番号とマイナー バージョン番号とビルド番号が含まれます。 これらは Microsoft のリリース番号Windows対応しています。 サービス バージョンには、メイン バージョンに加えた変更が記述されています。

クライアントは、バージョン範囲と比較するのではなく、CPUID 0x400000030x40000005 リーフを使用してハイパーバイザー機能を確認する方法を強く推奨します。