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

window 显示驱动开发-处理内存段(二)

KMD 不需要在其内存段中指定 GPU 可用的所有视频内存资源。 但是,KMD 必须指定 VidMm 在系统上运行的所有进程中管理的所有内存资源。 例如:

  • 实现固定函数管道的顶点着色器微代码可以驻留在 GPU 地址空间中,但在 VidMm 管理的内存之外(即不是段的一部分)。 此配置是可能的,因为微代码始终可用于所有进程,并且永远不会成为进程之间争用的来源。

  • 对于顶点缓冲区、纹理、呈现目标和应用程序特定的着色器代码等资源,VidMm 必须从驱动程序的内存段之一分配视频内存资源。 这一要求是因为资源类型必须对所有进程公平可用。

下图显示了 KMD 如何从 GPU 地址空间配置内存段的示例。

图中的数字对应于以下内存段:67

  1. CPU 可访问的线性段:此段可由 CPU 访问,并组织为线性地址空间。

  2. 非 CPU 可访问的线性段:该段被组织为线性地址空间,但 CPU 无法访问。 它用于不需要 CPU 访问的资源。

  3. 只读 AGP 光圈段:此段用于对 AGP(加速图形端口)内存进行只读访问。

  4. 光圈段:此段用于通过 AGP 光圈访问的资源。

隐藏框表示 KMD 不向 VidMm 公开的内存段。 隐藏在 VidMm 中的视频内存不能映射到用户空间,也不能被任何特定进程独占。 这样做违反了虚拟内存的基本规则,即要求系统上运行的所有进程都可以访问所有内存。

 1. 内存段的“非全覆盖”特性

(1) KMD 的自主性
仅需声明需管理的资源:KMD 在 DXGK_SEGMENTDESCRIPTOR 中定义的段 不必涵盖 GPU 所有可用内存。

示例:

  • GPU 固件(如顶点着色器微代码)可驻留在 非段内存区域,由驱动直接管理。
  • 硬件保留区域(如 BootROM)无需暴露给 VidMm。

VidMm 仅管理“竞争性资源”:需要被多个进程共享或公平分配的资源(如纹理、顶点缓冲区)必须通过段管理。

(2) 非段内存的典型用途

资源类型是否需通过段管理原因
顶点着色器微代码❌ 否只读、全局共享,无进程间竞争。
硬件寄存器空间❌ 否由 KMD 独占控制,无需虚拟化。
纹理/顶点缓冲区✅ 是多进程可能竞争,需公平分配。
呈现目标(Render Target)✅ 是需隔离各进程的渲染输出。

2. 内存段配置示例

(1) GPU 地址空间布局
下图展示了一个可能的 GPU 地址空间划分:

GPU 地址空间布局示例:
0x00000000 ┌───────────────────────┐│ 硬件保留区域          │ (非段内存,如微代码)
0x10000000 ├───────────────────────┤│ 段 1: 显存 (VRAM)     │ (VidMm 管理,供纹理/缓冲区)
0x50000000 ├───────────────────────┤│ 段 2: 系统内存光圈     │ (VidMm 管理,CPU 可访问)
0x70000000 ├───────────────────────┤│ 驱动私有区域          │ (非段内存,如调试日志)
0x80000000 └───────────────────────┘

(2) KMD 的段描述符配置

// 仅声明需要 VidMm 管理的段
DXGK_SEGMENTDESCRIPTOR Segments[] = {// 显存段(供纹理/渲染目标){.BaseAddress = 0x10000000,.Size        = 0x40000000, // 1GB.Flags       = DXGK_SEGMENT_FLAGS_VIDEO_MEMORY,.SegmentId   = 1,},// 系统内存光圈段(供 CPU 访问的资源){.BaseAddress = 0x50000000, // CPU 物理地址.Size        = 0x20000000, // 512MB.Flags       = DXGK_SEGMENT_FLAGS_SYSTEM_MEMORY,.SegmentId   = 2,}
};

3. 设计原理与优势

(1) 灵活性

  • 硬件适配自由:KMD 可根据 GPU 特性灵活保留部分内存(如固件区域),无需强制纳入 VidMm 管理。

性能优化:全局只读资源(如微代码)可永久映射,避免重复加载。

