WDDM 功能的内核模式测试
本文介绍在 Windows 11 版本 24H2(WDDM 3.2)中添加的 WDDM 中内核模式测试基础结构的设计。 此基础结构允许测试和验证不支持 D3D 运行时的驱动程序,例如某些 NPU 设备的驱动程序。 它还可用于验证支持 D3D 运行时的驱动程序,而无需涉及 D3D 运行时。
概述
在某些情况下,引入了基于 WDDM 或 MCDM 的新计算设备,并且这些设备的驱动程序不支持 D3D 运行时。 为了帮助验证此类驱动程序,将功能添加到 Dxgkrnl ,以便仅使用内核模式 thunk 进行验证;也就是说,无需涉及 D3D 运行时和用户模式驱动程序(UMD)。
此基础结构还允许使用精确设置测试 WDDM 功能,而无需通过 D3D 运行时或 UMD,这可能会使事情复杂化。
引入了 DDI,以便在给定的一组命令的内核模式下生成命令缓冲区。 命令很简单,因此几乎任何执行节点都应能够使用预编译着色器或其他方式执行它们。
若要支持此功能,内核模式驱动程序(KMD)必须提供以下支持:
- 报告已启用DXGK_FEATURE_KERNEL_MODE_TESTING功能。
- 实现DXGKDDI_KERNELMODETESTINGINTERFACE功能接口。
- 提供有关哪个执行节点支持生成和执行测试命令缓冲区的信息。
- 支持创建没有专用驱动程序数据的上下文/硬件队列。 通常,需要专用驱动程序命令的格式才能将工作负荷提交到设备。 测试接口允许在没有专用驱动程序数据的情况下提交工作负荷。
- 支持在支持该功能的任何节点上执行 pfnBuildTestCommandBuffer 生成的命令缓冲区。
- 支持分页 DDI 中的 NULL 分配句柄(TRANSFER、FILL 等)。
此功能仅在计算机上启用测试签名时才使用。
将开发使用此功能的 HLK 测试。
DDI 更改
更新了以下结构和枚举以支持内核模式测试:
DXGK_FEATURE_KERNEL_MODE_TESTING添加到DXGK_FEATURE_ID枚举。
SupportBuildTestCommandBuffer 已添加到 DXGK_NODEMETADATA_FLAGS 结构。
TestContext 将添加到 DXGK_CREATECONTEXTFLAGS 结构。
TestQueue 将添加到 D3DDDI_CREATEHWQUEUEFLAGS 结构。
添加了以下 DDI、结构和枚举以支持内核模式测试:
添加了DXGKDDI_KERNELMODETESTINGINTERFACE功能接口,DXGKDDI_BUILDTESTCOMMANDBUFFER::p fnBuildTestCommandBuffer 作为唯一的接口成员。
报告对内核模式测试功能的支持
OS 使用添加DXGK_FEATURE_KERNEL_MODE_TESTING功能 ID 调用 KMD 的 DxgkDdiQueryFeatureSupport 函数,以检查驱动程序是否支持内核模式测试。 KMD 需要报告支持该功能。
然后,系统将使用相同的功能 ID 调用 DxgkDdiQueryFeatureInterface,以获取 pfnBuildTestCommandBuffer 的接口函数指针。 KMD 必须实现此函数并为DXGKDDI_KERNELMODETESTINGINTERFACE接口提供其指针。
报告支持内核模式测试的执行节点
SupportBuildTestCommandBuffer 已添加到 DXGK_NODEMETADATA_FLAGS 结构。 KMD 必须设置此标志,以指示节点可以执行 pfnBuildTestCommandBuffer 生成的命令缓冲区。 建议尽可能多的节点支持该功能。
创建没有专用数据的上下文
TestContext 将添加到 DXGK_CREATECONTEXTFLAGS ,以指示上下文是测试上下文。 此标志仅在启用测试签名时才有效。
KMD 的 DxgkDdiCreateContext 应支持为支持执行 pfnBuildTestCommandBuffer 生成的命令缓冲区的每个节点创建上下文,而无需专用数据。 若要指示此支持,请在创建上下文期间在 Flags 中设置 TestContext 标志。
在没有驱动程序专用数据的情况下创建硬件队列
TestQueue 已添加到 D3DDDI_CREATEHWQUEUEFLAGS ,以指示硬件队列是测试队列。 此标志仅在启用测试签名时才有效。
KMD 的 DxgkDdiCreateHwQueue 应支持在没有驱动程序专用数据的情况下创建硬件队列。
生成命令缓冲区
KMD 的 pfnBuildTestCommandBuffer 为一组简单命令生成具有特定于设备的指令的命令缓冲区。 KMD 从 DxgkDdiQueryFeatureInterface 返回指向此函数的指针(DXGK_FEATURE_KERNEL_MODE_TESTING)。
单个测试命令提交到 pfnBuildTestCommandBuffer。 目前支持以下命令:
命令 | 说明 |
---|---|
D3DDDI_TESTCOMMAND_COPY | 使用源和目标 GPU 虚拟地址复制字节。 |
D3DDDI_TESTCOMMANDBUFFER_FILL | 使用模式填充内存位置。 |
测试命令基于使用 GPU 虚拟地址。 OS 保证 GPU VA 映射到使用标准分配类型D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAP或D3DKMT_STANDARDALLOCATIONTYPE_INTERNALBACKINGSTORE创建的分配。
生成的命令缓冲区和专用数据将返回到用户模式。 提交命令缓冲区以供执行时,调用来自用户模式。 恶意应用程序可能会更改缓冲区的内容和专用数据。 KMD 负责验证命令缓冲区和专用驱动程序数据以避免 bug 检查。
生成的命令缓冲区不应包含特权指令。
用户模式客户端驱动程序(例如 Cuda)提交生成的命令缓冲区,以便使用 D3DKMTSubmitCommand 或 D3DKMTSubmitCommandToHwQueue 执行。 将来,缓冲区内容将作为用户模式提交的一部分提交。
提交生成的命令缓冲区以供执行时,可以保证命令缓冲区包含单个测试命令的设备指令。
生成的命令缓冲区提交到对应于传递给 pfnBuildTestCommandBuffer 的 hContext 的节点。
DMA 缓冲区(pDmaBuffer)的大小限制为 4 KB,DMA 专用驱动程序数据(pDmaBufferPrivateData)的大小限制为 1 KB。