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。
相关文章:
Windows 图形显示驱动开发-WDDM 3.2- WDDM 功能的内核模式测试
概述 在某些情况下,引入了基于 WDDM 或 MCDM 的新计算设备,并且这些设备的驱动程序不支持 D3D 运行时。 为了帮助验证此类驱动程序,将功能添加到 Dxgkrnl ,以便仅使用内核模式 thunk 进行验证;也就是说,无需涉及 D3D …...
Java基础语法精讲:类型转换、常用运算符与用户输入处理引言
Java作为一门面向对象的编程语言,其基础语法是每位开发者的必备技能。本文将从 类型转换、运算符 和 用户输入处理 三个核心模块展开,结合代码示例与底层原理,带你深入理解这些基础但关键的知识点。 一、类型转换 1. 自动类型转换 规则&am…...
SpringBoot 入门--工程创建
IDEA创建SpringBoot项目 SpringBoot 3.1.5 需要java17 ① 创建Maven工程 ② 导入spring-boot-stater-web起步依赖 ③ 编写Controller ④ 提供启动类 1.打开IDEA,新建项目 2.点击下一步,并勾选web开发相关依赖 3.勾选完点击Create,然后配置…...
Quantum Computing:量子计算如何改变世界
一、量子革命:计算范式的颠覆性跃迁 1.1 从经典比特到量子比特 维度经典比特量子比特(Qubit)状态表示0或1叠加态(α并行能力线性增长指数级增长(2ⁿ并行状态)关联特性独立运算量子纠缠(Einste…...
Rust 之一 基本环境搭建、各组件工具的文档、源码、配置
概述 Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全,使用其特有的所有权机制,而无需传统的垃圾收集器。Rust 不强制执行编程范式,但受到函数式编程思想的影响。 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年…...
贪心算法解题框架+经典反例分析,效率提升300%
贪心算法是一种在每一步选择中都采取当前状态下的最优决策,从而希望最终达到全局最优解的算法策略。以下从其定义、特点、一般步骤、应用场景及实例等方面进行讲解: 定义与基本思想 • 贪心算法在对问题求解时,总是做出在当前看来是最好的选…...
《基于机器学习的DDoS攻击检测与防御系统设计与实现》开题报告
目录 一、课题的研究目的和意义 1.1课题背景 1.2课题目的 (1)提高DDoS攻击检测的准确性 (2)加强DDoS攻击的防御能力 (3)提升网络安全防护的技术水平 1.3课题意义 (1)理论意义…...
面试之《前端常见的设计模式》
前端开发中运用多种设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是一些常见的前端设计模式: 创建型模式 1. 单例模式 定义:确保一个类只有一个实例,并提供一个全局访问点。应用场景:在前端中,像全局状…...
Java volatile 关键字详解
Java volatile 关键字详解 1. volatile 的作用与原理 可见性保证: volatile 修饰的变量在修改后,会立即同步到主内存,其他线程读取时直接从主内存获取最新值,确保多线程环境下的可见性。例如: volatile boolean flag = false;当线程A修改flag为true后,线程B能立即感知到…...
【2025】基于springboot+vue的汽车销售试驾平台(源码、万字文档、图文修改、调试答疑)
基于 Spring Boot Vue 的汽车销售试驾平台通过整合前后端技术,实现了汽车销售和试驾预约的信息化和智能化。系统为管理员和用户提供了丰富的功能,提升了客户体验和销售效率,增强了数据分析能力,为汽车销售行业的发展提供了新的途…...
C语言每日一练——day_5
引言 针对初学者,每日练习几个题,快速上手C语言。第五天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
38.动态规划11
最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int n1text1.size();int n2text2.size();int res0;vector<int> dp(n2,0);for(int i0;i<n1;i){for(int jn2-1;j>0;j--){if(text2[j]text1[i]){for(int k0;k<…...
解析动态窗口法:机器人避障的智能 “导航仪”
在繁忙的智能仓库里,机器人正有条不紊地执行着搬运任务。这里货架林立,货物堆积如山,叉车往来穿梭,地面上还散落着一些临时放置的工具。一台小巧灵活的移动机器人,肩负着将特定货物从角落搬运至出货口的重任。只见它以稳定的速度朝着目标前进,突然,前方不远处一辆叉车急…...
【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用
深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识,都会有新的领悟。大约 2 年前,我曾就这一技术方向撰写过另一篇短文《从类型转换视角,浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…...
元组(Tuple)详解——c#
在C#中,元组(Tuple) 是一种轻量级的数据结构,用于将多个值组合成一个单一的对象。元组非常适合在不需要定义新类或结构体的情况下,临时存储和传递多个相关的值。 C# 中的元组有两种形式: 传统元组…...
串口通信函数汇总-ing
谢谢各位佬的阅读,本文是我自己的理解,如果您发现错误,麻烦请您指出,谢谢 首先谈谈我自己对于串口的理解,随便拿一个嵌入式的板子,它上面有两个引脚,一个是rx,一个是tx,r…...
01.Kubernetes 概述
Kubernetes 概述 Kubernetes 概述1. Kubernetes系统组件、集群及工作机制1.1 Kubernetes 集群的节点类型1.2 Kubernetes 集群架构1.2.1 API Server1.2.2 Cluster Store (etcd)1.2.3 Controller Manager1.2.4 Scheduler1.2.5 Kubelet1.2.6 Kube Proxy 1.3…...
十种处理权重矩阵的方法及数学公式
1. 权重归一化(Weight Normalization) 目的:通过分离权重向量的范数和方向来加速训练。公式:对于权重向量 w \mathbf{w} w,归一化后的权重 w ′ \mathbf{w} w′ 为: w ′ w ∥ w ∥ \mathbf{w} \frac{…...
JVM垃圾回收面试题及原理
1. 对象什么时候可以被垃圾器回收 如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收 如果要定位什么是垃圾,有两种方式来确定 引用计数法可达性分析算法 1.1 …...
Flutter 小技巧之通过 MediaQuery 优化 App 性能
许久没更新小技巧系列,温故知新,在两年半前的《 MediaQuery 和 build 优化你不知道的秘密》 我们聊过了在 Flutter 内 MediaQuery 对应 rebuild 机制,由于 MediaQuery 在 MaterialApp 内,并且还是一个 InheritedWidget ࿰…...
操作系统知识点23
1.实时操作系统的主要设计目标:在严格时间氛围内对外部请求做出反应。 2.当用户程序正在处理器上运行时,若此刻取到了一条特权指令,则处理器将停止执行该指令,并产生一个“非法操作”的事件 3.某网络监控系统中。多个被授权的用…...
【解决报错】:detected dubious ownership in repository at ‘D:/idea_code/xxx‘问题
解决报错:detected dubious ownership in repository at D:/idea_code/xxx‘问题 git config --global --add safe.directory *原因 这个错误提示表明 Git 检测到仓库的所有权存在问题,仓库的所有者与当前用户不匹配。Git 在 2.35.2 版本之后引入了一个…...
三角函数:从宇宙法则到AI革命的数学密钥
——跨越三千年的数学语言与现代科技全景透视 一、数学本质:宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化,其数学表达可抽象为: { x cos θ ℜ ( e i θ ) y sin θ ℑ ( e i θ ) \begin…...
SpringBoot基础Kafka示例
这里将生产者和消费者放在一个应用中 使用的Boot3.4.3 引入Kafka依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…...
Spring 的三种注入方式?
1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下。 1.1 属性注入 属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下&#x…...
STM32第一天建立工程
新建一个工程 1:新建一个文件,添加文件 a:DOC工程说明 》doc说明文档 b:Libraries固件库 》cmsis内核文件 (一般这就是stm32内核文件) 》FWLIB外设文件 (这种就是stm32外设文件不全) 》start…...
记录一下返修
1.对复杂度的分析还不够; 2.融合两种指标的解释还不够,审稿人认为这两种指标存在冲突,不能同时优化,但其实我们考虑的是公平性保证整个调度周期内用户分配到了更加平均的sum-rate,而se是为了追求每个调度时刻都尽可能找到信道条件…...
搭建本地化笔记AI:用Copilot+deepseek+nomic-embed-text构建本地智能知识系统
安装Ollama https://ollama.com/ 下载模型 下载大语言模型 根据自己电脑的配置选择模型的大小 ollama run deepseek-r1:8b 下载向量处理模型 创建向量数据库时需要使用Embedding模型对文本进行向量化处理 ollama pull nomic-embed-text 查看安装的模型 ollama listNAME …...
【C语言】指针篇
目录 C 语言指针概述指针的声明和初始化声明指针初始化指针 指针的操作解引用操作指针算术运算 指针的用途动态内存分配作为函数参数 指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针 函数指针函数指针的定义和…...
【蓝桥杯单片机】第十一届省赛
一、真题 二、创建工程 1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名 3.选择对应的芯片型号 4.选择否,即不创建启动文件 …...
