分配通知

重要

一些信息与预发布产品相关,在商业发行之前可能会发生实质性修改。 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_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 标志。 此标志表示,在从 IOMMU 取消映射分配之前,Dxgkrnl 应发出 DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap 操作。 驱动程序有机会清除内部缓存。 驱动程序应确保在从分页操作返回后不会访问分配 GPU VA。

    指定了标志并且在逐出期间分配即将从 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 空间的大小:

  • Type 设置为 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE
  • pInputData 指向一个 UINT 值,该值指定 LDA 配置中的物理适配器索引。 对于非 LDA 配置,Dxgkrnl 将其设置为零。
  • InputDataDataSizesizeof(UINT)
  • pOutputData 指向 UINT 值,其中驱动程序返回分页进程 GPU VA 空间的大小(以 MB 为单位)。
  • OutputDataSizesizeof(UINT)

如果驱动程序调用失败或返回 pOutputData 值为零,OS 将确定分页进程 GPU VA 大小。

如果适配器具有较大的本地内存段,驱动程序应返回零,让 OS 选择分页进程 GPU VA 空间的大小。 VA 空间越大,分页进程 GPU 页表所需的内存越多。 页表始终是驻留的,因此驱动程序不应为 VA 空间指定不必要的大大小。

当分配大小超过分页进程 GPU VA 空间大小时,分页操作(填充、传输、通知分配)以区块方式完成。