当前位置: 首页 > 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 段的设计初衷和限制,开发者可以更好地适配旧硬件或应对特定测试需求。

相关文章:

  • [白话文] 从百草园RLHF到三味书屋DPO
  • HTTP 请求中 Content-Type 头部
  • GitHub 趋势日报 (2025年05月09日)
  • 部署dify
  • Web3 实战项目项目部署到 GitHub 和上线预览的完整指南
  • 数据库实验10
  • 多线程获取VI模块的YUV数据
  • ISP(Image Signal Processor)处理流程及不同域划分
  • 【计算机视觉】OpenCV实战项目:Deep Machine Learning Tutors:基于OpenCV的实时面部识别系统深度解析
  • Flink 运维监控与指标采集实战
  • 【前端】每日一道面试题3:如何实现一个基于CSS Grid的12列自适应布局?
  • Spring循环依赖问题
  • 单脉冲前视成像多目标分辨算法——论文阅读
  • 管道-验证和转换
  • 【Linux】冯诺依曼体系结构和操作系统的理解
  • 23、DeepSeekMath论文笔记(GRPO)
  • 【桌面】【输入法】常见问题汇总
  • 高精度之加减乘除之多解总结(加与减篇)
  • 【软件工程】基于频谱的缺陷定位
  • C++学习-入门到精通-【6】指针
  • ​中国超大规模市场是信心所在——海南自贸港建设一线观察
  • 昆明一学校门外小吃摊占满人行道,城管:会在重点时段加强巡查处置
  • 习近平会见委内瑞拉总统马杜罗
  • 正荣地产:前4个月销售14.96亿元,控股股东已获委任联合清盘人
  • 云南临沧一行贿案金额认定比受贿案多41万,重审时检方变更金额起诉
  • 法治日报:商品明细是隐私,外卖员快递员不应知晓