【DRM&Graphic】Linux图形与显示框架

图形显示基础理论

术语表

英文术语 中文术语 物理意义/技术解释
一、图像基础: 模拟图像与数字图像 Analog Image 模拟图像 现实世界连续光信号形成的图像,空间、信息均连续无最小单元,无法被计算机存储与运算。
Sampling 采样 将空间上连续的光信号,分割为离散单元的过程,是模拟图像转数字图像的核心步骤。
Quantization 量化 对连续光信号做数值离散化处理,和采样配合完成模拟信号数字化,会产生固有信息损失。
Pixel 像素 数字图像的最小单元,存储对应位置的亮度、色彩信息,整张图像由像素二维阵列构成。
Resolution 分辨率 图像 / 屏幕横向、纵向的像素总数(如 1920×1080),决定画面基础尺寸与细节上限。
Aspect Ratio 宽高比 图像 / 屏幕宽度与高度的像素比例(如 16:9)。
Aliasing 混叠 采样引发的图像失真现象,表现为斜线锯齿、莫尔条纹、文字边缘粗糙等。
Anti-aliasing 抗锯齿 针对混叠失真的优化技术,弱化图像边缘锯齿,让线条、文字、图形更平滑。
二、色彩体系与模型 RGB RGB 色彩模型 基于人眼三色视觉的色彩模型,通过红、绿、蓝三原色数值组合表示颜色,主流显示基础模型。
Colorspace 色彩空间 一套色彩标准体系,定义三原色波长、标准白点、设备可表达的颜色范围。
Gamut / Color Gamut 色域 某一色彩空间能够覆盖、显示的全部颜色范围。
sRGB sRGB 色域 通用标准色域,多用于显示器、网页、普通图片。
Display P3 /Adobe RGB 广色域 可呈现更多色彩的色域标准,适用于摄影、影视、专业显示设备。
HSV / HSB HSV 色彩模型 以色相、饱和度、明度描述颜色,贴合人眼调色直觉,多用于绘图软件调色。
YUV / YCbCr YUV 色彩模型 将图像拆分为亮度 (Y)和色度 (U/V)的色彩模型,利用人眼特性实现高效压缩,广泛用于视频、流媒体。
Luminance (Y) 亮度 表征画面明暗程度的分量,人眼对亮度变化敏感度极高。
Chrominance (U/V) 色度 表征色彩信息的分量,人眼对色度细节敏感度低,是图像压缩的核心突破口
Color Depth 色深 单个像素使用的二进制位数,代表颜色量化精度,位数越高可表达颜色越多
Color Banding 色带 色深不足引发的失真,颜色过渡生硬、出现明显分层条纹
Alpha Channel Alpha 通道 附加在像素上的透明度通道,用于实现图层叠加、半透明效果
三、色度亚采样 Chroma Subsampling 色度亚采样 主流图像 / 视频压缩技术,多个像素共用一组色度数据,仅保留完整亮度数据,大幅降低数据体积
4:4:4 4:4:4 采样 无压缩采样格式,每个像素都拥有独立的 Y、U、V 完整数据
4:2:2 4:2:2 采样 横向每 2 个像素共用一组色度数据,亮度数据完整保留
4:2:0 4:2:0 采样 横、纵向各 2 个像素(共 4 个像素)共用一组色度数据,视频、摄像头、嵌入式设备通用格式
四、像素内存排布与格式 Packed 打包格式 像素通道交错存储(如 RGBRGB...),所有色彩通道混合在同一片连续内存
Planar 平面格式 Y、U、V 各个通道分别存放在独立的内存区域
Semi-Planar 半平面格式 亮度 (Y) 单独一片内存,U、V 色度通道合并为一片内存
Stride / Pitch 行跨度 / 步长 图像单行像素实际占用的字节数,因硬件地址对齐要求,会包含填充空字节,不等于理论像素字节数。
Address Alignment 地址对齐 硬件 DMA / 控制器要求图像每行起始地址必须符合指定字节边界(16/32/64 字节等),不足部分填充空白。
FourCC 四字符编码 行业通用编码规范,用 4 个字符标识各类像素格式,Linux 图形栈、音视频系统统一使用。
五、光栅化与基础绘制 Rasterization 光栅 将矢量图形(点、线、圆、曲线等连续数学图形)转换为离散像素点阵的过程。
Sub-pixel Rendering 亚像素渲染 利用像素细分位置优化边缘显示,配合抗锯齿提升文字、图形平滑度。
六、像素图像处理操作 Bit Blit (Blit) 位块拷贝 矩形区域像素数据的内存拷贝操作,窗口移动、截图、图层叠加、界面刷新的基础。
Alpha Blending Alpha 混合 依据 Alpha 透明度通道叠加多个图层,计算混合后最终像素颜色
Low-pass Filter 低通滤波 过滤图像高频细节,典型应用:高斯模糊
High-pass Filter 高通滤波 强化图像高频信息,典型应用:图像锐化、边缘检测
Convolution / Convolution Kernel 卷积 / 卷积核 使用固定权重矩阵遍历图像,对像素做加权运算,是滤波、锐化、边缘检测的底层原理。

图像是什么?

模拟图像

现实世界的光线是连续信号,胶片记录的图像即为模拟图像。

特性:空间、信息均连续,无最小显示单元、无颗粒感;无法被计算机直接存储、运算与传输。

数字化过程:采样&量化

计算机不能处理无限连续信息,需要对光信号做离散化处理:

1.采样/量化:将连续的光信号分割为有限、可计数的独立单元

2.像素:离散分割后得到的图像最小单元,单个像素承载对应位置的亮度、色彩信息

数字图像本质

数字图像是对连续光信号做空间量化后形成二位像素阵列(图像帧)

核心基础参数

1.分辨率:图像横向、纵向的像素总数(例:1920×1080),描述画面尺寸。

2.宽高比:图像宽度与高度的像素比例(例:16:9)

