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 段的設計初衷和限制,開發者可以更好地適配舊硬件或應對特定測試需求。