這很重要
某些資訊與發行前版本產品有關,在發行前可能會大幅修改。 Microsoft 對於此處提供的資訊,不做任何明確或隱含的保證。
有時候,需要對即將進行分頁驅逐或升級操作的配置執行特定作業。 例如,記憶體配置在裝置存取期間可能會壓縮。 收回該配置 (也就是不再處於裝置存取之下) 時,核心模式驅動程式 (KMD) 必須先解壓縮它,才能再實際收回。 DXGK_OPERATION_NOTIFY_ALLOC分頁作業就是為此目的而設計的。 此作業從 Windows 11 版本 24H2 (WDDM 3.2) 開始提供。
如何要求分配通知
當系統呼叫 DxgkDdiCreateAllocation 來建立配置時,KMD 可以在 DXGK_ALLOCATIONINFOFLAGS2 中設定旗標,以指示 Dxgkrnl 執行 DXGK_OPERATION_NOTIFY_ALLOC 分頁作業。 目前的通知旗標包括:
- 通知驅逐
- 通知IoMmuUnmap
DDI 變更
已新增DXGK_OPERATION_NOTIFY_ALLOC分頁作業
DXGK_OPERATION_NOTIFY_ALLOC分頁操作已添加至DXGK_BUILDPAGINGBUFFER_OPERATION。
已新增 DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC 結構以與 DXGK_OPERATION_NOTIFY_ALLOC 作業搭配使用。
新增至DXGK_ALLOCATIONINFOFLAGS2的旗幟
下列旗標已新增至 DXGK_ALLOCATIONINFOFLAGS2。
通知驅逐
KMD 會在其 DxgkDdiCreateAllocation 實作中設定 NotifyEviction 旗標。 此旗標表示 Dxgkrnl 應該在收回配置之前向驅動程式發出 DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 作業。
當指定旗標且配置即將收回時:
- Dxgkrnl 會將配置映射至分頁程序的 GPU 虛擬位址(VA)空間。
- Dxgkrnl 呼叫 DxgkDdiBuildPagingBuffer,並帶有 DXGK_OPERATION_NOTIFY_ALLOC 操作和 NotifyEviction 標誌。
- 驅動程式會在分頁 DMA 緩衝區中生成命令。
- 分頁 DMA 緩衝區會提交以在系統環境中執行。
- Dxgkrnl 會從分頁過程的 GPU VA 空間解除映射配置。
如果配置大小大於分頁程式 GPU VA 空間的大小,則可以執行這些步驟多次。
只有在分配從孔徑區段或隱含系統記憶體區段收回時,Dxgkrnl 才會將通知傳送至驅動程式。
通知IoMmuUnmap
KMD 會在其 DxgkDdiCreateAllocation 函式中設定 NotifyIoMmuUnmap 旗標。 此旗標表示 Dxgkrnl 應該先發出 DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap 作業,再從 IOMMU 取消對應配置。 驅動程式有機會清除內部快取。 驅動程式應該確保在從分頁操作返回後不會存取分配的 GPU 虛擬地址。
當旗標被指定並且在驅逐過程中要從 IOMMU 清除配置時:
- Dxgkrnl 使用DXGK_OPERATION_NOTIFY_ALLOC作業及NotifyIoMmuUnmap旗標呼叫DxgkDdiBuildPagingBuffer。
- 驅動程式會在分頁 DMA 緩衝區中建置命令。
- 分頁 DMA 緩衝區會提交到系統環境中執行。
- Dxgkrnl 會等候所有分頁作業完成。
- 配置會從 IOMMU 解除對應。
只有在裝置支援 GpuVaIoMmu 或 GpuVaIoMmuGlobal 虛擬定址模型時,才會傳送通知。
分頁處理程序的 GPU VA 空間大小
若要取得分頁程式 GPU VA 空間的大小,會將 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE 新增至 DXGK_QUERYADAPTERINFOTYPE 列舉。
DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 作業需要將對應的配置映射至分頁處理程序的 GPU VA 空間。 只有在有本機記憶體區段或啟用硬體排程時,Dxgkrnl 才會為分頁 (系統) 進程配置 GPU VA 空間。 GPU VA 空間的大小是最大本機記憶體區段的四分之一,或硬體排程記錄緩衝區的大小,以較大者為準。 生成的 GPU VA 大小可能太小,無法映射整個配置。 在此情況下,驅動程式必須指定分頁程序的 GPU VA 空間大小。
Dxgkrnl 使用 DXGKARG_QUERYADAPTERINFO 結構呼叫 DxgkDdiQueryAdapterInfo,以取得分頁程序 GPU VA 空間的大小:
- 類型 設定為 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE。
- pInputData 指向 UINT 值,以指定 LDA 組態中的實體配接器索引。 Dxgkrnl 會針對非 LDA 組態將其設定為零。
-
InputDataDataSize 是
sizeof(UINT)。 - pOutputData 指向 UINT 值,其中驅動程式會傳回分頁程式 GPU VA 空間的大小,以 MB 為單位。
-
OutputDataSize 是
sizeof(UINT)。
如果驅動程式呼叫失敗或傳回零的 pOutputData 值,OS 會判斷分頁程式 GPU VA 大小。
如果轉接器具有較大的本機記憶體區段,驅動程式應傳回零,讓 OS 選擇分頁進程 GPU VA 空間的大小。 VA 空間越大,分頁程式 GPU 分頁表所需的記憶體就越多。 分頁數據表一律是常駐的,因此驅動程式不應該為 VA 空間指定不必要的大型大小。
當配置大小超過分頁進程 GPU VA 空間大小時,分頁作業 (填入、傳輸、通知配置) 會以區塊完成。