3.DPI(每英寸点数):单位物理面积内的像素数量,代表像素密度;数值越高,画面颗粒感越弱。

颜色的本质

色彩的生物学基础 -三色视觉

人类视网膜上存在三种感光细胞,分别对红、绿、蓝波段的光敏感。自然界的所有颜色,最终都会被大脑解析为这三种刺激的组合。

这是数字图像系统普遍采用RGB模型的根本原因,它是最贴合人眼的感知模式

RGB模型与色彩空间

RGB 只是一种色彩表示模型,而非统一标准。同样的 RGB 数值,在不同设备上显示效果可能截然不同,这是因为设备使用的色彩空间(Colorspace)不同。

色彩空间的本质

一套定义色彩的翻译字典,规定了:

1.红,绿,蓝三原色的确切波长

2.标准白光(白点)

3.设备能表示的全部颜色范围,即色域(Gamut)

常见色域

sRGB:网页、图片、显示器的通用标准色域;

Display P3 / Adobe RGB:广色域标准,可表示更多色彩,多用于摄影、影视专业领域;

超出色域的颜色会被设备 "裁切" 或映射为最近的可表示色,这是不同设备同图色彩差异的主要原因。

常见的色彩模型 - HSV与YUV

在Linux图形栈、视频系统和嵌入式显示中,除RGB外,还有两类核心色彩模型

1.HSV/HSB模型

用色相(Hue),饱和度(Saturation),明度(Value/Brightness)描述颜色

更贴近人类对色彩的直觉认知,因此被广泛的用于绘图软件的调色系统中

2.YUV/YCbCr模型

将图像拆分为亮度分亮Y和色度分量UV,利用人眼对亮度敏感、对色彩细节不敏感的特性,实现高效压缩;

YUV是视频传输、流媒体、硬件编解码的主流模型,Linux DRM、视频解码器、硬件加速器底层均基于此

经典 BT.601 标准的 RGB↔YUV 变换公式:

c 复制代码
// RGB → YUV
Y = 0.299×R + 0.587×G + 0.114×B
U = -0.147×R - 0.289×G + 0.436×B
V = 0.615×R - 0.515×G - 0.100×B

// YUV → RGB
R = Y + 1.140×V
G = Y - 0.395×U − 0.581×V
B = Y + 2.032×U

色深(Color Depth)

色深指单个像素使用的二进制位数,代表颜色的量化精度,直接决定图像的色彩表现和内存占用:

色深 可表示颜色数 典型应用场景
8 bit 256 色 早期系统、简单界面
16 bit 65536 色 嵌入式设备
24 bit 约 1600 万色(真彩色) RGB 各 8 位,通用图像标准
32 bit 约 1600 万色 + Alpha 通道 现代桌面系统、带透明效果的图像

色深不足会导致颜色过渡生硬,出现色带现象

色深是Linux驱动配置,缓冲区大小计算的核心参数之一

常见的色彩问题根源

1.色深设置错误

2.色域 / 色彩空间不匹配

3.色彩模型(RGB/YUV)转换规则配置错误

图像大小,数据量与色度亚采样

数字图像/视频的数据量计算

1.单张图像的内存占用公式

图像大小由分辨率和色深共同决定,计算公式为:

字节大小 = 宽 x 高 x 每像素比特数 / 8

比如:4000x3000 32bit的图片:4000x3000x32/8 ≈ 46MB

2.视频数据量

视频时连续的图像序列,以30帧/秒,1min时长为例:

46Mb x 30fps x 60s ≈ 82GB

原始数据量巨大,无法直接传输和存储,因此必须引入高效压缩手段

核心压缩计数:色彩亚采样(Chroma Subsampling)

1.设计原理

利用人眼的视觉特性,对亮度Y敏感,色度UV细节不敏感

因此可以保留完整的亮度数据,让多个像素共用一组色度数据,在几乎不影响观感的前提下,大幅降低数据量

2.行业标准表示:J : a : b

常见的色度亚采样格式及含义

格式 采样规则 数据量变化 典型应用场景
YUV4:4:4 无压缩,每个像素都有独立的 Y、U、V 数据 原始数据量,无压缩 专业图像处理、无损视频
YUV4:2:2 横向每 2 个像素共用一组色度数据 数据量减少约 1/3 广播级视频、部分专业设备
YUV4:2:0 横向 2 个、纵向 2 个(共 4 个)像素共用一组色度数据 数据量几乎减半 H.264/H.265/VP9、在线视频、摄像头、电视面板、嵌入式系统默认格式

3.亚采样在linux图形系统中的地位

在 DRM、V4L2 视频驱动、显示接口配置、硬件编解码器中,4:2:0 是最基础、最通用的格式,不理解它就无法调试视频输出、图像显示相关问题

面绿色 / 紫色错乱、花屏、分块等问题,很大比例是亚采样格式不匹配导致的(例如发送端是 4:2:0,接收 / 显示端按 4:2:2 解析)

4.亚采样后数据量压缩效果

格式 单张图像大小 1 分钟视频数据量
YUV4:4:4 36 MB 36 × 30 × 60 = 64.8 GB
YUV4:2:2 24 MB 24 × 30 × 60 = 43.2 GB
YUV4:2:0 18 MB 18 × 30 × 60 = 32.4 GB

可以看到,从 4:4:4 到 4:2:0,1 分钟视频的数据量直接从 64.8 GB 降到了 32.4 GB,几乎减半,这就是为什么 4:2:0 会成为视频领域的通用标准

像素在计算机内存中的排布

像素数据的内存组织形式

为了高效存储与处理图像,像素数据在内存中有三种主流排布方式,Linux 图形栈、驱动、硬件均支持这些格式:

格式类型 特点 示例(RGB/YUV)
Packed(打包) 所有颜色通道交错存储在同一片连续内存 RGBRGBRGB...ARGBARGB...
Planar(平面) 不同颜色通道分别存放在独立的内存区域 Y、U、V 各占一块内存
Semi-Planar(半平面) 亮度通道单独存储,色度通道合并存储 Y 单独一块,U/V 合并为一块(如 NV12)

