1. 概述

DRM (Direct Rendering Manager) 子系统经历了从图形显示 → 图形渲染 → 异构计算/AI 的三阶段演进。这种演进反映了 GPU 硬件能力的发展和应用场景的扩展。

核心视角

DRM 的演进不是简单的功能累加,而是架构范式的根本转换 —— 从管理「像素输出」到管理「异构计算资源」。

🖥️

显示管理器

KMS + Framebuffer
管理像素输出

🎮

渲染管理器

GEM + Scheduler
管理渲染流水线

🧠

GPU 资源管理器

GPUVM + SVM
管理异构计算资源

2. 三阶段演进时间线

2000 — 2010

第一阶段:图形显示时代

核心目标:解决多进程安全访问显卡硬件,实现基本的图形显示

KMS Framebuffer CRTC/Encoder/Connector
  • 以显示输出为中心
  • 解决 X Server 的权限和稳定性问题
  • 主要处理 2D 显示任务
// 早期 GEM 设计:简单的显存对象
struct drm_gem_object {
    struct kref refcount;
    struct drm_device *dev;
    struct file *filp;
    // 最初就这么简单!
};
2010 — 2020

第二阶段:图形渲染时代

核心目标:支持复杂的 3D 渲染,满足游戏和专业图形应用需求

GEM GPU 调度器 Fence / Syncobj DMA-BUF
  • 以渲染性能为中心
  • 支持 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;  // 硬件队列深度
    // 远比第一阶段复杂
};
2020 — 至今

第三阶段:异构计算与 AI 时代

核心目标:将 GPU 作为通用计算加速器,特别是 AI/ML 工作负载

GPUVM HMM DRM GPU SVM Prefetch Vulkan Compute
  • 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 需求。

DRM 三阶段演进图
图:DRM 子系统三阶段演进概览 — 从图形显示到异构计算

3. 功能对比表

显示时代 (2000-2010) 渲染时代 (2010-2020) 计算/AI时代 (2020-)
主要应用桌面显示3D 游戏/CADAI 训练推理/科学计算
内存模型简单 framebufferGEM 对象GPUVM + HMM + GPU SVM 统一地址空间
地址空间物理地址GPU 虚拟地址CPU-GPU 统一虚拟地址
内存管理静态分配显式 BO 管理按需页面迁移
同步机制简单 fencedma-fence/syncobjMMU notifier + fence
调度复杂度中等高(多队列/异步执行)
API 支持X11/DRIOpenGL/Vulkan 图形Vulkan 计算/CUDA/ROCm/SYCL
内存容量需求MB 级GB 级数十 GB(大模型)
典型代码KMS 核心GEM/调度器GPUVM/HMM/GPU SVM/Prefetch

4. 演进驱动力

1000×
GPU 算力增长
(固定管线 → 通用计算)
MB→TB
显存容量跨越
(从 MB 到数十 GB)
3 代
互连技术演进
(AGP→PCIe→CXL)

4.1 应用需求变化

4.2 API 标准演进

5. 结论

DRM 子系统的演进清晰地体现了三个阶段,三个阶段的核心特征:

  1. 显示时代的基础设施建设(KMS/Framebuffer)
    • 解决多进程访问冲突
    • 建立显示硬件抽象
  2. 渲染时代的性能优化(GEM/调度器/同步机制)
    • 复杂的内存对象管理
    • 高效的任务调度和同步
  3. 计算/AI 时代的范式转变(GPUVM/HMM/GPU SVM/统一内存)
    • CPU-GPU 统一虚拟地址空间
    • 按需页面迁移和自动内存管理
    • 标准化的 SVM 框架减少驱动重复工作

关键技术演进标志

2004
DRM 合入内核
2007
Intel GEM
2009
KMS 引入
2016
Vulkan 1.0
2018
AMD HMM
2022
GPUVM 合入
2024
GPU SVM 框架
显示时代 渲染时代 计算/AI 时代

这种演进不是简单的功能堆叠,而是架构层面的适应性重构。特别是:

从各驱动的实现规模可以看出演进的必要性:

Linux 内核在积极适配 GPU 异构计算的新需求,这种演进仍在持续进行中。

一句话总结

DRM 已从「图形显示管理器」完成了向「通用 GPU 资源管理器」的转型 —— 这是 AI 时代对 Linux 内核图形子系统的必然要求。未来所有 GPU 驱动只需基于 drm_gpusvm.c 框架即可获得统一的 SVM 能力。