視頻內存管理器(VidMm)和顯示硬件僅支持某些類型的內存段。 因此,內核模式顯示微型端口驅動程序(KMD)只能配置這些類型的段。
KMD 可以配置內存空間段和光圈空間段,其中不同:
- 內存空間段由保存分配位的介質組成。
- 光圈空間段是虛擬地址空間。
分配內存空間段中的范圍時,會分配實際內存。 分配光圈空間段中的范圍時,虛擬地址空間將重定向到獨立于視頻內存池或系統內存分配的物理頁面。
KMD 可以配置以下類型的內存段:
- 線性內存空間段
- 線性光圈空間段
- AGP 類型光圈空間段
?1. 內存空間段(Memory Space Segments)
特點
- 直接分配物理內存:分配此類段中的資源時,VidMm 會直接分配 實際的視頻內存(VRAM)或系統內存。
- 介質綁定:內存的物理介質(如顯存芯片)與段綁定,分配即占用實際資源。
- 適用場景:需要高性能、低延遲的資源(如渲染目標、紋理)。
子類型
(1) 線性內存空間段(Linear Memory Space Segment)
連續物理地址:內存以線性方式排列,適合需要連續內存的操作(如 DMA 傳輸)。
典型用途:
- 幀緩沖區(Frame Buffer)
- 深度/模板緩沖區
示例配置(DXGK_SEGMENTDESCRIPTOR):
{.Flags = DXGK_SEGMENT_FLAGS_VIDEO_MEMORY | DXGK_SEGMENT_FLAGS_LINEAR,.SegmentId = 1, // 顯存段.BaseAddress = 0x80000000, // GPU 物理地址.Size = 0x40000000, // 1GB
}
2. 光圈空間段(Aperture Space Segments)
特點
虛擬地址重定向:分配此類段中的資源時,VidMm 僅分配 虛擬地址范圍,實際物理內存可能來自其他池(如系統內存)。
動態映射:物理內存可按需映射到虛擬地址(類似 CPU 頁表)。
適用場景:
- CPU 頻繁訪問的資源(如動態頂點緩沖區)
- 需要靈活內存管理的場景
子類型
(1) 線性光圈空間段(Linear Aperture Space Segment)
虛擬地址連續:虛擬地址線性連續,但物理內存可能不連續(通過頁表映射)。
典型用途:)
- 共享系統內存資源
- 分頁池(Pageable Memory
示例配置:
{.Flags = DXGK_SEGMENT_FLAGS_SYSTEM_MEMORY | DXGK_SEGMENT_FLAGS_LINEAR,.SegmentId = 2, // 系統內存光圈.BaseAddress = 0x00000000, // CPU 物理地址.Size = 0x20000000, // 512MB
}
(2) AGP 類型光圈空間段(AGP-style Aperture Space Segment)
- 歷史兼容性:模擬傳統 AGP(加速圖形端口)行為,支持 非一致性內存訪問(NUMA)。
- 物理內存分散:允許物理內存分散在多個位置(如部分在顯存、部分在系統內存)。
- 現代替代方案:在 PCIe 時代較少使用,部分驅動為兼容性保留。
示例配置
{.Flags = DXGK_SEGMENT_FLAGS_SYSTEM_MEMORY | DXGK_SEGMENT_FLAGS_AGP,.SegmentId = 3,.BaseAddress = 0xC0000000, // 虛擬地址基址.Size = 0x10000000, // 256MB
}
3. 關鍵區別對比
特性 | 內存空間段 | 光圈空間段 |
---|---|---|
物理內存分配 | ? 立即分配 | ? 僅分配虛擬地址 |
地址連續性 | 必須連續(線性段) | 可非連續(支持分頁) |
性能 | 高(直接訪問顯存) | 較低(需地址轉換) |
CPU 訪問 | 通常不可見(除非標記為共享) | 可直接訪問(系統內存段) |
典型用途 | 紋理、渲染目標 | 動態緩沖區、共享資源 |
4. 驅動開發注意事項
(1) 段類型選擇
- 優先使用內存空間段:對性能敏感的資源(如渲染目標)應分配在顯存段。
- 光圈段的靈活性:需頻繁 CPU 寫入的資源(如動態頂點數據)適合系統內存光圈段。
(2) 混合段配置
多段共存:KMD 可同時配置顯存段和系統內存光圈段,例如:
DXGK_SEGMENTDESCRIPTOR Segments[] = {{ /* 顯存段 */ },{ /* 系統內存光圈段 */ },{ /* AGP 段(可選) */ }
};
(3) 硬件限制
GPU 架構依賴:某些 GPU 可能不支持 AGP 段(需查閱硬件手冊)。
地址對齊:線性段需滿足硬件對齊要求(如 4KB 或 64KB)。
5. 典型問題排查
問題 | 可能原因 | 解決方案 |
---|---|---|
分配失敗(STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER) | 線性段空間不足 | 增加段大小或優化資源布局。 |
CPU 訪問性能差 | 誤用顯存段存儲 CPU 頻繁寫數據 | 改用系統內存光圈段。 |
GPU 訪問違例 | AGP 段物理內存未正確映射 | 檢查?DxgkDdiBuildPagingBuffer ?實現。 |
6. 總結
- 內存空間段:直接管理物理內存(顯存/系統內存),適合高性能需求。
- 光圈空間段:虛擬地址映射,靈活支持動態資源和 CPU 訪問。
- KMD 配置規則:
- 必須根據硬件能力選擇段類型。
- 顯存段優先用于 GPU 高頻訪問資源。
通過合理配置段類型,驅動程序可以平衡性能與靈活性,滿足復雜圖形應用的需求。