关键参数:Stride/Pitch(行跨度)

概念:图像中单行像素实际的那用的字节数

与理论值的区别:理论值 = 图像宽度 × 每像素字节数

实际 Stride 通常大于理论值,因为硬件 DMA / 控制器要求行起始地址必须按 16/32/64 字节对齐,不足部分会填充空白字节

计算缓冲区大小、进行内存拷贝时必须使用实际 Stride,否则会导致内存越界、画面错位、花屏甚至内核崩溃,是嵌入式图形调试的高频坑点

示例:

一行 100 个像素、32 位深(4 字节 / 像素),理论值为 100×4=400 字节。若硬件要求 64 字节对齐,Stride 需向上取 64 的倍数,即 448 字节,末尾 48 字节为填充空白

格式标识:Fourcc(四字节编码)

行业通用的 4 字符编码规范,用于唯一标识各种像素格式

常见示例:

RGB3 -> RGB888

ARGB -> ARGB8888

YU12/YV12 -> YUV420 Planar

XR24 -> XRGB8888 (DRM内部常用)

Linux 图形栈(libdrm、驱动、应用、编解码器)均依赖 FourCC 统一描述格式,避免解析错误

常见显示故障的可能原因

花屏、偏色、错位、画面撕裂等问题,大概率和内存排布有关

1.Fourcc格式不匹配:发送端与接收端对像素格式的理解不一致。

2.Sride 计算错误 : 未考虑硬件对齐要求,导致行数据错位

3.存储结构混淆:打包 / 平面 / 半平面格式解析错误(如将 Planar 格式按 Packed 处理)

如何将具体形状编程为像素点

光栅化

定义:将数学上连续的点、线、矩形、圆、曲线等形状,转换为屏幕上离散像素点的过程

本质上是把连续的数学图形,映射到离散的像素网格上,是 "从数学形状到像素点" 的核心步骤

基础图形的绘制逻辑

1.矩形:通过限定 xmin/xmax、ymin/ymax 坐标范围,将范围内的所有像素统一填充颜色。

2.直线:根据两点坐标计算斜率,逐点确定像素位置;嵌入式系统常用 Bresenham 算法,无需浮点运算,速度快、开销低。

3.圆 / 椭圆:以中心点为基准,通过判断像素点到中心的距离是否小于等于半径,确定是否为圆内像素。

4.渐变:在起点色与终点色之间做线性插值,为每个像素计算对应的 RGB 数值,实现平滑过渡效果。

光栅化的固有问题和解决方法

问题:锯齿失真

斜线、圆、小字直接光栅化时,边缘会出现锯齿,这是连续图形映射到离散像素的固有采样问题

解决方法:

抗锯齿(Anti-aliasing):给边缘像素赋予半透明值,柔化硬边缘,减少锯齿感

亚像素渲染(Sub-pixel Rendering):利用像素的细分位置优化边缘显示,是 Linux 桌面字体清晰、矢量图平滑的核心技术之一

像素的操作:混合,缩放,滤波,抖动,拷贝

Linux图形栈中窗口合成、界面动画、图层叠加、视频特效、界面刷新,全部底层都由六大基础像素操作实现,是光栅化之后图像二次处理的核心能力

区域拷贝(Bit Blit/Blit)

核心定义:将内存中一块矩形区域的像素数据,完整复制到另一块内存区域

上层应用:窗口拖拽移动、屏幕截图、多层图层底层叠加、界面局部刷新

硬件意义:系统2D硬件加速器唯一核心作用,就是卸载CPU算力,硬件加速Blit拷贝,降低CPU占用

Alpha混合(Alpha Blending)

核心定义:依托像素Alpha透明通道,完成前景图层与背景图层的颜色融合

计算公式:最终像素颜色 = 前景色×Alpha透明度 + 背景色×(1-Alpha透明度)

底层理论:遵循Porter-Duff混合模型,计算机图形经典图层融合标准

上层应用:窗口半透明、弹窗菜单、图标抗锯齿、桌面多层窗口合成

色度键控(Color Keying)

通俗名称:绿幕抠图

核心原理:识别画面中预先设定的固定颜色,强制将该颜色区域转为透明,透出底层背景

嵌入式/Linux应用:视频字幕叠加、UI悬浮控件、摄像头画面图层合成

和Alpha混合区别:无需Alpha通道,依靠纯色判定实现透明,轻量化图层叠加方案

图像缩放与插值重采样

核心逻辑:图像放大/缩小时,原有像素点位改变,需要通过插值算法重新采样生成新像素

三类插值算法对比

  1. 最近邻采样:运算速度最快,画质差、锯齿失真严重,嵌入式低配设备使用
  2. 双线性采样:速度、画质均衡,Linux显示驱动默认缩放算法
  3. 双三次采样:画质最优,边缘过渡平滑,算力消耗极大,仅PC端使用

缩小图像特殊要求:直接缩小会产生混叠波纹,必须先低通模糊消除高频细节,再执行缩放

线性滤波与卷积

核心逻辑:图像放大/缩小时,原有像素点位改变,需要通过插值算法重新采样生成新像素

三类插值算法对比

  1. 最近邻采样:运算速度最快,画质差、锯齿失真严重,嵌入式低配设备使用
  2. 双线性采样:速度、画质均衡,Linux显示驱动默认缩放算法
  3. 双三次采样:画质最优,边缘过渡平滑,算力消耗极大,仅PC端使用

缩小图像特殊要求:直接缩小会产生混叠波纹,必须先低通模糊消除高频细节,再执行缩放

图像抖动

触发场景:硬件色深不足(如16bit、8bit低色深屏幕),原生色彩数量不够,颜色过渡生硬出现色带

核心原理:人为添加微小噪点,利用人眼视觉混合错觉,模拟出不存在的中间色彩

主流算法:Floyd-Steinberg抖动,行业硬件显示引擎、GIF图片标配算法

解决问题:消除低色深画面色彩分层、色带瑕疵

Linux图形栈软件整体架构

Linux 图形栈在逻辑上被清晰地划分为 用户态(User Space) 和 内核态(Kernel Space) 两大部分,每一部分都包含多个协同工作的组件,二者通过稳定的系统调用(主要是 ioctl)进行通信。

用户态(Graphic):面向应用程序,提供图形API库,显示服务和DRM封装库,负责将应用的渲染需求(绘制一行字符串)转换为具体的硬件指令

内核态(DRM):直接管理硬件,负责执行最终的硬件操作,包含DRM框架和IC厂商的GPU/DPU驱动,处理显存管理,显示模式设置,GPU命令提交和中断响应,并确保多任务环境下的资源与安全与隔离

Linux图形栈架构分层

#mermaid-svg-FgwXtgKXnqw0HBRP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FgwXtgKXnqw0HBRP .error-icon{fill:#552222;}#mermaid-svg-FgwXtgKXnqw0HBRP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FgwXtgKXnqw0HBRP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FgwXtgKXnqw0HBRP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FgwXtgKXnqw0HBRP .marker.cross{stroke:#333333;}#mermaid-svg-FgwXtgKXnqw0HBRP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FgwXtgKXnqw0HBRP p{margin:0;}#mermaid-svg-FgwXtgKXnqw0HBRP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP .cluster-label text{fill:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP .cluster-label span{color:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP .cluster-label span p{background-color:transparent;}#mermaid-svg-FgwXtgKXnqw0HBRP .label text,#mermaid-svg-FgwXtgKXnqw0HBRP span{fill:#333;color:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP .node rect,#mermaid-svg-FgwXtgKXnqw0HBRP .node circle,#mermaid-svg-FgwXtgKXnqw0HBRP .node ellipse,#mermaid-svg-FgwXtgKXnqw0HBRP .node polygon,#mermaid-svg-FgwXtgKXnqw0HBRP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FgwXtgKXnqw0HBRP .rough-node .label text,#mermaid-svg-FgwXtgKXnqw0HBRP .node .label text,#mermaid-svg-FgwXtgKXnqw0HBRP .image-shape .label,#mermaid-svg-FgwXtgKXnqw0HBRP .icon-shape .label{text-anchor:middle;}#mermaid-svg-FgwXtgKXnqw0HBRP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FgwXtgKXnqw0HBRP .rough-node .label,#mermaid-svg-FgwXtgKXnqw0HBRP .node .label,#mermaid-svg-FgwXtgKXnqw0HBRP .image-shape .label,#mermaid-svg-FgwXtgKXnqw0HBRP .icon-shape .label{text-align:center;}#mermaid-svg-FgwXtgKXnqw0HBRP .node.clickable{cursor:pointer;}#mermaid-svg-FgwXtgKXnqw0HBRP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FgwXtgKXnqw0HBRP .arrowheadPath{fill:#333333;}#mermaid-svg-FgwXtgKXnqw0HBRP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FgwXtgKXnqw0HBRP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FgwXtgKXnqw0HBRP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FgwXtgKXnqw0HBRP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FgwXtgKXnqw0HBRP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FgwXtgKXnqw0HBRP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FgwXtgKXnqw0HBRP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FgwXtgKXnqw0HBRP .cluster text{fill:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP .cluster span{color:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FgwXtgKXnqw0HBRP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FgwXtgKXnqw0HBRP rect.text{fill:none;stroke-width:0;}#mermaid-svg-FgwXtgKXnqw0HBRP .icon-shape,#mermaid-svg-FgwXtgKXnqw0HBRP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FgwXtgKXnqw0HBRP .icon-shape p,#mermaid-svg-FgwXtgKXnqw0HBRP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FgwXtgKXnqw0HBRP .icon-shape .label rect,#mermaid-svg-FgwXtgKXnqw0HBRP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FgwXtgKXnqw0HBRP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FgwXtgKXnqw0HBRP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FgwXtgKXnqw0HBRP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 硬件
内核态
用户态
渲染
渲染
渲染
显示
ioctl
ioctl
硬件管理
显示模式设置
缓冲区管理
任务调度
同步
访问

(PCIe/AXI)
控制

(PCIe/AXI)
管理

(drm_mm/drm_buddy)
触发

(fence)
输出
显示
应用程序

(游戏、浏览器、视频播放器)
显示服务与合成器

(X Server / Wayland Compositor)
图形/计算 API

(OpenGL, Vulkan, OpenCL, EGL, GLES)
图形库(Mesa 3D)

(图形/计算 API 实现 + GBM + 厂商硬件驱动)
DRM 封装库

(libdrm)
内核图形子系统核心

(DRM)
GPU 内核驱动

(i915, amdgpu, panfrost)
显示服务与输出处理

(KMS)
显存管理

(GEM/TTM)
任务调度

(GPU scheduler)
事件同步

(syncobj)
图形处理器

(GPU)
显示控制器

(CRTC/Plane)
显存

(主存 / 显存)
中断

(MSI-X/GIC)
物理接口

(HDMI/DisplayPort/MIPI-DSI)
显示设备

(显示器 / 液晶屏)

整体架构由上到下:

  • 用户态

    • 应用程序(Application):如游戏,浏览器,视频播放器等,是图形内容的生产者
    • 显示服务与合成器(X Server/Wayland Compositor): 负责窗口管理,合成与最终帧输出
    • 图形/计算API(OpenGL,Vulkan,OpenCL,EGL,GLES):提供跨平台的图形/计算编程接口
    • 图形库(Mesa 3D):开源图形协议栈的核心实现层,用户态和内核态之间的翻译官
    • DRM封装库(libdrm):提供对DRM ioctl的C语言封装、
  • 用户态总结:应用 → API(Vulkan/GL)→ Mesa(实现+GBM)→ libdrm → 内核 DRM

  • 内核态 - 核心是DRM子系统(内核图形子系统核心),它是Linux显卡驱动的统一框架

    • DRM Core:DRM框架的中枢带哦都器,负责设备注册,初始化,支持热插拔,电源管理,ioctl请求等功能

    • GPU内核驱动:厂商特定驱动,实现寄存器映射与硬件控制,命令提交,中断处理等

    • KMS(Kernel Mode Setting): 内核中完成显示模式设置,比如分辨率,刷新率,色彩格式等

      • 由libdrm调用->DRM Core->KMS模块->显示控制器(CRTC)
    • GEM/TTM(显存管理)

    • GPU Scheduler(任务调度):内核级GPU任务队列调度器

    • syncobj/fence(事件同步)

  • 内核态总结:DRM Core 是总控台 → 分发请求至 KMS(显示)、GEM(内存)、Scheduler(任务)、SyncObj(同步)→ 驱动层操作硬件

  • 硬件层

    • GPU:执行着色器,光栅化,计算任务的核心硬件单元,通过PCIe/AXI总线与CPU/内存通信
    • CRTC/Plane(显示控制器),生成时序信号HSync/VSync,决定像素输出节奏
    • 显存(VRAM/主存):GPU专用高速内存VRAM或通过IOMMU映射的系统内存
    • 物理接口(HDMI/DisplayPort/DIPI-DSI):将数字信号转换为物理电信号输出
    • 显示设备(显示器/液晶屏):最终呈现图像的终端
    • 中断:GPU完成任务后触发中断通知内核

核心组件

Conpositor(合成器)

合成器负责将多个应用窗口或图层的数据合成到最终输出帧

X Server/Wayland Conpostor : 是用户空间的两种不同显示服务器架构

X Server是传统的显示服务器,采用CS模型,作为应用于底层硬件的中间,负责接收绘图请求、管理窗口、处理输入事件并调度合成器进行画面合成

Wayland Conpostor是现代的显示协议和服务器,不再负责具体的绘图指令执行,而是接收Client已经渲染好的图像缓冲区,组合叠加后,直接调用DRM/KMS提交给屏幕显示

FrameBuffer(fddev):一种无专门合成器,应用直接写缓冲,画面合成依赖上层应用

Mesa 3D

一个开源的用户态图形驱动集合,它实现了 OpenGL、Vulkan 等多个图形 API。当应用程序调用 glDraw* 时,Mesa 会将其翻译成特定 GPU 的硬件指令,然后通过 DRM 接口提交给内核执行。

OpenGL :是一个跨平台的图形渲染API,它本身不直接与硬件交互,而是通过Mesa 3D等图形库将绘图指令翻译给GPU

Vulkan驱动:ulkan 驱动不使用 Gallium 框架,它们是独立的、更接近硬件的实现,以获得更高的性能和更低的开销。例如,Intel 的 ANV 和 AMD 的 RADV

GBM(generic Buffer Management):这是 Mesa 提供的一个重要的 API,它提供了一种"无窗口"的、通用的方式来申请和管理可用于渲染的图形缓冲区(Buffer)。Wayland 合成器严重依赖 GBM 来从客户端获取渲染好的内容进行合成。

libdrm

一个用户态库,封装了对 DRM 驱动的 ioctl 调用,为 Mesa 等上层库提供了更便捷的函数式 API,避免了直接操作复杂的 ioctl 命令。

渲染与显示的完整流程

Linux图形栈一次完整的绘制-显示过程,两者通过同步对象(Fence衔接),确保在画面渲染完成后再送显

第一阶段:渲染阶段

渲染阶段的主要目标让GPU执行绘图命令,生成一帧新的画面

1.初始化

应用启动,通过EGL API连接到合成器Compositor.Compositor通过GBM为应用程序创建一个可供渲染的共享缓冲区gbm_bo

Mesa的EGL实现内部通过DRM的ioctl调用,在显存中分配这块缓冲区,并将句柄dma-buf fd返回给Compositor

2.命令构建

应用或合成器调用OpenGL/Vulkan API比如glDrawArrays()进行场景绘制

Mesa 3D库接受这些调用,对应的GPU驱动将这些API调用翻译成GPU硬件指令,并写入一个命令缓冲区Command Buffer

3.提交内核

Mesa通过Libdrm库调用ioctl接口,将命令缓冲及相关的图形资源(纹理,顶点数据)的引用提交给内核中的DRM驱动

4.硬件执行

内核驱动验证命令后,通过GEM/TTM管理器,将命令缓冲和资源映射到GPU可访问的地址空间。

随后,驱动命令GPU开始执行渲染任务

5.渲染完成通知

GPU完成渲染后,将结果写入之前分配好的共享缓冲区中,产生一个硬件中断。

内核驱动捕获此中断,并触发一个与该渲染任务关联的渲染围栏(Reader Fence).标志着该帧画面已在内存中准备就绪

第二阶段 : 显示阶段

此阶段目标是将已经渲染好的画面缓冲区FrameBuffer提交给显示控制器,让其显示在屏幕上

1.提交与合成

应用渲染完成后,通知合成器Compositor已完成可显示

合成器Compositor收到通知,知道这个应用程序的窗口内容已经更新

Compositor 自身也是一个图形应用,通常是OpenGL ES,它会将所有可见窗口以及自己的UI元素合成为最终一帧画面

合成器决定由DPU还是GPU来完成合成任务,如果设备有DPU,合成任务有限交给DPU完成,提高能效和性能,如果没有专门的DPU,合成任务可能由GPU继续完成,合成过程不涉及复杂3D渲染,更多是2D图层混合操作

2.请求页面反转

合成器Compositor在确认Reader Fence已触发后,向DRM驱动发起一个页面翻转(Page Flip)的ioctl请求,告诉KMS将屏幕的CRTC的Plane指向这个新的,已经合成好的帧缓冲(FrameBuffer)区

此请求包含了新画面的缓冲区地址,并指定在下一个垂直同步信号V-Sync到来时执行

3.调度显示任务

DRM/KMS驱动收到请求后,不会立刻改变显示内容,而是将这个页面翻转任务进行排程,等待显示硬件的V-Sync信号

4.执行页面反转

当下一次显示器发送垂直同步(V-Sync)信号时,显示控制器(CRTC)硬件会原子性地切换到读取新的缓冲区地址,开始逐行扫描新画面的内容,并通过 Encoder 和 Connector 发送到显示器进行显示,避免画面撕裂

5.屏幕显示完成

页面翻转操作完成后,内核会触发另一个显示围栏(Display Fence 或 VBlank Event),通知用户态程序本次显示更新已完成。

交互时序图

显示控制器 GPU 硬件 DRM 内核驱动 Mesa 3D / 图形库 合成器 / 应用 显示控制器 GPU 硬件 DRM 内核驱动 Mesa 3D / 图形库 合成器 / 应用 #mermaid-svg-nvN5HB3JGKMuxX8W{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nvN5HB3JGKMuxX8W .error-icon{fill:#552222;}#mermaid-svg-nvN5HB3JGKMuxX8W .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nvN5HB3JGKMuxX8W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nvN5HB3JGKMuxX8W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nvN5HB3JGKMuxX8W .marker.cross{stroke:#333333;}#mermaid-svg-nvN5HB3JGKMuxX8W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nvN5HB3JGKMuxX8W p{margin:0;}#mermaid-svg-nvN5HB3JGKMuxX8W .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nvN5HB3JGKMuxX8W text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nvN5HB3JGKMuxX8W .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nvN5HB3JGKMuxX8W .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nvN5HB3JGKMuxX8W #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nvN5HB3JGKMuxX8W .sequenceNumber{fill:white;}#mermaid-svg-nvN5HB3JGKMuxX8W #sequencenumber{fill:#333;}#mermaid-svg-nvN5HB3JGKMuxX8W #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nvN5HB3JGKMuxX8W .messageText{fill:#333;stroke:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nvN5HB3JGKMuxX8W .labelText,#mermaid-svg-nvN5HB3JGKMuxX8W .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .loopText,#mermaid-svg-nvN5HB3JGKMuxX8W .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nvN5HB3JGKMuxX8W .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nvN5HB3JGKMuxX8W .noteText,#mermaid-svg-nvN5HB3JGKMuxX8W .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-nvN5HB3JGKMuxX8W .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nvN5HB3JGKMuxX8W .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nvN5HB3JGKMuxX8W .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nvN5HB3JGKMuxX8W .actorPopupMenu{position:absolute;}#mermaid-svg-nvN5HB3JGKMuxX8W .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nvN5HB3JGKMuxX8W .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nvN5HB3JGKMuxX8W .actor-man circle,#mermaid-svg-nvN5HB3JGKMuxX8W line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nvN5HB3JGKMuxX8W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 阶段一:渲染 阶段二:显示 1 调用绘图 API 2 ioctl: 提交渲染命令 3 执行渲染任务 4 中断 (渲染完成) 5 发出 Render Fence 信号 6 请求合成画面(DPU-based) 7 返回合成后的帧缓冲区 8 ioctl: 请求页面翻转(Page Flip) 9 安排在 V-Sync 时切换缓冲区 10 V-Sync 中断 / 翻转完成 11 发出 Page Flip 完成事件 / Fence

图形帧流转链路

图像帧的流转路径:
#mermaid-svg-1VGN1mosgfTALOmV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1VGN1mosgfTALOmV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1VGN1mosgfTALOmV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1VGN1mosgfTALOmV .error-icon{fill:#552222;}#mermaid-svg-1VGN1mosgfTALOmV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1VGN1mosgfTALOmV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1VGN1mosgfTALOmV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1VGN1mosgfTALOmV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1VGN1mosgfTALOmV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1VGN1mosgfTALOmV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1VGN1mosgfTALOmV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1VGN1mosgfTALOmV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1VGN1mosgfTALOmV .marker.cross{stroke:#333333;}#mermaid-svg-1VGN1mosgfTALOmV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1VGN1mosgfTALOmV p{margin:0;}#mermaid-svg-1VGN1mosgfTALOmV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1VGN1mosgfTALOmV .cluster-label text{fill:#333;}#mermaid-svg-1VGN1mosgfTALOmV .cluster-label span{color:#333;}#mermaid-svg-1VGN1mosgfTALOmV .cluster-label span p{background-color:transparent;}#mermaid-svg-1VGN1mosgfTALOmV .label text,#mermaid-svg-1VGN1mosgfTALOmV span{fill:#333;color:#333;}#mermaid-svg-1VGN1mosgfTALOmV .node rect,#mermaid-svg-1VGN1mosgfTALOmV .node circle,#mermaid-svg-1VGN1mosgfTALOmV .node ellipse,#mermaid-svg-1VGN1mosgfTALOmV .node polygon,#mermaid-svg-1VGN1mosgfTALOmV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1VGN1mosgfTALOmV .rough-node .label text,#mermaid-svg-1VGN1mosgfTALOmV .node .label text,#mermaid-svg-1VGN1mosgfTALOmV .image-shape .label,#mermaid-svg-1VGN1mosgfTALOmV .icon-shape .label{text-anchor:middle;}#mermaid-svg-1VGN1mosgfTALOmV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1VGN1mosgfTALOmV .rough-node .label,#mermaid-svg-1VGN1mosgfTALOmV .node .label,#mermaid-svg-1VGN1mosgfTALOmV .image-shape .label,#mermaid-svg-1VGN1mosgfTALOmV .icon-shape .label{text-align:center;}#mermaid-svg-1VGN1mosgfTALOmV .node.clickable{cursor:pointer;}#mermaid-svg-1VGN1mosgfTALOmV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1VGN1mosgfTALOmV .arrowheadPath{fill:#333333;}#mermaid-svg-1VGN1mosgfTALOmV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1VGN1mosgfTALOmV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1VGN1mosgfTALOmV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1VGN1mosgfTALOmV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1VGN1mosgfTALOmV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1VGN1mosgfTALOmV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1VGN1mosgfTALOmV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1VGN1mosgfTALOmV .cluster text{fill:#333;}#mermaid-svg-1VGN1mosgfTALOmV .cluster span{color:#333;}#mermaid-svg-1VGN1mosgfTALOmV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1VGN1mosgfTALOmV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1VGN1mosgfTALOmV rect.text{fill:none;stroke-width:0;}#mermaid-svg-1VGN1mosgfTALOmV .icon-shape,#mermaid-svg-1VGN1mosgfTALOmV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1VGN1mosgfTALOmV .icon-shape p,#mermaid-svg-1VGN1mosgfTALOmV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1VGN1mosgfTALOmV .icon-shape .label rect,#mermaid-svg-1VGN1mosgfTALOmV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1VGN1mosgfTALOmV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1VGN1mosgfTALOmV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1VGN1mosgfTALOmV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ioctl
写入帧缓冲
读取帧缓冲
应用程序
显示服务 / 窗口系统 / 合成器

