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 範圍 |