
瑞芯微Linux驱动一对一答疑辅导
文章目录
我们来看一下DRM子系统的软件架构:

DRM框架从上到下依次为应用程序、libdrm、DRM driver、HW;
- 应用程序:上图中并没有画出;应用程序可以直接操纵DRM的ioctl进行显示相关操作,后来封装成了libdrm库,让用户可以更加方便的进行显示控制;
- libdrm:lbdrm是DRM框架提供的位于用户空间操作DRM的库,提供了DRM驱动的用户空间接口;对底层接口进行封装,向上层应用程序提供通用的API接口,本质上是对各种ioctl接口进行封装;
- DRM core:DRM核心层,由GEM和KMS组成;
- KMS:Kernel Mode Setting,所谓内核显示模式设置,其实说白了就两件事:更新画面和设置显示参数;
- 更新画面:显示buffer的切换,多图层的合成方式,以及每个图层的显示位置;
- 设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等;
- GEM:Graphic Execution Manager(图形执行管理器),它提供了一种抽象的显存管理方式,使用户空间应用程序可以更方便地管理显存,而不需要了解底层硬件的细节;
- 实际上,在DRM中包含两个内存管理器,TTM(Translation Table Manager)和GEM(Graphic Execution Manager),TTM是第一个开发的DRM内存管理器,关于TTM我们就不做过多的介绍了,知道有这么一个东西就好了。
想象成一个现代化的数字美术馆:
美术馆的展厅(你的电脑屏幕): 这是最终呈现画作给观众(用户)的地方。
画作(要显示的画面): 比如你的桌面、一个浏览器窗口或一个视频。
现在,我们来认识这个美术馆里的两大核心管理部门:KMS(展厅管理部) 和 GEM(画作仓库管理部)。
一、KMS
KMS主要负责显示相关功能,在DRM中将其进行抽象,包括:CRTC、ENCODER、CONNECTOR、PLANE、Framebuffer、VBLANK、property;它们之间的关系如下图所示:
[图片]
以HDMI接口为例说明,Soc内部一般包含一个Display模块,通过总线连接到HDMI接口上;
- Plane是对Framebuffer进行描述的部分;
- Encoder是将像素转化为HDMI接口所需要的信号,一般Encoder和Connector放到一块初始化。
二、GEM
GEM主要负责显示buffer的分配和释放,在DRM中将其进行抽象,包括:DUMP、PRIME、fence;
GEM 的核心职责是:高效、安全地管理美术馆里所有的“数字画作”(内存缓冲区),处理谁可以访问它们,以及它们在仓库里的存放位置。 它关心的是 “是什么” 和 “在哪里”。
三、元素介绍
学习DRM驱动其实就是学习上面各个元素的实现及用法,如果你能掌握这些知识点,那么在编写DRM驱动的时候就能游刃有余。

想象一下,我们要在一個美術館(GPU/显示系统)里举办一场画展,最终目标是把一幅画展示在墙上的画框(显示器) 里。
3.1、CRTC - 阴极射线管控制器
- 原始形象:在LCD时代之前,CRTC是控制电子束在阴极射线管上扫描的硬件。现在它泛指显示控制器。
- 画展比喻:CRTC 就是那个决定“把哪幅画挂到哪个画框里”的策展人助理。
- 它负责定时从帧缓存里读取像素数据,加上时序信号(如Vblank),最终输出给显示器。
- 一个CRTC通常驱动一个显示器。多显示器系统有多个CRTC。
3.2、Encoder - 编码器
- 原始形象:将CRTC输出的数字像素信号转换成特定接口信号(如HDMI, DPI, LVDS)的硬件模块。
- 画展比喻:Encoder 是画框的“挂画钩”和“说明书撰写员”。
- 它接收策展人助理(CRTC)选好的画,然后根据画框(显示器)的特性,制作一个合适的“挂钩”(比如HDMI信号),并附上如何展示这幅画的说明书(如分辨率、刷新率)。没有这个“钩”,画就无法挂上画框。
3.3、Connector - 连接器
- 原始形象:物理上的显示接口硬件状态抽象,如HDMI口、DP口。它负责检测显示器是否插入、读取显示器的EDID信息(支持的分辨率等)。
- 画展比喻:Connector 就是物理的“画框”本身。
- 它有自己的属性:多大(分辨率)、支持什么样的挂画方式(支持的信号类型)、当前有没有挂画(热插拔检测)。策展系统需要不断地询问画框:“你还在吗?你想怎么被挂画?”
3.4、Plane - 图层
- 原始形象:一个提供图像数据的图层。现代GPU通常支持多个Overlay Plane(叠加图层),可以在硬件层面进行混合,提升效率。
- 画展比喻:Plane 是画作的“图层”或“透明胶片”。
- 主画布(Primary Plane):背景画,通常是桌面本身。
- 叠加画布(Overlay Plane):可以叠加在主画布上的透明胶片,比如一个正在播放的视频窗口。策展人助理(CRTC)可以把主画布、视频窗口、鼠标光标等多个“图层”高效地叠加在一起,形成最终展示的画面。这比把所有内容先画在一张纸上(CPU混合)再展示要快得多。
3.5、Framebuffer - 帧缓存
- 原始形象:一块存储了最终要显示的图像像素数据的内存区域。
- 画展比喻:Framebuffer 就是“已经画好的、等待被挂上画框的画作”。
- 这幅画被存放在仓库(显存)里的一个特定位置。策展人助理(CRTC)的工作就是定时去这个位置取画,然后通过Encoder挂到Connector上。
3.6、Vblank - 垂直消隐期
- 原始形象:显示器完成一帧扫描后,电子束从屏幕右下角返回到左上角开始下一帧的这段时间。此时屏幕没有在刷新。
- 在观众眨眼(Vblank期间)的时候,策展人助理(CRTC)赶紧把旧画取下,换上新画(交换帧缓存)。如果换画的时机不对,在观众正看着的时候换,就会看到画面撕裂(上一半是旧画,下一半是新画)。垂直同步 技术就是确保只在“眨眼时”换画。
3.7、Property - 属性
- 原始形象:DRM内核暴露给用户空间的、用于控制显示硬件各种参数的通用接口。
- 画展比喻:Property 是画框和挂画系统上各种可调节的“旋钮和开关”。
- 比如:“画框的亮度”、“对比度”、“旋转角度”、“是否启用某个特殊滤镜”等等。通过调节这些属性,我们可以精细地控制最终的显示效果,而无需修改画作本身。