APP是如何将图像画到屏幕上的
概要
以绘画艺术展为例,先做个概念上的映射,方便理解。
| 例子 | 抽象 (技术实体) | 说明 (核心职责) |
| 画家 | App | 负责画画 |
| 画布 | Buffer (显存) | 存放画好的画 |
| 策划人 |
SurfaceFlinger (安卓) Weston (Linux) |
决定布局:把不同画家的画(状态栏、弹窗等)叠在一起,决定谁在谁上面 |
| 物流队 | DRM | 负责把画发送出去 |
| 运输车 | MIPI DSI | 传输通道 |
| 展厅 | 屏幕 (Panel) | 把画展览出来 |
参考文章:
- Kernel Mode Setting
- dma-buf
-
Rockchip一些参考资料 -
Xilinx一些参考资料
一 先说结论
- App
在自己的 Buffer(画布) 上绘制好内容后,将其提交给系统。 - SurfaceFlinger(合成器)
收到这个 Buffer ,但它不会直接修改这幅画,而是将其与状态栏、导航栏等其他 Buffer 进行叠加合成。 -
随后,DRM 驱动接收到合成后的最终画面指令,控制硬件通过 MIPI DSI 通道 将数据高速发送给屏幕,最终点亮像素。
二 补充细节

2.1 名词解释
2.1.1 userspace,用户空间
-
安卓上用的 -
HWC: Hardware Composer, Android 的硬件抽象层 (HAL) 模块。它将 SurfaceFlinger 的部分合成任务卸载 (Offload) 到显示控制器硬件 (Display Controller) 上。通过利用硬件图层 (Overlays) 直接进行合成,能显著降低功耗并释放 GPU 算力。 -
Gralloc: Graphics Allocator HAL, Android 特有的图形内存分配 HAL 层。它封装了底层的内存分配逻辑 (如 ION 或 DMA – BUF Heap),分配的缓冲区句柄 (Handle) 包含特定于硬件的元数据 (如步长 Stride、像素格式、缓存一致性策略),确保缓冲区能在不同进程和硬件间正确解析。 -
Linux 用的 -
XServer (X.Org Server): Linux / Unix 系统中传统的显示服务器实现(基于 X11 协议),负责管理输入设备并协调应用程序的绘图请求,架构庞大且包含大量遗留功能。 -
Weston: Wayland 协议的轻量级参考合成器实现,它摒弃了 XServer 的陈旧架构,将显示服务器与窗口管理器合二为一,直接利用 DRM / KMS 实现高效的图形合成。 -
通用的 -
libdrm,一个用户空间库
2.1.2 kernel space,内核空间
-
DRM: Direct Rendering Mangager, Linux 内核的一个子系统,负责管理图像处理单元(GPU)和显示控制器。它提供了用户空间程序与图像硬件通信的接口。 -
Plane: DRM Plane, DRM 子系统中的硬件图层抽象。它代表显示控制器中独立的图像处理单元,可以直接从内存读取图像数据并进行缩放、旋转或格式转换。现代 SoC 通常支持多个 Plane (如主图层、光标层、视频层),允许硬件直接叠加图像而无需 GPU 介入。 -
CRTC: CRT Controller, DRM 子系统中的显示控制器抽象 (对应硬件如 LCDC 或 VOP)。它是显示链路的控制中心,负责把各个 Plane 的图像混合,并产生符合屏幕时序 (Timing) 的扫描信号 (如 HSYNC / VSYNC),将像素流推送到 Encoder。 -
Encoder: DRM Encoder, DRM 子系统中的编码器。负责将 CRTC 输出的并行像素数据转换成特定物理接口所需的电信号协议。例如,将 RGB 数据编码为 HDMI 的 TMDS 信号或 MIPI DSI 的数据包 (Packet)。 -
Connector: DRM Connector, DRM 子系统中的物理接口抽象。代表实际的输出端口 (如 HDMI、DP、DSI)。它负责检测显示设备的连接状态 (Hotplug),并读取屏幕的 EDID 信息 (包含分辨率、厂商等数据) 以告知驱动层屏幕的能力。 -
Panel: 显示器驱动 -
KMS: Kernel Mode Setting, DRM子系统中的一个非常重要的组件,专门负责管理显示输出配置。它负责设置屏幕的分辨率、刷新率和色彩深度,控制这从显存读出像素并输出到物理接口(如MIPI)的整个显示路径。 -
GEM: Graphics Execution Manager, DRM子系统中的内存管理器。它负责图形内存(Buffer Object)的分配、映射(Mapping)和释放。它确保GPU能够高效地访问系统内存或专用显存,并处理内存的一致性问题。 -
DMA-BUF, Direct Memory Access Buffer Sharing, Linux内核的一种缓冲区共享框架,允许不同的设备驱动(如GPU驱动、摄像头驱动、显示驱动)共享同一块物理内存。它是实现零拷贝(Zero-copy)的基础,通过传递文件描述符(fd),图像数据无需在CPU上进行 memcpy,直接由硬件DMA引擎读取。
2.1.3 hardware,硬件
-
RAM: 内存,就是现在涨价涨的飞起的那个 -
LVDS/DP/MIPI/eDP/HDMI/CVBS/RGB, 就是连接屏幕的通道 -
LCD: 就是屏幕 -
LCDC: LCD Controller 厂商 硬件模块名称 (缩写) 全称 备注 Rockchip VOP Video Output Processor 瑞芯微特有,支持多图层硬件叠加 NXP IPU / LCDIF Image Processing Unit i.MX6 叫 IPU (超复杂),i.MX8 叫 LCDIF / DCSS Xilinx AVBuf / VTC Audio/Video Buffer ZynqMP 叫 AVBuf,FPGA 逻辑通常用 VTC Qualcomm MDP / DPU Mobile Display Processor 现代骁龙通常叫 DPU (Display Processing Unit) TI DSS / DISPC Display Subsystem 工业界常用的 AM335x 系列 Allwinner DE Display Engine 全志系列,通常分 DE1.0 / DE2.0 Intel Pipe Display Pipeline PC 领域的叫法 通用术语 LCDC / DC LCD Controller 最朴素的叫法,大家都能听懂 -
硬件图层 厂商 旗舰图层 (对应 Cluster) 经济型图层 (对应 Smart) 最简图层 (对应 Cursor) 设计逻辑 Rockchip (瑞芯微) Cluster Esmart / Smart – 高性能 vs 高能效 Qualcomm (高通) VIG (Video/Graphics) RGB DMA 按功能细分 (视频/UI/搬运) ARM (Mali-DP) Rich Layer Basic Layer – 功能丰富度区分 Amlogic (晶晨) Video Layer OSD Layer – 视频内容 vs UI 内容 Allwinner (全志) Video Channel UI Channel – 视频 vs UI Intel (PC) Primary Plane Sprite Plane Cursor Plane 主平面 vs 叠加层
2.2 合成器是怎么干活的
2.2.1 Weston
Weston 是 Wayland 协议的参考合成器实现,它作为显示服务器,负责接收所有客户端应用程序提交的 Surface (缓冲区),利用 GPU (OpenGL) 或硬件图层将它们合成为最终的一帧图像,并通过 libdrm 接口驱动 KMS 进行显示输出。
2.2.2 HWC
HWC (Hardware Composer) 是 Android 的硬件抽象层模块,它在每一帧显示前检查所有图层属性,决策哪些图层可以由显示控制器 (Display Controller) 硬件直接合成(以节省 GPU 算力和功耗),哪些必须由 GPU 先合成好,最后将配置结果提交给内核驱动。
2.3 libdrm干什么活
libdrm 是一个用户空间的 C 语言库,充当翻译官的角色,它封装了 Linux 内核 DRM 驱动复杂的 ioctl 系统调用,向上层应用程序(如 Weston 或 SurfaceFlinger)提供了一套标准的 API,用于分配图形内存、配置显示模式(Mode Setting)和提交帧数据
2.4 DRM怎么干活的
DRM 通用模型 (软件抽象层),可以把这一套理解为 “流水线上的四个工位”,数据流向是: Plane -> CRTC -> Encoder -> Connector -> Panel

三 总结
| 整个显示系统的核心逻辑,就是将应用程序生产的图形数据 (Buffer),经过层层搬运和翻译,最终转化为屏幕上的光信号。
这个过程可以分几层
-
应用层: -
App 负责 “画”,它只关心自己的画布 (Buffer),画好后提交 -
中间层: -
合成器 (SurfaceFlinger / Weston) 负责 “拼”,它决定了谁在上面、谁在下面。 -
libdrm 作为用户空间和内核空间的 “翻译官”,将合成器的合成指令和显示请求,封装成标准的 API,并通过 ioctl 传递给内核,屏蔽了底层驱动的复杂性 -
内核层 -
DRM 驱动 接管控制权,启动硬件流水线,传输到屏幕上 -
硬件层 -
屏幕收到数据后进行最终的展示
夜雨聆风
