このセクションでは、ゲスト ソフトウェアがハイパーバイザーの存在を検出し、アーキテクチャ固有の検出メカニズムを使用してその機能、機能、バージョン情報を照会する方法について説明します。
機能とインターフェイスの検出 (x64)
ゲスト ソフトウェアは、さまざまなメカニズムを通じてハイパーバイザーと対話します。 これらの多くは、基になるプロセッサと対話するためにソフトウェアによって使用される従来のメカニズムを反映しています。 そのため、これらのメカニズムはアーキテクチャ固有です。 x64 アーキテクチャでは、次のメカニズムが使用されます。
- CPUID 命令 – 静的な機能とバージョン情報に使用されます。
- MSR (モデル固有のレジスタ) – 状態と制御値に使用されます。
- メモリ マップト レジスタ – 状態と制御値に使用されます。
- プロセッサ割り込み – 非同期イベント、通知、およびメッセージに使用されます。
ハイパーバイザーは、これらのアーキテクチャ固有のインターフェイスに加えて、 ハイパーコールを使用して実装された単純な手続き型インターフェイスを提供します。
ハイパーバイザー検出
ハイパーバイザー インターフェイスを使用する前に、ソフトウェアはまず、仮想化された環境内で実行されているかどうかを判断する必要があります。 この仕様に準拠する x64 プラットフォームでは、これは入力 (EAX) 値 1 で CPUID 命令を実行することによって行われます。 実行時に、コードはレジスタ ECX のビット 31 ("ハイパーバイザー存在ビット") を確認する必要があります。 このビットが設定されている場合、ハイパーバイザーが存在します。 非仮想化環境では、ビットは明確になります。
CPUID.01h.ECX:31 // if set, virtualization present
"ハイパーバイザーの現在のビット" が設定されている場合は、準拠しているハイパーバイザーとその機能の詳細について、追加の CPUID リーフを照会できます。 このような葉は、 0x40000000 と 0x40000001の2つであることが保証されています。 続いて番号付きの葉も利用可能である。
Standard ハイパーバイザーの CPUID リーフ
0x40000000のリーフが照会されると、ハイパーバイザーは、ハイパーバイザーの最大 CPUID リーフ番号とベンダー ID 署名を提供する情報を返します。
| Register | 提供される情報 |
|---|---|
| EAX | ハイパーバイザー CPUID 情報の最大入力値 |
| EBX | ハイパーバイザー ベンダー ID 署名 |
| ECX | ハイパーバイザー ベンダー ID 署名 |
| EDX | ハイパーバイザー ベンダー ID 署名 |
0x40000001のリーフが照会されると、ベンダーに依存しないハイパーバイザー インターフェイスの識別を表す値が返されます。 これにより、 0x4000002 から 0x400000FFまでの葉のセマンティクスが決まります。
| Register | 提供される情報 |
|---|---|
| EAX | ハイパーバイザー インターフェイス署名。 |
| EBX | 予約済み |
| ECX | 予約済み |
| EDX | 予約済み |
これら 2 つのリーフを使用すると、ゲストはハイパーバイザー ベンダー ID とインターフェイスに対して個別にクエリを実行できます。 ベンダー ID は、情報提供と診断の目的でのみ提供されます。 ソフトウェアは、リーフ 0x40000001を介して報告されるインターフェイス署名に基づく互換性の決定のみにすることをお勧めします。
Microsoft ハイパーバイザー CPUID リーフ
Microsoft ハイパーバイザー CPUID インターフェイスに準拠しているハイパーバイザーでは、 0x40000000 と 0x40000001 リーフ レジスタの値は次のようになります。
ハイパーバイザー CPUID リーフ範囲 - 0x40000000
EAX は、ハイパーバイザー CPUID リーフの最大数を決定します。 ハイパーバイザー ベンダー ID 署名を含む EBX-EDX。 ベンダー ID 署名は、レポートと診断の目的でのみ使用する必要があります。
| Register | 提供される情報 |
|---|---|
| EAX | ハイパーバイザー CPUID 情報の最大入力値。 Microsoft ハイパーバイザーでは、これは少なくとも 0x40000005になります。 |
| EBX | 0x7263694D— "Micr" |
| ECX | 0x666F736F— "osof" |
| EDX | 0x76482074— "t Hv" |
ハイパーバイザー ベンダーに依存しないインターフェイスの識別 - 0x40000001
EAX には、ハイパーバイザー インターフェイス識別署名が含まれています。 これにより、 0x40000002 から 0x400000FFまでの葉のセマンティクスが決まります。
| Register | 提供される情報 |
|---|---|
| EAX | 0x31237648— "Hv#1" |
| EBX | 予約済み |
| ECX | 予約済み |
| EDX | 予約済み |
"Hv#1" インターフェイスに準拠するハイパーバイザーでも、少なくとも次のリーフが提供されます。
ハイパーバイザー システム ID - 0x40000002
| Register | ビット | 提供される情報 |
|---|---|---|
| EAX | ビルド番号 | |
| EBX | 31-16 | メジャーバージョン |
| 15-0 | 軽微なバージョン |
ハイパーバイザー機能の識別 - 0x40000003
EAX と EBX は、現在のパーティション特権に基づいて、パーティションで使用できる機能を示します。
| Register | ビット | 提供される情報 |
|---|---|---|
| EAX | HV_PARTITION_PRIVILEGE_MASKのビット 31 から 0 に対応します | |
| EBX | HV_PARTITION_PRIVILEGE_MASKのビット 63 から 32 に対応します | |
| ECX | 4-0 | 予約済み |
| 5 | インバリアント Mperf を使用できます | |
| 6 | スーパーバイザ シャドウ スタックが使用可能 | |
| 7 | アーキテクチャ PMU を使用できます | |
| 八 | 例外トラップインターセプトが使用可能 | |
| 31-9 | 予約済み | |
| EDX | 0 | 非推奨 (以前に示した MWAIT 命令の可用性) |
| 1 | ゲスト デバッグのサポートを利用できます | |
| 2 | パフォーマンス モニターのサポートを利用できます | |
| 3 | 物理 CPU 動的パーティション分割イベントのサポートを利用できます | |
| 4 | XMM レジスタを介したハイパーコール入力パラメーター ブロックの受け渡しのサポートを利用できます | |
| 5 | 仮想ゲストのアイドル状態のサポートを利用できます | |
| 6 | ハイパーバイザーのスリープ状態のサポートを利用できます | |
| 7 | NUMA 距離のクエリのサポートを利用できます | |
| 八 | タイマー周波数の決定のサポートを利用できます | |
| 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 の Last Branch Record (LBR) 機能 | |
| 31-27 | 予約済み |
実装に関する推奨事項 - 0x40000004
最適なパフォーマンスのために OS が実装することをハイパーバイザーが推奨する動作を示します。
| Register | ビット | 提供される情報 |
|---|---|---|
| EAX | 0 | MOV から CR3 命令ではなく、アドレス空間スイッチにハイパーコールを使用することをお勧めします。 |
| 1 | INVLPG または MOV から CR3 命令ではなく、ローカル TLB フラッシュにハイパーコールを使用することをお勧めします。 | |
| 2 | プロセッサ間割り込みではなく、リモート TLB フラッシュにハイパーコールを使用することをお勧めします。 | |
| 3 | APIC レジスタの EOI、ICR、および TPR にアクセスするために、メモリ マップされた対応するレジスタではなく、MSR を使用することをお勧めします。 | |
| 4 | ハイパーバイザーによって提供される MSR を使用してシステムリセットを開始することをお勧めします。 | |
| 5 | このパーティションには緩やかなタイミングを使用することをお勧めします。 VM を使用する場合は、外部割り込みのタイムリーな配信に依存するウォッチドッグ タイムアウトを無効にする必要があります。 | |
| 6 | DMA の再マッピングの使用をお勧めします。 | |
| 7 | 割り込み再マップの使用をお勧めします。 | |
| 八 | 予約済み。 | |
| 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 の場合、ハイパーバイザーは対応する情報を公開しません。それ以外の場合は、これらの意味があります。
| Register | 提供される情報 |
|---|---|
| EAX | サポートされている仮想プロセッサの最大数 |
| EBX | サポートされている論理プロセッサの最大数 |
| ECX | 割り込み再マップに使用できる物理割り込みベクトルの最大数。 |
| EDX | 予約済み |
実装ハードウェア機能 - 0x40000006
どのハードウェア固有の機能が検出され、現在ハイパーバイザーで使用されているかを示します。
| Register | ビット | 提供される情報 |
|---|---|---|
| EAX | 0 | APIC オーバーレイ アシストのサポートが検出され、使用中です。 |
| 1 | MSR ビットマップのサポートが検出され、使用中です。 | |
| 2 | アーキテクチャ パフォーマンス カウンターのサポートが検出され、使用中です。 | |
| 3 | 第 2 レベルのアドレス変換のサポートが検出され、使用中です。 | |
| 4 | DMA 再マッピングのサポートが検出され、使用中です。 | |
| 5 | 割り込み再マップのサポートが検出され、使用中です。 | |
| 6 | メモリ 巡回スクラバーがハードウェアに存在することを示します。 | |
| 7 | DMA 保護が使用されています。 | |
| 八 | 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 エミュレーションのサポートが存在します。 | |
| 二十四 | ACPI WDAT テーブルが検出され、ハイパーバイザーによって使用中です。 | |
| 31-25 | 予約済み | |
| EBX | 予約済み | |
| ECX | 予約済み | |
| EDX | 予約済み |
入れ子になったハイパーバイザー機能の識別 - 0x40000009
入れ子になった状態で実行するときにハイパーバイザーによってパーティションに公開される機能について説明します。 EAX では、仮想 MSR へのアクセスについて説明します。 EDX では、ハイパーコールへのアクセスについて説明します。
| 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 ハイパーコールのサポートを示します (x64 プラットフォーム上)。 | |
| 19 | 対応する MSR ビットマップの使用のサポートを示します。 | |
| 20 | ページ フォールト例外クラスで仮想化例外を組み合わせることのサポートを示します。 | |
| 21 (二十一) | VMCS の 0x00002802 (GuestIa32DebugCtl) フィールドの 0 以外の値のサポートを示します。 | |
| 22 | AMD プラットフォームでの対応 TLB のサポートを示します。 ASID フラッシュは、NPT から派生した TLB エントリには影響しません。 NPT TLB エントリを無効にするには、ハイパーコールを使用する必要があります。 HvCallFlushGuestPhysicalAddressSpace と HvCallFlushGuestPhysicalAddressList ハイパーコールのサポートも示します。 | |
| 31-21 | 予約済み | |
| EBX | 0 | 対応する VMCS の GuestPerfGlobalCtrl フィールドと HostPerfGlobalCtrl フィールドのサポートを示します。 |
| 31-1 | 予約済み | |
| ECX | 予約済み | |
| EDX | 予約済み |
バージョン管理
ハイパーバイザーのバージョン情報は、リーフ 0x40000002でエンコードされます。 メイン バージョンとサービス バージョンの 2 つのバージョン番号が用意されています。
メイン バージョンには、メジャー バージョン番号とマイナー バージョン番号とビルド番号が含まれます。 これらは、Microsoft Windows のリリース番号に対応しています。 サービスバージョンは、メインバージョンに加えられた変更を記述します。
クライアントは、CPUID を使用してハイパーバイザー機能をチェックすることを強くお勧めします。バージョン範囲と比較するのではなく、0x40000003を使用して0x40000005を残します。
機能とインターフェイスの検出 (ARM64)
ARM64 アーキテクチャでは、機能とインターフェイスの検出に次のメカニズムが使用されます。
- HvCallGetVpRegisters を使用した HvRegister クエリ – 静的な機能とバージョン情報に使用されます。
- メモリ マップト レジスタ – 状態と制御値に使用されます。
ハイパーバイザーは、これらのアーキテクチャ固有のインターフェイスに加えて、 ハイパーコールを使用して実装された単純な手続き型インターフェイスを提供します。
ハイパーバイザー検出
ほとんどのハイパーバイザー インターフェイスを使用する前に、ソフトウェアはまず、仮想化された環境内で実行されているかどうかを判断する必要があります。
ARM64 では、ゲスト ソフトウェアは SMCCC (SMC 呼び出し規則) 標準インターフェイスを使用してハイパーバイザーを検出できます。 検出は、X0 の関数 ID 0xC600FF0 を持つ HVC または SMC 命令を使用して実行されます (これは、64 ビットベンダー固有のハイパーバイザー呼び出しVENDOR_HYP_FUNCTION_CODE_UIDに対応します)。 この呼び出しは、0 の imm16 を含む SMCCC 規則に従います。 Microsoft ハイパーバイザーは、GUID 4d32ba58-cd24-4764-8eef-6c7516597024を表す次の値を返します。
| Register | 価値 |
|---|---|
| X0 | 0x4d32ba58 |
| X1 | 0xcd244764 |
| X2 | 0x8eef6c75 |
| X3 | 0x16597024 |
ハイパーバイザーが検出されると、ゲスト ソフトウェアは HvCallGetVpRegisters ハイパーコール を使用して合成レジスタを介してハイパーバイザー機能を照会できます。 ゲスト OS ID レジスタが設定される前に、いくつかのキー レジスタを照会できるため、起動時にハイパーバイザー機能を早期に検出できます。
ハイパーバイザー機能レジスタ
ARM64 プラットフォームは、CPUID 命令ではなく、合成レジスタを使用してハイパーバイザー情報を照会します。 これらのレジスタは、対応する x64 CPUID に相当する情報を提供し、 HvCallGetVpRegisters 経由でアクセスします。 すべての機能レジスタは、128 ビット値を返します。
ハイパーバイザー システム ID - HvRegisterHypervisorVersion
128 ビット値でエンコードされたバージョン情報を返します。 レイアウトは x64 CPUID リーフ 0x40000002と同じです。x64 レジスタ値は 128 ビットの結果にパックされます (ビット 31-0 の EAX、ビット 63-32 の EBX、ビット 95 から 64 の ECX、ビット 127 から 96 の EDX)。
ハイパーバイザー機能の識別 - HvRegisterPrivilegesAndFeaturesInfo
x64 CPUID リーフ 0x40000003に相当します。 現在のパーティション特権に基づいて、パーティションで使用できる機能を示します。 次のフィールドを含む 128 ビット値を返します。
| ビット | 提供される情報 |
|---|---|
| 31-0 | HV_PARTITION_PRIVILEGE_MASKのビット 31 から 0 に対応します |
| 63-32 | HV_PARTITION_PRIVILEGE_MASKのビット 63 から 32 に対応します |
| 64 | ゲスト デバッグのサポートを利用できます。 |
| 65 | パフォーマンス モニターのサポートを利用できます。 |
| 66 | 物理 CPU 動的パーティション分割イベントのサポートを利用できます。 |
| 67 | 仮想ゲストアイドル状態のサポートを利用できます。 |
| 68 | ハイパーバイザーのスリープ状態のサポートを利用できます。 |
| 69 | NUMA 距離のクエリのサポートを利用できます。 |
| 70 | タイマー周波数の決定をサポートしています。 |
| 71 | 合成マシンのチェックの挿入のサポートを利用できます。 |
| 72 | ゲスト クラッシュ レジスタのサポートを利用できます。 |
| 73 | 予約済み。 |
| 74 | DisableHypervisorAvailable。 |
| 75 | 予約済み。 |
| 76 | SintPollingModeAvailable。 |
| 77 | 直接合成タイマーを使用します。 |
| 127-78 | 予約済み。 |
実装に関する推奨事項 - HvRegisterFeaturesInfo
x64 CPUID リーフ 0x40000004に相当します。 最適なパフォーマンスのために OS が実装することをハイパーバイザーが推奨する動作を示します。 128 ビット値を返します。
| ビット | 提供される情報 |
|---|---|
| 0 | UseHvRegisterForReset - ARM64 では、これは常に false です (パーティションでは、代わりに PSCI SYSTEM_RESETを使用する必要があります)。 |
| 1 | このパーティションには緩やかなタイミングを使用することをお勧めします。 VM を使用する場合は、外部割り込みのタイムリーな配信に依存するウォッチドッグ タイムアウトを無効にする必要があります。 |
| 2 | SyntheticClusterIpi ハイパーコールの使用をお勧めします。 ARM64 では、ルート パーティション (ICC_SGI1R_EL1を直接使用する必要があります) の場合は false、ゲスト パーティションの場合は true です。 |
| 3 | 新しい ExProcessorMasks インターフェイスを使用することをお勧めします。 |
| 4 | ハイパーバイザーが Hyper-V パーティション内に入れ子になっていることを示します。 |
| 5 | パーティションがルート パーティションによって提供される QueryPerformanceCounter バイアスを使用する必要があることを示します。 |
| 20-6 | 予約済み |
| 21 (二十一) | UseHypercallForMmioAccess |
| 22 | UseGpaPinningHypercall |
| 23 | WakeVps |
| 25-24 | 予約済み |
| 26 | MapPartitionEventLogBuffer |
| 31-27 | 予約済み |
| 63-32 | エラーについてハイパーバイザーに通知する前に、スピンロックエラーを再試行する試行回数を推奨します。 0xFFFFFFFFは、通知しない旨を示します。 |
| 127-64 | 予約済み |
ハイパーバイザー実装の制限 - HvRegisterImplementationLimitsInfo
現在のハイパーバイザー実装でサポートされているスケール制限について説明します。 値が 0 の場合、ハイパーバイザーは対応する情報を公開しません。 x64 CPUID リーフ 0x40000005と同じレイアウトの 128 ビット値を返 します。x64 レジスタ値は 128 ビットの結果にパックされます (EAX はビット 31-0、EBX はビット 63-32、ECX はビット 95-64、EDX はビット 127-96)。
実装ハードウェア機能 - HvRegisterHardwareFeaturesInfo
x64 CPUID リーフ 0x40000006に相当します。 どのハードウェア固有の機能が検出され、現在ハイパーバイザーで使用されているかを示します。 128 ビット値を返します。
| ビット | 提供される情報 |
|---|---|
| 0 | アーキテクチャ パフォーマンス カウンターのサポートが検出され、使用中です。 |
| 1 | 第 2 レベルのアドレス変換のサポートが検出され、使用中です。 |
| 2 | DMA 再マッピングのサポートが検出され、使用中です。 |
| 3 | 割り込み再マップのサポートが検出され、使用中です。 |
| 4 | メモリ 巡回スクラバーがハードウェアに存在することを示します。 |
| 5 | DMA 保護が使用されています。 |
| 6 | 合成タイマーは揮発性です。 |
| 127-7 | 予約済み |
バージョン管理
ハイパーバイザーのバージョン情報は HvRegisterHypervisorVersion でエンコードされます。 この形式は、対応する x64 と一致します。