(2) 安全性

  • 隔离关键资源:硬件关键区域(如寄存器)由 KMD 独占控制,防止应用程序误操作。
  • 公平性保障:竞争性资源(如显存)通过 VidMm 统一分配,避免单一进程垄断。

(3) 简化驱动开发

  • 减少 VidMm 负担:非竞争性资源无需复杂的虚拟化/分页机制。
  • 明确职责边界:KMD 管理硬件细节,VidMm 专注多进程资源调度

4. 开发者注意事项

(1) 必须通过段管理的资源

  • 任何可能被多进程共享的资源:纹理、顶点/索引缓冲区、渲染目标、计算着色器 UAV。
  • 需 CPU 访问的资源:使用 DXGK_SEGMENT_FLAGS_SYSTEM_MEMORY 声明。

(2) 禁止绕过 VidMm 的操作

  • 直接访问非段内存:用户模式驱动(UMD)必须通过 VidMm 分配的 GPU 虚拟地址(GPU VA)访问资源,禁止直接操作物理地址。
  • 例外:仅 KMD 可访问硬件保留区域(如通过 MmMapIoSpace)。

(3) 调试支持

  • ETW 日志分析:使用 GPUView 或 WPA 检查 DXGKRNL 事件,确认段分配是否正确。
  • 验证工具:DirectX 调试层(Debug Layer)可检测非法内存访问。

5. 典型问题与解决方案

问题原因解决方案
分配失败(STATUS_GRAPHICS_NO_VIDEO_MEMORY)段空间不足优化资源生命周期,或增加段大小。
GPU 访问违例误操作非段内存检查 UMD 是否使用非法 GPU VA。
性能下降频繁切换段合并资源到同一段,减少上下文切换。

 6. 总结

KMD 选择性暴露段:仅需管理多进程竞争的动态资源(如纹理),静态资源(如微代码)可保留在非段区域。

VidMm 的职责:在已注册的段内实现公平分配、虚拟化和隔离。

驱动最佳实践:

  • 明确划分段与非段内存的用途。
  • 禁止用户模式直接操作硬件保留区域。

通过这种设计,WDDM 在保证多进程安全性的同时,兼顾了硬件灵活性和性能优化。

http://www.xdnf.cn/news/338383.html

相关文章:

  • C++GO语言微服务基础技术①
  • IDEA 2024 版本配置热部署
  • 【计算机网络】--tcp三次握手
  • 【Pandas】pandas DataFrame ewm
  • 2024年 AI大模型我该买一张什么显卡?
  • 好消息!PyCharm 社区版现已支持直接选择 WSL 终端为默认终端
  • 最新Spring Security实战教程(十四)OAuth2.0精讲 - 四种授权模式与资源服务器搭建
  • 【hadoop】Sqoop数据迁移工具的安装部署
  • 22、近端策略优化算法(PPO)论文笔记
  • 深入理解Spring缓存注解:@Cacheable与@CacheEvict
  • 避免数据丢失:在存储测试数据之前,要做好Redis持久化
  • SyntaxError: Non-UTF-8 code starting with ‘\xe5‘ in file
  • 仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险
  • 晶振:智能设备的“心跳”如何支撑5G与航天
  • Spring Boot 启动原理的核心机制
  • STM32-模电
  • 关于汇编语言与程序设计——单总线温度采集与显示的应用
  • React 笔记[1] hello world
  • 【程序员AI入门:应用开发】8.LangChain的核心抽象
  • 基于springboot+vue的校园部门资料管理系统
  • 2025最新免费视频号下载工具!支持Win/Mac,一键解析原画质+封面
  • 小刚说C语言刷题—1341银行存款问题
  • 到达最后一个房间的最少时间II 类似棋盘转移规律查找
  • python打卡day19
  • 爱普生FC2012SN晶振在TWS蓝牙耳机中的应用优势
  • 代理服务器
  • 《Zabbix Proxy分布式监控实战:从安装到配置全解析》
  • uniapp|获取当前用户定位、与系统设定位置计算相隔米数、实现打卡签到(可自定义设定位置、位置有效范围米数)
  • 【本地搭建npm私服】使用Verdaccio
  • K8s中的containerPort与port、targetPort、nodePort的关系: