DRM(Direct Rendering Manager)是 Linux 内核中管理 GPU 的子系统。提到 DRM,常见的第一印象是“负责显示的子系统”。这一印象有两个来源:一是名称中的 Rendering,二是 DRM 最初确实是为 X Server 的直接渲染与显示输出服务的。但这一认识已经不能反映 DRM 当前的职责。本节说明 DRM 由哪些部分组成、各部分之间的关系,并给出本章的组织。
1. 两条主线
按职责划分,DRM 由两条主线组成:
- 显示(KMS):用 CRTC、plane、encoder、connector 等对象为显示硬件建模,负责模式设置、显示时序与热插拔;
- 显存与资源管理:GEM、TTM、dma-buf、dma-fence、GPU 调度器、
drm_gpuvm,以及面向统一地址空间的 SVM,负责 GPU 内存的分配、放置、映射、共享与同步,以及 GPU 任务的调度与提交。
2. 两条主线的关系
两条主线的关系是单向的:KMS 依赖资源管理,反之则不然。KMS 用于扫描输出的帧缓冲struct drm_framebuffer本身不拥有内存,它通过obj[]字段引用 GEM 对象,像素数据存放在这些对象中。数据中心中用于 AI 训练与通用计算的加速卡大多没有显示输出(headless),但它们仍完整地运行在 DRM 的资源管理与调度框架之上,通过渲染节点/dev/dri/render