共用方式為


HvFlushVirtualAddressList

HvCallFlushVirtualAddressList hypercall 會使屬於指定位址空間的虛擬 TLB 部分失效。

介面

HV_STATUS
HvCallFlushVirtualAddressList(
   _In_ HV_ADDRESS_SPACE_ID AddressSpace,
   _In_ HV_FLUSH_FLAGS Flags,
   _In_ UINT64 ProcessorMask,
   _Inout_ PUINT32 GvaCount,
   _In_reads_(GvaCount) PCHV_GVA GvaRangeList
   );

虛擬 TLB 無效作業會處理一或多個處理器。

如果來賓知道哪些處理器可能需要排清,它可以指定處理器遮罩。 遮罩中的每個位都會對應至虛擬處理器索引。 例如,0x0000000000000051的遮罩表示 Hypervisor 應該只排清虛擬處理器 0、4 和 6 的 TLB。

下列旗標可用來修改排清的行為:

  • HV_FLUSH_ALL_PROCESSORS表示作業應該套用至資料分割內的所有虛擬處理器。 如果設定此旗標,則會忽略 ProcessorMask 參數。
  • HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACES表示作業應該套用至所有虛擬位址空間。 如果設定此旗標,則會忽略 AddressSpace 參數。
  • HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLY對這個呼叫沒有意義,而且被視為不正確選項。

所有其他旗標都是保留的,而且必須設定為零。

此呼叫會接受一份清單的[AZURE] 範圍。 每個範圍都有一個基底的建立者。 因為排清是使用頁面資料細微性來執行,所以可以使用其底端的 12 位來定義範圍長度。 這些位會將範圍中初始頁面) 以外的其他頁面數目編碼 (。 這可讓每個專案編碼 1 到 4096 頁的範圍。

落在「大型頁面」對應 (2MB 或 4MB) 的 JSON,會導致整個大型頁面從虛擬 TLB 排清。

此呼叫可確保在時間控制項傳回給呼叫端時,已發生指定虛擬處理器上所有排清的可觀察效果。

不正確 GVA (會忽略在分割區之) 結尾以外的位址。

如果目標虛擬處理器的 TLB 需要排清,且該虛擬處理器禁止 TLB 排清,則呼叫端的虛擬處理器會暫停。 當 TLB 排清不再受到禁止時,虛擬處理器會「未暫停」,而且會重新發出 Hypercall。

呼叫程式碼

0x0003 (Rep)

輸入參數

名稱 Offset 大小 提供的資訊
AddressSpace 0 8 指定 (CR3 值) 的位址空間識別碼。
Flags 8 8 修改排清作業的旗標位集。
ProcessorMask 16 8 處理器遮罩,指出哪些處理器應該受到排清作業的影響。

輸入清單元素

名稱 Offset 大小 提供的資訊
GvaRange 0 8 SP 範圍