次の方法で共有


HvCallFlushVirtualAddressList

HvCallFlushVirtualAddressList ハイパーコールは、指定されたアドレス空間に属する仮想 TLB の部分を無効にします。

アーキテクチャ: x64 のみ。

インターフェイス

HV_STATUS
HvCallFlushVirtualAddressList(
   _In_ HV_ADDRESS_SPACE_ID AddressSpace,
   _In_ HV_FLUSH_FLAGS Flags,
   _In_ UINT64 ProcessorMask,
   _Inout_ UINT32* GvaCount,
   _In_reads_(*GvaCount) const HV_GVA* GvaRangeList
   );

仮想 TLB 無効化操作は、1 つ以上のプロセッサに対して機能します。

フラッシュが必要なプロセッサに関する知識がある場合は、プロセッサ マスクを指定できます。 マスク内の各ビットは、仮想プロセッサ インデックスに対応します。 たとえば、0x0000000000000051のマスクは、ハイパーバイザーが仮想プロセッサ 0、4、6 の TLB のみをフラッシュする必要があることを示します。

フラッシュの動作を変更するには、次のフラグを使用できます。

  • HV_FLUSH_ALL_PROCESSORSは、パーティション内のすべての仮想プロセッサに操作を適用する必要があることを示します。 このフラグが設定されている場合、ProcessorMask パラメーターは無視されます。
  • HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACESは、操作をすべての仮想アドレス空間に適用する必要があることを示します。 このフラグが設定されている場合、AddressSpace パラメーターは無視されます。
  • HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLYは、この呼び出しには意味をなせず、無効なオプションとして扱われます。

他のすべてのフラグは予約済みであり、ゼロに設定する必要があります。

この呼び出しは、GVA 範囲の一覧を受け取ります。 各範囲には基本 GVA があります。 フラッシュはページ粒度で実行されるため、GVA の下位 12 ビットを使用して範囲の長さを定義できます。 これらのビットは、範囲内の (初期ページを超えて) 追加ページの数をエンコードします。 これにより、各エントリは 1 ~ 4096 ページの範囲をエンコードできます。

"大きなページ" マッピング (2 MB または 4 MB) 内にある GVA では、大きなページ全体が仮想 TLB からフラッシュされます。

この呼び出しにより、制御が呼び出し元に戻るまでに、指定された仮想プロセッサに対するすべてのフラッシュの観測可能な影響が発生したことが保証されます。

無効な GVA (パーティションの GVA 領域の末尾を超えるアドレスを指定するもの) は無視されます。

ターゲット仮想プロセッサの TLB でフラッシュが必要であり、その仮想プロセッサが TLB フラッシュを禁止している場合、呼び出し元の仮想プロセッサは中断されます。 TLB フラッシュが禁止されなくなった場合、仮想プロセッサは "非依存" になり、ハイパーコールが再発行されます。

呼び出しコード

0x0003 (Rep)

パラメーターの入力

名前 オフセット サイズ 提供される情報
AddressSpace 0 アドレス空間 ID (CR3 値) を指定します。
Flags フラッシュの操作を変更するフラグ ビットのセット。
ProcessorMask 16 フラッシュ操作の影響を受けるプロセッサを示すプロセッサ マスク。

Input List 要素

名前 オフセット サイズ 提供される情報
GvaRange 0 GVA 範囲