(X Server / Wayland Compositor)
图形库

(Mesa3D, 厂商 UMD 驱动)
DRM 驱动

(DRM 核心, 厂商 KMD 驱动)
GPU 渲染单元
显存
显示控制器
编码器

(HDMI, DP, MIPI DSI)
显示器

  1. 应用 → 合成器:提交窗口缓冲区

    应用程序通过图形 API 完成自身窗口内容的渲染后,将渲染结果写入共享缓冲区(Buffer),并将该缓冲区句柄提交给显示服务器(如 Wayland Compositor),通知其窗口内容已更新。

  2. 合成器 → 图形库:执行全局画面合成

    合成器收集所有应用的窗口缓冲区、系统 UI 元素(如鼠标指针、状态栏),并按窗口层级、透明度等规则进行混合,生成一帧完整的画面。这一合成过程通过调用 OpenGL/Vulkan API,由 Mesa 等图形库完成。

  3. 图形库 → DRM 驱动:提交硬件指令

    Mesa 图形库将合成任务转换为 GPU 可执行的硬件指令,并通过 ioctl 系统调用,将这些指令及相关图形资源(缓冲区、纹理等)提交给内核 DRM 驱动。

  4. DRM 驱动 → GPU:执行合成并写入帧缓冲

    DRM 驱动对指令进行安全验证后,调度 GPU 执行合成任务。处理完成的最终画面被写入显存中预先分配好的帧缓冲(Framebuffer)区域。

  5. 显存 → 显示控制器:按模式读取并预处理

    显示控制器(CRTC/Plane)按照 KMS 设定的分辨率、刷新率,在 V-Sync 周期从显存中读取帧缓冲数据,同时可能执行硬件光标叠加、图层混合(Overlay)、色彩校正等操作。

  6. 显示控制器 → 编码器:输出像素数据流

    显示控制器将处理后的像素数据流发送给编码器(Encoder),准备转换为显示器可识别的信号格式。

  7. 编码器 → 显示器:发送显示信号

    编码器将像素数据转换为对应接口协议的电信号(如 HDMI、DisplayPort 或 MIPI-DSI),通过物理接口传输到显示器面板,驱动其发光成像。

SOC与PC架构的差异

特性 SoC 平台描述 PC 平台描述
GPU 类型 高度集成的片上 GPU(如 Mali、Adreno) 独立 dGPU(NVIDIA/AMD)+ 集成 iGPU(Intel/AMD APU)
内存架构 统一内存架构(UMA),CPU/GPU 共享物理 RAM,访问延迟低 dGPU:独立板载显存(VRAM)+ 系统内存,通过 PCIe 通信;iGPU:与 SoC 类似,采用 UMA
显示控制器 独立硬件 IP(DPU/DC),与 GPU 解耦 通常集成在 GPU 芯片内部
视频编解码 独立硬件单元(VPU)负责,能效比高 主要由 GPU 内的专用编解码模块或 CPU 提供加速
IOMMU/SMMU 普遍使用,用于隔离和地址翻译,对多媒体处理至关重要 dGPU:自带地址转换逻辑,系统 IOMMU(VT-d)可选;iGPU:使用系统 IOMMU(VT-d)/GTT
功耗管理 核心考量,精细的 DVFS、时钟门控、功耗岛 以性能优先,功耗管理相对粗放
  • 内存架构的细节
    • 移动 SoC 的 UMA 并非完全没有开销,只是因为 CPU/GPU 共享同一物理内存,省去了 "PCIe 总线 + 独立显存" 的延迟,能效更好。
    • PC 独显的独立显存带宽极高(几十到几百 GB/s),适合 3D 渲染等带宽密集型场景,但访问系统内存时需要经过 PCIe,延迟和功耗都更高。
  • 显示控制器的分工差异
    • SoC 上的独立 DPU 不仅负责扫描输出,还常承担图层混合、缩放、色彩校正等任务,大幅降低 GPU 的负载,提升能效。
    • PC GPU 内部的显示控制器则更偏向输出控制,复杂合成任务更多由 GPU 本身完成。

SOC硬件连接拓扑

