Linux DRM 框架简介

Linux DRM 框架详解

Linux DRM(Direct Rendering Manager)是 Linux 内核中用于管理图形显示和 GPU 加速的核心子系统,替代了传统的 FBDEV(Framebuffer Device)框架,支持现代图形硬件的复杂需求(如多层合成、硬件加速、多显示器管理等)。以下是其核心组成、工作原理及关键概念:


1. DRM 的核心架构

DRM 框架分为用户空间和内核空间两部分,通过 libdrm​ 库实现交互:

  • 用户空间:通过 libdrm 封装 IOCTL 接口,提供统一的 API 给应用程序(如 SDL、Wayland)。

  • 内核空间:包含 DRM 核心(通用逻辑)和 DRM 驱动(硬件适配层),驱动通过注册 drm_driver结构体与核心交互。 


2. 核心子系统

(1) KMS(Kernel Mode Setting)

负责显示模式设置和画面控制,包含以下关键对象:

  • CRTC(阴极射线管控制器):管理显示时序和扫描输出,将 Framebuffer 转换为硬件可识别的信号。

  • Encoder:将 CRTC 的输出信号转换为显示器支持的格式(如 HDMI、DP)。

  • Connector:连接物理显示设备(如 HDMI 接口),获取 EDID 信息并检测连接状态。

  • Plane:硬件图层,支持多图层叠加(如视频层、UI 层),每个 CRTC 至少关联一个 Primary Plane。

  • Framebuffer(FB):描述显存中图像数据的基本信息(格式、尺寸、步长等),与硬件无关 

(2) GEM(Graphics Execution Manager)

管理显存分配和同步,核心功能包括:

  • 显存分配:通过 shmem 或 CMA 分配内存,支持连续/非连续物理内存(如 PRIME 共享)。

  • 同步机制:使用 fence(基于 dma_fence)确保 GPU/CPU 操作顺序,避免数据竞争。

  • DMA-BUF:跨设备共享缓冲区(如 GPU 与视频解码器共享数据) 

(3) libdrm

用户空间库,封装 DRM IOCTL 接口,提供以下功能:

  • 设备文件(/dev/dri/cardX)的打开与控制。

  • 内存映射(mmap)和缓冲区管理。

  • 原子操作支持(如模式设置、页面翻转) 


3. DRM 的工作流程

  1. 初始化:驱动通过 drm_dev_register()注册设备,KMS 初始化 CRTC、Encoder 等组件。

  2. 模式设置:用户空间调用 drmModeSetCrtc()配置分辨率、刷新率,KMS 更新硬件时序。

  3. 显存分配:应用通过 drmModeAddFB()创建 Framebuffer,GEM 分配显存并返回句柄。

  4. 渲染与提交:GPU 写入显存后,通过 drmModePageFlip()触发页面翻转,VBLANK 同步确保无撕裂。

  5. 资源释放:关闭文件描述符时,DRM 自动回收显存和对象 


4. 关键技术与机制

  • VBLANK 同步:利用垂直消隐期切换帧缓冲,避免画面撕裂。驱动需实现 drm_crtc_funcs.vblank_enable/disable

  • 原子操作:通过 drm_atomic_commit()批量提交配置(如 CRTC/Plane 参数),确保原子性。

  • 多 GPU 支持:通过 PRIME 共享显存,支持离散 GPU 和集成 GPU 的协同工作 


5. DRM 与 FBDEV 的对比

特性

DRM

FBDEV

多图层支持

支持(通过 Plane 叠加)

不支持

内存管理

GEM 管理显存,支持 DMA-BUF

直接操作 /dev/fb,易冲突

硬件加速

支持 3D 渲染、视频解码

仅基础 2D 操作

多显示器

支持多 CRTC 和 Connector

仅单显示器

同步机制

VBLANK 和 fence 保证时序

依赖应用层轮询


6. 典型应用场景

  • 嵌入式设备:如 RK3399 的 MIPI DSI 屏幕驱动,通过 DRM 管理显示流水线 

  • 桌面环境:Wayland/Weston 使用 DRM 直接渲染,绕过 X Server。

  • GPU 计算:CUDA/OpenCL 通过 DRM 提交计算任务,利用 GPU 加速 


7. 驱动开发要点

  • 注册设备:使用 drm_dev_alloc()分配设备实例,填充 drm_driver结构体。

  • 实现 KMS 操作:如 drm_mode_config_funcs中的模式设置回调。

  • 内存管理:若使用 GEM,需实现 drm_gem_object_ops;若用 TTM,则需初始化 TTM 全局引用 

  • 中断处理:通过 drm_irq_install()注册 VBLANK 中断处理函数。


总结

Linux DRM 框架通过分层设计(用户空间 API、内核核心、硬件驱动)和模块化组件(KMS、GEM),实现了高效、安全的图形管理。其核心优势在于支持现代图形硬件的复杂需求,如多层合成、多 GPU 协同和异步渲染,是嵌入式和桌面 Linux 图形系统的基石。

posted on 2025-12-08 18:34  ENGINEER-F  阅读(0)  评论(0)    收藏  举报