第2篇:DRM 是什么?为什么显示驱动绕不开它?

简介: DRM是Linux显示体系的核心框架,统一管理CRTC、Encoder、Connector、Plane及内存与同步,实现安全、有序的图层提交与模式设置,是定位黑屏、花屏等显示问题的关键枢纽。

摘要

Android/Linux 显示体系里,DRM 不是某个单点模块,DRM 是 Linux 显示体系的核心框架。它统一管理 CRTC、Encoder、Connector、Plane、内存与同步,把上层图层安全提交给显示硬件;是在内核中负责显示资源管理、模式设置、图层提交和同步调度的核心框架。理解 DRM,是从“会调屏”走向“能定位黑屏、花屏、闪屏和图层异常问题”的关键一步。

前言

很多人刚接触显示驱动时,会把 DRM 理解成一个“屏幕驱动”。

其实不是。

在我理解看来DRM 更像是内核显示子系统的“基础设施”:它统一管理显卡、显示控制器、图层、连接器、内存和同步机制。Panel、MIPI、HWC 这些模块,最终都要挂到这套框架上工作。

1. DRM 到底解决了什么问题?

在 DRM 出现之前,Linux 显示路径比较分散,不同硬件各自管理显示资源,容易出现几个问题:

  • 多个程序同时申请显示资源,谁都可以抢屏幕
  • 图层叠加、模式切换没有统一协调
  • 内存管理、同步机制不统一
  • 用户态和内核态接口混乱

DRM 的目标,就是把这些能力统一起来:把显示资源抽象成统一模型,让用户态按规则申请、配置和提交。

它解决的不是“屏幕怎么亮”这一件事,而是:

  • 谁可以访问显示设备
  • 怎么设置显示模式
  • 怎么提交图层
  • 怎么分配和共享图形内存
  • 怎么同步一帧画面的完成时机,时机很关键,时机不对送来图也不会正常显示.

2. DRM 在显示链路中的位置

回顾第1篇的链路:

App → SurfaceFlinger → HWC → Gralloc → DRM → Panel / MIPI → 屏幕

DRM 位于图形链路的内核入口,是用户态和显示硬件之间的桥梁。

可以把它理解成三层:

第一层:**user space interface**

App、SurfaceFlinger、HWC 通过 libdrm 或框架接口访问 DRM。

第二层:DRM 核心框架

内核里的 DRM 子系统负责:

  • 设备初始化
  • 资源管理
  • 模式设置
  • 属性解析
  • 提交调度
  • 同步处理

第三层:硬件驱动

具体芯片的 CRTC、Encoder、Connector、Plane、Panel、MIPI 驱动,按照 DRM 框架实现硬件操作。

3. DRM 最核心的几个概念

这几个概念需要理解记忆,甚至背诵,以后看日志、看驱动代码必须认识。在MTK等平台driver代码里,专门有对应的驱动文件。

CRTC

CRTC 可以理解为“显示控制器”。

它负责把一帧数据扫描出来,按照一定时序送到显示接口。

可以简单记:

CRTC 是真正产生显示时序、扫描帧数据的地方。

Encoder

Encoder 负责把 CRTC 输出的画面数据,转换成适合当前接口传输的格式或协议。

比如:

  • 转换成 MIPI-DSI 流
  • 转换成 HDMI 信号
  • 转换成 DP 信号

可以理解为:

Encoder 是数据传输格式的转换器。

Connector

Connector 代表一个可见的显示输出接口。

比如:

  • MIPI DSI接口
  • HDMI 接口
  • DP 接口
  • 外接显示屏

用户看到的“某个屏幕已连接”,在 DRM 里通常对应一个 Connector。

Plane

Plane 是图层。

Android 里每个窗口(比如桌面和大家喜欢用的悬浮窗)、状态栏、视频层,都可能对应一个或多个 Plane(当前界面具体几个layer,需要dumpsys SurfaceFlinger确认)。

DRM 允许硬件把多个 Plane 叠加起来显示。

所以 Plane 的关键作用是:支持多图层硬件叠加。**(手机SOC硬件基本是会支持4层,当然也得看具体平台)**

FB / Framebuffer

Framebuffer 是一帧画面的内存缓冲区。

上层把绘制好的 Buffer 交给 DRM,DRM 把它映射到 Framebuffer,再由 CRTC 扫描输出。

可以理解为:Framebuffer 就是当前要显示的那帧数据。

4. DRM 提交一帧的大致过程

app要显示一帧,通常不是简单“写一下显存”,而是一个完整提交过程。

大致步骤:

  1. 准备图形 Buffer
  2. 用户态设置显示属性
  3. 检查配置是否合法
  4. commit到内核
  5. DRM 完成模式设置或更新
  6. 等待present fence,等画面真正显示完成
  7. 释放旧 Buffer

这里面最关键的一步,是“commit”。

DRM 不是改完寄存器立刻显示,而是把一次更新打包提交,由框架统一调度,通过fence来实现同步,后续章节再详细讨论。

5. 为什么现在强调 DRM Atomic?

Atomic 是 DRM 的重要改进。

它的核心思想是:把一次显示更新的所有配置,当成一个完整事务检查后再提交。

这有几个好处:

  • 多个图层、模式、属性可以一起更新
  • 配置不合法时,可以提前拒绝
  • 减少中间状态错乱
  • 更适合 Android 这种复杂合成场景

所以你会经常看到这些关键词:

  • atomic_check
  • atomic_commit
  • state
  • properties

它们本质上都围绕“原子提交”展开。

6. DRM 和 HWC 是什么关系?

这是很多人最容易混淆的地方。

可以这样理解:

  • HWC:Android 用户态的硬件合成器,决定哪些图层走硬件合成
  • DRM:Linux 内核里的显示框架,负责把最终图层提交给硬件

HWC 更像“策略选择器”,DRM 更像“执行入口”。

HWC 告诉系统:这几个图层可以硬件叠加。

然后由 DRM 完成真正的图层配置和提交。

7. 从调试角度看,DRM 为什么重要?

显示问题不一定都出在 DRM,但很多问题最终都会在 DRM 层留下痕迹。

遇到这些问题时,DRM 是关键排查点:

  • 黑屏
  • 花屏
  • 闪屏
  • 图层错位
  • 模式切换失败
  • 帧率异常
  • 休眠唤醒异常
  • Buffer 显示异常

因为 DRM 连接了:

  • 上层 Buffer
  • 图层配置
  • 显示模式
  • 同步机制
  • 硬件寄存器

所以它是显示问题的“必经之路”。

8. 初学者怎么学 DRM?

建议按这个顺序来:

第一步:先看概念

搞懂 CRTC、Encoder、Connector、Plane、Framebuffer。

第二步:看日志

用 modetest、drm_info 看系统里有哪些显示资源。

第三步:看驱动结构

不必一开始啃完整源码,先看驱动里这几个部分:

  • 初始化
  • 模式设置
  • 图层更新
  • 电源管理
  • 中断处理

第四步:再看 Atomic

理解 Atomic 前,先理解普通提交模型。后续章节再详细讨论。

结语

DRM 不是单一功能模块,而是 Linux 显示体系的骨架。

你可以暂时不深究每一个源码细节,但最好先建立这个认知:

DRM 负责统一管理显示资源,把上层图层和配置,安全、有序地提交给显示硬件。

以后遇到显示问题,不要只怀疑屏幕或 MIPI,也记得往 DRM 这条链路上看。

相关文章
|
26天前
|
前端开发 安全 JavaScript
打字乐园:一个为零基础孩子设计的纯前端指法打字练习(MIT 开源)
《打字乐园》是MIT开源的纯前端儿童打字练习工具,专为7–8岁零基础孩子设计。通过八指着色键盘、实时手指提示、五阶渐进课程(基准键→A-Z→单词),坚持“准确优先”,离线即用,无数据收集,守护儿童隐私与学习安全。
268 2
|
26天前
|
NoSQL 编译器 C语言
【2026最新】Dev C++下载、安装、使用保姆级指南(附官方安装包)
Dev C++ 是一款免费开源、轻量高效的 Windows 平台 C/C++ 集成开发环境,内置 MinGW/GCC 编译器与 GDB 调试器,体积小、启动快、兼容性强,广泛用于蓝桥杯、ACM 等算法竞赛,推荐使用稳定经典的 Orwell 版本(v5.11)。
1111 2
|
2月前
|
弹性计算 运维 安全
阿里云服务器免费领取最新教程:新用户、学生、个人、企业申领渠道、配置与运维完整实操流程指南(个人新用户3个月、学生1年免费服务器)
整体来看免费ECS权益给学生、个人开发者提供了零成本接触云计算的渠道。个人新用户可以拿到最长3个月免费实例,学生通过高校认证可以拿到代金券实现一年免费使用。整套流程从账号注册、实名认证,再到实例申领、安全配置、命令实操,新手跟着步骤就可以独立完成。但要牢记免费资源存在额度、周期限制,到期及时续费或者释放资源,防止产生不必要账单。拿到实例之后优先做好安全配置,只开放业务必须端口,不要把全部端口对外开放,降低服务器被扫描入侵的风险。利用免费算力多多练习项目部署、运维操作,快速积累云上实操经验。
502 1
|
2月前
|
负载均衡 监控 安全
Nginx 1.30.4 编译安装与参数调优
本文详解Nginx 1.30.4在CentOS/RHEL 10上的源码编译安装全流程:涵盖依赖安装、用户创建、模块定制、systemd服务配置、高并发调优(worker、连接、压缩、日志)、内核参数优化及安全加固,开箱即用,适配企业生产环境。(239字)
247 1
|
1月前
|
缓存 Oracle Java
JVM 内存结构入门:程序计数器、虚拟机栈、本地方法栈与堆的溢出诊断
JVM 内存结构里最基础的四块区域,报错却完全不同。从程序计数器、虚拟机栈、本地方法栈到堆,用示例代码复现栈溢出和堆溢出,附排查步骤。
125 2
|
21天前
|
存储 人工智能 测试技术
小微企业云服务器怎么选?阿里云轻量四大规格族区分、优惠活动与选购避坑指南
阿里云轻量应用服务器 四大主流规格族定位清晰。通用型是均衡万金油,绝大多数普通建站、开发测试优先选择;智能体专用型面向AI智能体、RAG业务,服务器资源+Tokens打包,成本更优;多公网IP型主打单机多个独立公网IP,适配多账号隔离运营;容量型主打超大系统盘,面向网盘、文件归档存储密集业务。
129 3
|
1月前
|
小程序 JavaScript 前端开发
基于微信小程序的自习室座位预约系统
本文针对图书馆自习室占座难、管理低效问题,设计并实现基于微信小程序与SpringBoot的智能预约系统,集成Vue后台管理、MySQL数据存储等技术,提升座位利用率与用户体验,助力公共文化服务智慧化升级。
|
1月前
|
存储 弹性计算 运维
新手上云全攻略:阿里云轻量 / ECS/GPU 服务器计费、机型选型,附带 Linux 命令与避坑要点
很多刚接触上云的用户最先关心的核心问题,就是阿里云服务器的实际成本,不同硬件配置对应的售价、活动价和原价的差距,以及如何结合自身业务做合理选型。阿里云对全系云服务器产品完成价格优化和活动体系升级,统一多款热门机型新购、续费定价,细化轻量应用服务器、ECS经济型、通用算力型、企业高性能机型的收费标准,同时保留常态化秒杀、新人特惠、续费同价等福利,不同预算、不同业务场景的用户,都可以快速找到匹配的配置。本文完整梳理主流服务器的配置与价格,覆盖轻量应用服务器、ECS云服务器全系列机型,罗列CPU、内存、带宽、硬盘、月付与年付售价,讲解包年包月、按量付费两大计费模式差异,附带Linux服务器常用实操命
163 3
|
1月前
|
小程序 JavaScript Java
基于微信小程序的第二课堂校园活动系统
本文探讨活动管理小程序的设计与实现,针对传统活动管理效率低、体验差等问题,提出基于微信小程序、SpringBoot、Vue、MySQL等技术的数字化解决方案,提升组织者管理效能与参与者体验,推动活动行业智能化发展。
|
1月前
|
物联网 关系型数据库 Serverless
预付费电表接入阿里云API网关实现多租户水电独立结算
本文针对长租公寓、保障房等多租户场景水电管理痛点,基于阿里云API网关+IoT+FC+RDS,构建统一接口、透明结算的智能水电方案:聚合分散协议为标准RESTful API,实现充值秒到账、公摊公式可溯、账单实时可查,大幅降低运维成本与电费纠纷。
217 2

热门文章

最新文章