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

window 显示驱动开发-AGP 类型伸缩空间段

AGP 类型的伸缩空间段类似于线性光圈空间段。 但是,内核模式显示微型端口驱动程序(KMD)不会通过 AGP 类型的伸缩空间段公开 dxgkDdiBuildPagingBuffer 回调函数的DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMENT操作类型。 相反,视频内存管理器(VidMm)使用 GART 驱动程序来映射和取消映射系统页面。 也就是说, VidMm 不涉及 KMD

KMD 必须在DXGK_SEGMENTDESCRIPTOR结构的 Flags 成员中设置 Agp 位字段标志,以指定 AGP 类型的伸缩空间段。

1. 核心特性

基础配置

DXGK_SEGMENTDESCRIPTOR Segment = {.Flags       = DXGK_SEGMENT_FLAGS_APERTURE | DXGK_SEGMENT_FLAGS_AGP, // 声明为 AGP 段.BaseAddress = 0xC0000000, // 虚拟地址起始(通常为固定值).Size        = 0x20000000, // 512MB.SegmentId   = 3,
};

2. 段描述符配置(DXGK_SEGMENTDESCRIPTOR)

可选标志

标志作用适用场景
DXGK_SEGMENT_FLAGS_CPU_VISIBLE允许 CPU 访问CPU-GPU 共享数据(默认启用)
DXGK_SEGMENT_FLAGS_CACHE_COHERENT保持缓存一致性避免手动刷新缓存(如集成 GPU)

3. 内存管理流程

(1) 虚拟地址分配

  • 应用程序请求资源(如创建纹理)。
  • VidMm 选择 AGP 段,分配虚拟地址(GPU VA)。

(2) 物理页映射(由 GART 驱动完成)
VidMm 调用系统 GART 驱动:

  • 将 GPU VA 映射到系统内存物理页(通过 PCIe/AGP 总线)。
  • 不触发 KMD 的 DxgkDdiBuildPagingBuffer(与线性光圈段不同)。

硬件行为: 访问虚拟地址时,通过 GART 表转换为物理地址。

与传统 AGP 的关联:现代 PCIe GPU 通过 类似 GART 的 IOMMU(如 Intel VT-d、AMD-Vi)实现相同功能。

4. 典型应用场景

(1) 旧硬件兼容

  • 支持传统 AGP 显卡(如 Windows 7 遗留驱动)。
  • 部分嵌入式 GPU 可能仍依赖此机制。

(2) 特殊内存配置
非一致性内存架构(NUMA):物理内存分散在多个位置(如部分在显存、部分在系统内存)。

(3) 调试与测试
模拟内存碎片化场景:测试驱动对非连续内存的兼容性。

5. 驱动开发注意事项

(1) 禁止操作
无需处理映射/解除映射:KMD 不得响应 DXGK_OPERATION_MAP_APERTURE_SEGMENT 或 UNMAP。

(2) 硬件限制
固定虚拟地址范围:AGP 段通常需预定义虚拟地址(如 0xC0000000),不可动态调整。

物理地址对齐:GART 可能要求物理页对齐(如 4KB)。

(3) 现代替代方案
优先使用线性伸缩段:除非硬件明确要求,否则应选择线性伸缩段(更灵活、性能更高)。

6. 与线性伸缩段的对比

特性AGP 伸缩段线性伸缩段
管理方系统 GART 驱动KMD 驱动
KMD 参与度完全不介入映射需处理 MAP/UNMAP 操作
适用硬件传统 AGP/PCIe 设备现代 PCIe GPU
灵活性低(固定地址范围)高(动态虚拟地址)
性能较低(GART 转换开销)较高(直接页表编程)

7. 可视化表示

GPU 虚拟地址空间:
0xC0000000 ┌───────────────────────┐ ← AGP 段起始(固定地址)│   Virtual Range       │ │  (GART Managed)       │ ├───────────────────────┤ │   Mapped to           │ │   System Memory       │ ← 物理页通过 GART 动态绑定
0xE0000000 └───────────────────────┘ ← 段结束

8. 总结

AGP 光圈段 = 系统托管 + 固定虚拟地址,适用于传统硬件或特殊场景。

关键配置:

  • 设置 DXGK_SEGMENT_FLAGS_AGP 标志。
  • 避免实现无关的 DxgkDdiBuildPagingBuffer 操作。

现代驱动建议:

  • 除非兼容性必需,否则优先使用 线性伸缩段 或 线性内存段。
  • 通过理解 AGP 段的设计初衷和限制,开发者可以更好地适配旧硬件或应对特定测试需求。
http://www.xdnf.cn/news/377407.html

相关文章:

  • Python基于Django的高校教室管理系统【附源码、文档说明】
  • 等价无穷小代换
  • LeetCode LCR 007. 三数之和 (Java)
  • 学习适应对智能软件对对象的属性进行表征、计算的影响
  • day010-命令实战练习题
  • 《C++中插入位的函数实现及示例说明》
  • 大模型中的三角位置编码实现
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMarginsF)
  • 【部署】win10的wsl环境下启动dify的web前端服务
  • 21.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--身份认证服务拆分规划
  • linux perf top分析系统性能
  • 光流 | 基于深度学习的光流估计算法汇总,原理,公式,流程图,代码
  • 人形机器人量产元年开启,AI与物理世界深度融合
  • CAS操作
  • Ceph集群故障处理 - PG不一致修复
  • [SV]等待32个instance的某一个信号的pulse,该怎么写?
  • Windows 系统 - Trae 内 终端 无法使用 node (重新配置 nodejs 路径)
  • 青藏高原东北部祁连山地区250m分辨率多年冻土空间分带指数图(2023)
  • AtCoder AT_abc405_d ABC405D - Escape Route
  • 智慧能源大数据平台建设方案(PPT)
  • 数字孪生实战笔记(1)数字孪生的含义、应用及技术体系
  • RPA 浏览器自动化:高效扩展与智能管理的未来
  • SpringBoot学习(上) , SpringBoot项目的创建(IDEA2024版本)
  • 基于阿伦尼斯模型的电池寿命预测:原理、应用与挑战
  • 数据结构:树(树的定义和基本术语)
  • JGL069垃圾填埋场模拟装置试验台
  • 力扣top100 矩阵置零
  • 近日部署跑通的若干多模态模型总结与论文概述
  • clangd与clang-tidy
  • Flutter PIP 插件 ---- 为iOS 重构PipController, Demo界面,更好的体验