各パーティションによって公開される仮想マシン インターフェイスには、メモリ管理ユニット (MMU) が含まれています。 ハイパーバイザー パーティションによって公開される仮想 MMU は、通常、既存の MMU と互換性があります。
仮想 MMU 実装はアーキテクチャ固有です。 このドキュメントでは、プラットフォーム固有のセクションが明確にマークされた x64 プラットフォームと ARM64 プラットフォームの両方について説明します。
Virtual MMU の概要
仮想プロセッサは、仮想メモリと仮想 TLB (変換ルックアサイド バッファー) を公開します。このバッファーは、仮想アドレスから (ゲスト) 物理アドレスへの変換をキャッシュします。 論理プロセッサ上の TLB と同様に、仮想 TLB は非コヒーレント キャッシュであり、この非コヒーレンスはゲストに表示されます。 ハイパーバイザーは、TLB をフラッシュする操作を公開します。 ゲストは、これらの操作を使用して、一貫性のない可能性のあるエントリを削除し、仮想アドレス変換を予測可能にすることができます。
Compatibility
ハイパーバイザーによって公開される仮想 MMU は、通常、基になるプロセッサ アーキテクチャ内にある物理 MMU と互換性があります。
x64 プラットフォームの場合
x64 プラットフォーム上の仮想 MMU は、通常、x64 プロセッサ内にある物理 MMU と互換性があります。 次のゲスト監視可能な違いがあります。
- CR3。PWT と CR3。一部のハイパーバイザー実装では、PCD ビットがサポートされない場合があります。 このような実装では、MOV から CR3 命令またはタスク ゲート スイッチを介してこれらのフラグを設定しようとするゲストによる試行は無視されます。 HvSetVpRegisters または HvCallSwitchVirtualAddressSpace を使用してプログラムでこれらのビットを設定しようとすると、エラーが発生する可能性があります。
- リーフ ページ テーブル エントリ内の PWT ビットと PCD ビット (たとえば、4 K ページの場合は PTE、大きなページの場合は PDE) は、マップされるページのキャッシュ可能性を指定します。 非リーフ ページ テーブル エントリ内の PAT、PWT、および PCD ビットは、階層内の次のページ テーブルのキャッシュ可能性を示します。 一部のハイパーバイザー実装では、これらのフラグがサポートされない場合があります。 このような実装では、ハイパーバイザーによって実行されるすべてのページ テーブル アクセスは、ライトバック キャッシュ属性を使用して実行されます。 これは、特に、ページ テーブル エントリに書き込まれたアクセスビットとダーティ ビットに影響します。 ゲストが非リーフ ページ テーブル エントリ内で PAT、PWT、または PCD ビットを設定した場合、仮想プロセッサがそのページ テーブルによってマップされているページにアクセスすると、"サポートされていない機能" メッセージが生成される可能性があります。
- 一部のハイパーバイザー実装では、CR0.CD (キャッシュ無効化) ビットがサポートされない場合があります。 このような実装では、CR0.CD ビットを 0 に設定する必要があります。 MOV から CR0 命令を介してこのフラグを設定しようとすると、ゲストは無視されます。 HvSetVpRegisters を使用してプログラムでこのビットを設定しようとすると、エラーが発生します。
- PAT (ページ アドレスの種類) MSR は VP ごとのレジスタです。 ただし、パーティション内のすべての仮想プロセッサが PAT MSR を同じ値に設定すると、新しい効果はパーティション全体の効果になります。
- セキュリティと分離の理由から、INVD 命令は WBINVD 命令のように動作するように仮想化され、いくつかの違いがあります。 セキュリティ上の理由から、代わりに CLFLUSH を使用する必要があります。
従来の TLB 管理操作
各アーキテクチャには、プロセッサの TLB を管理するためのネイティブ メカニズムが用意されています。 これらのメカニズムはハイパーバイザーによって仮想化され、ローカル仮想プロセッサにのみ影響します。 他の仮想プロセッサでの変換を無効にするには、ソフトウェアでアーキテクチャ固有のプロセッサ間割り込みまたは次のセクションで説明する拡張 TLB 管理ハイパーコールを使用する必要があります。
x64 プラットフォームの場合
x64 アーキテクチャには、次の TLB 管理メカニズムが用意されています。
- INVLPG 命令は、プロセッサの TLB からの単一ページの翻訳を無効にします。 指定された仮想アドレスが最初に 4 K ページとしてマップされていた場合、このページの変換は TLB から削除されます。 指定された仮想アドレスが最初に "大きなページ" としてマップされていた場合 (MMU モードに応じて 2 MB または 4 MB)、大きなページ全体の変換が TLB から削除されます。 INVLPG 命令は、グローバル翻訳と非グローバル変換の両方をフラッシュします。 グローバル翻訳は、ページ テーブル エントリ内に "グローバル" ビットが設定されているものとして定義されます。
- プロセッサの TLB 内のすべての非グローバル ページの CR3 無効化変換を変更する MOV から CR3 命令 およびタスクスイッチ。
- CR4 を変更する MOV から CR4 への命令。PGE (グローバル ページ有効化) ビット、CR4。PSE (ページ サイズ拡張) ビット、または CR4。PAE (ページ アドレス拡張) ビットは、プロセッサの TLB 内のすべての翻訳 (グローバルおよび非グローバル) を無効にします。
これらの無効化操作はすべて、1 つのプロセッサにのみ影響します。 他のプロセッサの翻訳を無効にするには、ソフトウェア ベースの "TLB 撃墜" メカニズム (通常はプロセス間の割り込みを使用して実装される) を使用する必要があります。
ARM64 プラットフォームの場合
ARM64 アーキテクチャは、TLBI (TLB Invalidate) 命令を通じて TLB 管理メカニズムを提供します。 詳細については、ARM アーキテクチャ のマニュアルを参照してください。
メモ: セット/ウェイ キャッシュメンテナンス命令 (DC ISW、DC CSW、DC CISW など) は仮想化環境ではサポートされず、ノーオペレーションとして扱われます。
仮想 TLB の機能強化
x64 プラットフォームでは、前述の従来の TLB 管理メカニズムをサポートするだけでなく、ハイパーバイザーでは、ゲストが仮想 TLB をより効率的に管理できるようにする一連の拡張機能もサポートされています。 これらの拡張操作は、従来の TLB 管理操作と同じ意味で使用できます。
ハイパーバイザーでは、TLB を無効にするために次のハイパーコールがサポートされています。
| Hypercall | Description |
|---|---|
| HvCallFlushVirtualAddressSpace | 指定したアドレス空間に属するすべての仮想 TLB エントリを無効にします。 |
| HvCallFlushVirtualAddressSpaceEx | HvCallFlushVirtualAddressSpace と同様に、スパース VP セットを入力として受け取ります。 |
| HvCallFlushVirtualAddressList | 指定したアドレス空間の一部を無効にします。 |
| HvCallFlushVirtualAddressListEx | HvCallFlushVirtualAddressList と同様に、スパース VP セットを入力として受け取ります。 |
一部のシステム (ハードウェアで十分な仮想化がサポートされているシステム) では、ローカルまたはリモート (クロスプロセッサ) TLB の無効化に対して従来の TLB 管理命令が高速になる場合があります。 最適なパフォーマンスに関心がある場合は、CPUID リーフ 0x40000004を使用して、ハイパーコールを使用して実装する動作を決定する必要があります。
- UseHypercallForAddressSpaceSwitch: このフラグが設定されている場合、呼び出し元は HvCallSwitchVirtualAddressSpace を使用してアドレス空間を切り替える方が高速であると想定する必要があります。 このフラグがクリアされている場合は、MOV から CR3 への命令をお勧めします。
- UseHypercallForLocalFlush: このフラグが設定されている場合、呼び出し元は、仮想 TLB から 1 つ以上のページをフラッシュするためにハイパーコール (INVLPG や MOV から CR3 ではなく) を使用する方が高速であると想定する必要があります。
- UseHypercallForRemoteFlushAndLocalFlushEntire: このフラグが設定されている場合、呼び出し元は、仮想 TLB から 1 つ以上のページをフラッシュするために、(ゲストによって生成されたプロセッサ間割り込みを使用するのではなく) ハイパーコールを使用する方が高速であると想定する必要があります。
ARM64 プラットフォームでは、ゲストは通常、TLB 管理にアーキテクチャ メカニズムを使用する必要があります。
メモリ キャッシュ制御の概要
ハイパーバイザーでは、ゲストの GVA 空間内にマップされたページのゲスト定義のキャッシュ可能性設定がサポートされます。 使用可能なキャッシュ可能性の設定とその意味の詳細については、Intel または AMD のドキュメントを参照してください。
仮想プロセッサが GVA 領域を介してページにアクセスすると、ハイパーバイザーは、ページのマップに使用されるゲスト ページ テーブル エントリ内のキャッシュ属性ビット (PAT、PWT、PCD) を受け入れます。 これらの 3 つのビットは、ページの最終的なキャッシュ可能性設定を検索するために、パーティションの PAT (ページ アドレスの種類) レジスタのインデックスとして使用されます。
GPA スペースを介して直接アクセスされるページ (たとえば、CR0.PG がクリアされるためにページングが無効になっている場合) は、MTRR によって定義されたキャッシュ可能性を使用します。 ハイパーバイザーの実装で仮想 MTRR がサポートされていない場合は、WB キャッシュ可能性が想定されます。
パーティションとハイパーバイザーの間でのキャッシュの種類の混在
ゲストは、GPA 領域内の一部のページがハイパーバイザーによってアクセスされる可能性があることに注意してください。 以下の一覧は完全ではありませんが、いくつかの例を示しています。
- ハイパーコールの入力パラメーターまたは出力パラメーターを含むページ
- ハイパーコール ページ、SynIC SIEF ページ、SIM ページ、統計ページを含むすべてのオーバーレイ ページ
- VP アシスト ページとその他のハイパーバイザー インターフェイス ページ
ハイパーバイザーは常に、キャッシュ可能な属性を使用してハイパーコール パラメーターとオーバーレイ ページ Write-Back アクセスを実行します。
- x64 プラットフォームの場合: PAT を使用した WB (Write-Back) キャッシュの種類
- ARM64 プラットフォームの場合: 内部および外部のライトバック、読み取り/割り当て、Write-Allocate 属性を持つ通常のメモリ
ハイパーバイザーは常に WB キャッシュ設定を使用してハイパーコール パラメーターとオーバーレイ ページへのアクセスを実行します。