当前位置: 首页 > 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 在保证多进程安全性的同时,兼顾了硬件灵活性和性能优化。

相关文章:

  • Linux系统下使用Kafka和Zookeeper
  • 中介者模式(Mediator Pattern)详解
  • TI AM243X开发流程
  • 【Python 字符串】
  • 大模型的应用中A2A(Agent2Agent)架构的部署过程,A2A架构实现不同机器人之间的高效通信与协作
  • Redis 重回开源怀抱:开源精神的回归与未来展望
  • 仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险
  • 中科院开源:多智能体 + 知识图谱,自动生成高质量医学数据
  • SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理
  • 【人工智能】低代码与AI技术未来趋势分析
  • Redis 8.0正式发布,再次开源为哪般?
  • SQL:MySQL函数:字符串函数
  • 深入解析:如何正确处理业务空值与技术异常?从避免滥用`None`和`WebDriverException`谈起
  • ERC-20与ERC-721:区块链代币标准的双星解析
  • 【知识点】三维项目中关于各种坐标系的初步认识
  • 2.3 点云数据存储格式——LiDAR专用型点云存储格式
  • 【Linux网络】Socket 编程预备
  • 极简远程革命:节点小宝 — 无公网IP的极速内网穿透远程解决方案
  • 用NVivo革新企业创新:洞悉市场情绪,引领金融未来
  • 科学发现 | 源于生活的启示与突破计划的创新
  • 美联储宣布维持基准利率不变
  • 4月深圳新房、二手房成交同比均上涨,“5月有望延续积极向好的发展态势”
  • 金融监管总局:正在修订并购贷款管理办法,将进一步释放并购贷款的潜力
  • 五一假期上海边检查验出入境人员超61万人次,同比增长23%
  • 十大券商看后市|A股风险偏好有回升空间,把握做多窗口
  • 这个五一假期,外贸拓内销好货和识货人在上海“双向奔赴”