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