重要
一些信息与预发布产品相关,在商业发行之前可能会发生实质性修改。 Microsoft对此处提供的信息不作任何明示或暗示的保证。
有时,需对即将经历分页逐出或提升操作的分配执行一些操作。 例如,分配被设备访问时可能会被压缩。 当该分配被逐出(即不再处于设备访问状态)时,内核模式驱动程序(KMD)必须先对其进行解压缩,然后才能执行实际的逐出操作。 DXGK_OPERATION_NOTIFY_ALLOC分页操作是为此目的而设计的。 此操作从 Windows 11 的版本 24H2(WDDM 3.2)开始可用。
如何请求分配通知
当系统调用 DxgkDdiCreateAllocation 来创建分配时,KMD 可以在 DXGK_ALLOCATIONINFOFLAGS2 中设置标志,以指示 Dxgkrnl 执行 DXGK_OPERATION_NOTIFY_ALLOC 分页操作。 当前通知标志为:
- NotifyEviction
- NotifyIoMmuUnmap
DDI 更改
已添加分页操作DXGK_OPERATION_NOTIFY_ALLOC
DXGK_OPERATION_NOTIFY_ALLOC 分页操作被添加到 DXGK_BUILDPAGINGBUFFER_OPERATION。
添加了 DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC 结构,用于 DXGK_OPERATION_NOTIFY_ALLOC 操作。
添加标志到DXGK_ALLOCATIONINFOFLAGS2
以下标志将添加到 DXGK_ALLOCATIONINFOFLAGS2。
NotifyEviction
KMD 在其 DxgkDdiCreateAllocation 实现中设置 NotifyEviction 标志。 此标志指示 Dxgkrnl 应在逐出分配之前向驱动程序发出 DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 操作。
当指定标志且分配即将被逐出时:
- Dxgkrnl 将分配映射到分页进程的 GPU 虚拟地址(VA)空间。
- Dxgkrnl 以 DXGK_OPERATION_NOTIFY_ALLOC 操作和 NotifyEviction 标志调用 DxgkDdiBuildPagingBuffer。
- 驱动程序在分页 DMA 缓冲区中生成命令。
- 分页 DMA 缓冲区被提交,以在系统上下文中执行。
- Dxgkrnl 将分页进程 GPU VA 空间中的分配解除映射。
如果分配大小大于分页进程 GPU VA 空间的大小,则可以多次执行这些步骤。
Dxgkrnl 仅在分配从光圈段或隐式系统内存段中逐出时,才会将通知发送到驱动程序。
NotifyIoMmuUnmap
KMD 在其 DxgkDdiCreateAllocation 函数中设置 NotifyIoMmuUnmap 标志。 此标志指示 Dxgkrnl 应在从 IOMMU 解除映射分配之前发出 DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap 操作。 驱动程序有机会清除内部缓存。 驱动程序应确保在分页操作返回后不会访问分配的 GPU VA。
当指定标志并且即将在驱逐期间从 IOMMU 取消映射分配时:
- Dxgkrnl 调用 DxgkDdiBuildPagingBuffer,并使用 DXGK_OPERATION_NOTIFY_ALLOC 操作和 NotifyIoMmuUnmap 标志。
- 驱动程序在分页 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 配置中的物理适配器索引。 对于非 LDA 配置,Dxgkrnl 将其设置为零。
-
InputDataDataSize 为
sizeof(UINT). - pOutputData 指向 UINT 值,其中驱动程序返回分页进程 GPU VA 空间的大小(以 MB 为单位)。
-
OutputDataSize 为
sizeof(UINT).
如果驱动程序调用失败或返回 pOutputData 值为零,OS 将确定分页进程 GPU VA 大小。
如果适配器具有较大的本地内存段,驱动程序应返回零,让 OS 选择分页进程 GPU VA 空间的大小。 VA 空间越大,分页进程 GPU 页表所需的内存越多。 页表始终是驻留的,因此驱动程序不应为 VA 空间指定不必要的大大小。
当分配大小超过分页进程 GPU VA 空间大小时,分页操作(填充、传输、通知分配)以块的形式完成。