当前位置: 首页 > news >正文

Windows 图形显示驱动开发-WDDM 3.2- WDDM 功能的内核模式测试

概述

在某些情况下,引入了基于 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 作为唯一的接口成员。
  • DXGKARG_BUILDTESTCOMMANDBUFFER
  • D3DDDI_BUILDTESTCOMMANDBUFFERFLAGS
  • D3DDDI_TESTCOMMANDBUFFER
  • D3DDDI_TESTCOMMANDBUFFEROP
  • D3DDDI_TESTCOMMANDBUFFER_COPY
  • D3DDDI_TESTCOMMANDBUFFER_FILL

 报告对内核模式测试功能的支持

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。 目前支持以下命令:

测试命令基于使用 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。

相关文章:

  • docker安装和卸载
  • AGI大模型(4):编程调用 OpenAI API
  • 计算机组成原理之基本元器件和逻辑门构成
  • 从学习ts的三斜线指令到项目中声明类型的最佳实践
  • CSP模拟考试系统共享
  • Web网页制作之爱家居的设计(静态网页)
  • 辨析Corollary、Theorem和lemma
  • unet模型在车道线检测上的应用【代码+数据集+python环境+GUI系统】
  • 当输入没有注册的用户名和密码,直接跳转到了一个404页面是怎么回事
  • 判断能否形成等差数列 - 简单
  • P9241 [蓝桥杯 2023 省 B] 飞机降落
  • 第44天:WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式
  • SpaceSync智能排班:重构未来办公空间的神经中枢
  • AI对前端开发的冲击
  • msf(Metasploit)中Session与Channel的区别与关系解析
  • 微信小程序项目 tabBar 配置问题:“pages/mine/mine“ need in [“pages“]
  • 计算机硬件与体系结构
  • set_max_delay
  • 康谋应用 | 基于多传感器融合的海洋数据采集系统
  • ROS动态调参
  • 《中华人民共和国经济史(1949—1978年)》教材出版发行
  • 鸿蒙电脑正式发布,国产操作系统在个人电脑领域实现重要突破
  • “打铁”热邂逅江南水乡,长三角首个国际级铁三赛事有何不同
  • 罗马教皇利奥十四世正式任职
  • 中国首颗地质行业小卫星“浙地一号”成功发射
  • 人民网:激发博物馆创新活力,让“过去”拥有“未来”