典型的SOC内部图形和显示功能模块的互连拓扑图
#mermaid-svg-gipuG1wBVkwPZJGs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gipuG1wBVkwPZJGs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gipuG1wBVkwPZJGs .error-icon{fill:#552222;}#mermaid-svg-gipuG1wBVkwPZJGs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gipuG1wBVkwPZJGs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gipuG1wBVkwPZJGs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gipuG1wBVkwPZJGs .marker.cross{stroke:#333333;}#mermaid-svg-gipuG1wBVkwPZJGs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gipuG1wBVkwPZJGs p{margin:0;}#mermaid-svg-gipuG1wBVkwPZJGs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gipuG1wBVkwPZJGs .cluster-label text{fill:#333;}#mermaid-svg-gipuG1wBVkwPZJGs .cluster-label span{color:#333;}#mermaid-svg-gipuG1wBVkwPZJGs .cluster-label span p{background-color:transparent;}#mermaid-svg-gipuG1wBVkwPZJGs .label text,#mermaid-svg-gipuG1wBVkwPZJGs span{fill:#333;color:#333;}#mermaid-svg-gipuG1wBVkwPZJGs .node rect,#mermaid-svg-gipuG1wBVkwPZJGs .node circle,#mermaid-svg-gipuG1wBVkwPZJGs .node ellipse,#mermaid-svg-gipuG1wBVkwPZJGs .node polygon,#mermaid-svg-gipuG1wBVkwPZJGs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gipuG1wBVkwPZJGs .rough-node .label text,#mermaid-svg-gipuG1wBVkwPZJGs .node .label text,#mermaid-svg-gipuG1wBVkwPZJGs .image-shape .label,#mermaid-svg-gipuG1wBVkwPZJGs .icon-shape .label{text-anchor:middle;}#mermaid-svg-gipuG1wBVkwPZJGs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gipuG1wBVkwPZJGs .rough-node .label,#mermaid-svg-gipuG1wBVkwPZJGs .node .label,#mermaid-svg-gipuG1wBVkwPZJGs .image-shape .label,#mermaid-svg-gipuG1wBVkwPZJGs .icon-shape .label{text-align:center;}#mermaid-svg-gipuG1wBVkwPZJGs .node.clickable{cursor:pointer;}#mermaid-svg-gipuG1wBVkwPZJGs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gipuG1wBVkwPZJGs .arrowheadPath{fill:#333333;}#mermaid-svg-gipuG1wBVkwPZJGs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gipuG1wBVkwPZJGs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gipuG1wBVkwPZJGs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gipuG1wBVkwPZJGs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gipuG1wBVkwPZJGs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gipuG1wBVkwPZJGs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gipuG1wBVkwPZJGs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gipuG1wBVkwPZJGs .cluster text{fill:#333;}#mermaid-svg-gipuG1wBVkwPZJGs .cluster span{color:#333;}#mermaid-svg-gipuG1wBVkwPZJGs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gipuG1wBVkwPZJGs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gipuG1wBVkwPZJGs rect.text{fill:none;stroke-width:0;}#mermaid-svg-gipuG1wBVkwPZJGs .icon-shape,#mermaid-svg-gipuG1wBVkwPZJGs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gipuG1wBVkwPZJGs .icon-shape p,#mermaid-svg-gipuG1wBVkwPZJGs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gipuG1wBVkwPZJGs .icon-shape .label rect,#mermaid-svg-gipuG1wBVkwPZJGs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gipuG1wBVkwPZJGs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gipuG1wBVkwPZJGs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gipuG1wBVkwPZJGs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SoC
CPU(多核)
图形处理器

(GPU)
视频处理单元

(VPU)
2D 引擎

(RGA)
显示处理单元

(DPU/DC)
系统总线

(AXI/NoC)
DDR 控制器
显示编码器

(Encoder)
系统内存(DDR)
PHY

(物理层)
显示器

图形硬件的组成与形态

图形硬件主要分为两类:固定功能硬件和可编程硬件

基础定义

对比维度 固定功能硬件 Fixed-function 可编程硬件 Programmable
实现技术 硬件电路 Circuit 软件 Software
源码形式 硬件描述语言 HDL 源代码 Source code
交付产物 硅芯片、比特流 Silicon, bitstream 固件二进制文件 Firmware binaries
实现载体 FPGA、ASIC、SoC 硬件模块 DSP、自定义指令集处理器
运算类型 定点运算 Fixed-point 定点 / 浮点运算 Fixed-point, floating point
时钟频率 / 功耗 低 Low 高 High
像素数据存取 队列(FIFO) 内存 Memory
CPU 控制方式 直接寄存器 Direct registers 邮箱通信 Mailbox
芯片面积占用 高 High 低 Low
复用性 低 Low 高 High
典型实例 全志 SoC 显示引擎 Allwinner SoCs Display Engine TI TMS340 系列 DSP

固定功能硬件(Fixed-function)

完全由专用数字电路实现,逻辑硬件固化,无指令集、无需固件;仅通过寄存器配置参数,数据走 FIFO 流水线,执行流程不可修改、功能单一无法扩展。

典型的设备有:显示控制器,图层混合模块,HDMI/MIPI输出、基础2D加速单元

可编程硬件

类专用处理器架构,包含运算核心、缓存、独立指令集,必须加载固件运行,依靠软件算法实现各类渲染、图像处理任务

典型设备:GPU,ISP,通用计算Core

硬件分工

可编程硬件负责生产像素,3D渲染,UI绘制,视频解码,图像特效等,对应到Linux驱动软件的Mesa图形栈

固定功能硬件负责输出像素,图层合成,屏幕时序驱动,外设视频输出等,对应DRM/KMS子系统,适配固定功能显示硬件,仅需简单寄存器配置

参考内容

(99+ 封私信 / 80 条消息) Linux 显示子系统 - 搜索结果 - 知乎

https://zhuanlan.zhihu.com/p/2033298660352585887

相关推荐
凡人叶枫3 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_961875244 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj4 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
森G4 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
阿米亚波4 小时前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
张飞飞飞飞飞4 小时前
Tmux命令使用教程
linux·服务器·ubuntu
Fcy6484 小时前
Linux下 可重入函数、volatile关键字和SIGCHLD信号
linux·可重入函数·volatile关键字·sigchld
qeen875 小时前
【Linux】Linux简单介绍与基本指令(上)
linux·运维·服务器·学习
世微 如初5 小时前
AP5125大功率LED恒流驱动实战:地摊灯项目从原理图到调试笔记
驱动开发·芯片·led电源驱动·降压恒流ic
shelutai5 小时前
UBUNTU 22 下面 用 KVM安装WINDOWS 11
linux·运维·服务器