1. 概述
DRM (Direct Rendering Manager) 子系统经历了从图形显示 → 图形渲染 → 异构计算/AI 的三阶段演进。这种演进反映了 GPU 硬件能力的发展和应用场景的扩展。
DRM 的演进不是简单的功能累加,而是架构范式的根本转换 —— 从管理「像素输出」到管理「异构计算资源」。
显示管理器
KMS + Framebuffer
管理像素输出
渲染管理器
GEM + Scheduler
管理渲染流水线
GPU 资源管理器
GPUVM + SVM
管理异构计算资源
2. 三阶段演进时间线
第一阶段:图形显示时代
核心目标:解决多进程安全访问显卡硬件,实现基本的图形显示
- 以显示输出为中心
- 解决 X Server 的权限和稳定性问题
- 主要处理 2D 显示任务
// 早期 GEM 设计:简单的显存对象
struct drm_gem_object {
struct kref refcount;
struct drm_device *dev;
struct file *filp;
// 最初就这么简单!
};
第二阶段:图形渲染时代
核心目标:支持复杂的 3D 渲染,满足游戏和专业图形应用需求
- 以渲染性能为中心
- 支持 OpenGL/Vulkan 等现代图形 API
- 引入复杂的内存管理和调度机制
// GPU Scheduler: 多队列并发调度
struct drm_gpu_scheduler {
struct drm_sched_entity *entities;
struct drm_sched_rq sched_rq[DRM_SCHED_PRIORITY_COUNT];
atomic_t hw_rq_count; // 硬件队列深度
// 远比第一阶段复杂
};
第三阶段:异构计算与 AI 时代
核心目标:将 GPU 作为通用计算加速器,特别是 AI/ML 工作负载
- CPU-GPU 统一虚拟地址空间
- 按需页面迁移和自动内存管理
- 多 GPU 协同与内存超额订阅
// GPU SVM: 统一虚拟内存框架 (2024)
struct drm_gpusvm {
struct drm_device *drm; // DRM 设备
struct mm_struct *mm; // 进程地址空间
struct maple_tree root; // 区间树管理
struct mmu_notifier notifier; // 页表同步
const struct drm_gpusvm_ops *ops; // 驱动回调
// 统一框架,所有驱动受益!
};
第三阶段引入的 GPUVM + HMM + GPU SVM 组合,使得 DRM 从「面向图形」到「面向计算」产生了质的飞跃。GPU 不再仅仅是图像渲染设备,而是真正的通用并行计算加速器。
关键技术与证据
1 GPUVM
drm_gpuvm.c (Copyright 2022 Red Hat)管理 GPU 虚拟地址空间,支持现代计算 API。VM BIND 模式支持 Vulkan Sparse Memory Bindings,细粒度虚拟内存管理,Split/Merge 算法优化映射操作。
2 HMM 集成 (Heterogeneous Memory Management)
典型实现:AMD SVM (Shared Virtual Memory)
功能:CPU 和 GPU 共享统一虚拟地址空间
优势:简化异构编程模型,零拷贝数据共享
3 DRM GPU SVM 框架
drm_gpusvm.c (Copyright 2024 Intel, ~1633 lines)核心目标:为 DRM 驱动提供统一的共享虚拟内存抽象层
设计理念:
- CPU 和 GPU 共享统一虚拟地址空间,按需页面迁移
- 基于 MMU Notifier + HMM 机制跟踪和管理内存
- 使用重试循环处理竞态,避免复杂锁嵌套
核心组件:
Notifier:跟踪内存区间变化(基于区间树)Range:表示 GPU 映射的内存范围(动态分配)Operations:驱动回调接口(分配、释放、失效)
解决的问题:在此之前,每个驱动独立实现 SVM(AMD ~6000+ lines、Intel、NVIDIA 各自实现),导致代码重复、行为不一致、难以维护。
框架价值:
- 统一抽象,代码复用
- 标准化设计原则(migrate_to_ram 路径、锁机制)
- 框架级性能优化惠及所有驱动
适用场景:OpenCL/SYCL USM、CUDA/HIP Unified Memory、Vulkan 系统分配器、AI/ML 零拷贝数据管道
4 面向 AI 的优化
- Prefetch 操作:数据预取优化 AI 推理性能
- 内存驱逐管理:处理大模型训练中的内存超额订阅
- 多 GPU 共享优化:通过 dma-resv 实现高效的多卡协同
5 Vulkan 计算支持
"required by the Vulkan API to implement Vulkan 'Sparse Memory Bindings'"
这表明 DRM 已深度适配现代计算 API 需求。
3. 功能对比表
| 显示时代 (2000-2010) | 渲染时代 (2010-2020) | 计算/AI时代 (2020-) | |
|---|---|---|---|
| 主要应用 | 桌面显示 | 3D 游戏/CAD | AI 训练推理/科学计算 |
| 内存模型 | 简单 framebuffer | GEM 对象 | GPUVM + HMM + GPU SVM 统一地址空间 |
| 地址空间 | 物理地址 | GPU 虚拟地址 | CPU-GPU 统一虚拟地址 |
| 内存管理 | 静态分配 | 显式 BO 管理 | 按需页面迁移 |
| 同步机制 | 简单 fence | dma-fence/syncobj | MMU notifier + fence |
| 调度复杂度 | 低 | 中等 | 高(多队列/异步执行) |
| API 支持 | X11/DRI | OpenGL/Vulkan 图形 | Vulkan 计算/CUDA/ROCm/SYCL |
| 内存容量需求 | MB 级 | GB 级 | 数十 GB(大模型) |
| 典型代码 | KMS 核心 | GEM/调度器 | GPUVM/HMM/GPU SVM/Prefetch |
4. 演进驱动力
(固定管线 → 通用计算)
(从 MB 到数十 GB)
(AGP→PCIe→CXL)
4.1 应用需求变化
- 2000 年代:办公和基础图形
- 2010 年代:高品质游戏和专业渲染
- 2020 年代:深度学习、大语言模型、自动驾驶
4.2 API 标准演进
- Vulkan 引入计算着色器和稀疏资源
- ROCm/CUDA 推动 GPU 通用计算生态
- SYCL/OpenCL 等异构编程标准
5. 结论
DRM 子系统的演进清晰地体现了三个阶段,三个阶段的核心特征:
- 显示时代的基础设施建设(KMS/Framebuffer)
- 解决多进程访问冲突
- 建立显示硬件抽象
- 渲染时代的性能优化(GEM/调度器/同步机制)
- 复杂的内存对象管理
- 高效的任务调度和同步
- 计算/AI 时代的范式转变(GPUVM/HMM/GPU SVM/统一内存)
- CPU-GPU 统一虚拟地址空间
- 按需页面迁移和自动内存管理
- 标准化的 SVM 框架减少驱动重复工作
关键技术演进标志
这种演进不是简单的功能堆叠,而是架构层面的适应性重构。特别是:
- GPUVM 框架:明确提到 Vulkan Sparse Resources 和 VM BIND
- GPU SVM 框架:提供标准化的共享虚拟内存实现,避免每个驱动重复开发
- 设计原则统一:migrate_to_ram 路径、notifier 锁机制、重试循环处理竞态
从各驱动的实现规模可以看出演进的必要性:
- AMD SVM 实现:
kfd_svm.c+amdgpu_hmm.c - Intel 实现:
i915_gem_userptr.c+ 正在迁移到 GPU SVM - 未来驱动:直接使用
drm_gpusvm.c框架,大幅减少开发工作
Linux 内核在积极适配 GPU 异构计算的新需求,这种演进仍在持续进行中。
DRM 已从「图形显示管理器」完成了向「通用 GPU 资源管理器」的转型 —— 这是 AI 时代对 Linux 内核图形子系统的必然要求。未来所有 GPU 驱动只需基于 drm_gpusvm.c 框架即可获得统一的 SVM 能力。