【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

相关推荐
程序员AlbertTu2 小时前
第2章 上手 Linux:环境与文件操作
linux·运维·服务器
☆凡尘清心☆2 小时前
CentOS Stream 9 源码编译搭建 Zabbix7.0.29 完整部署方案(部署成功)
linux·运维·centos
Escalating_xu3 小时前
【Linux】进程间通信:从匿名管道、FIFO 到共享内存、消息队列与信号量
java·linux·面试
予昊3 小时前
Linux 资源控制实战分析:用 LXC 亲手造一个 “迷你虚拟机“
linux·运维·服务器
allforgood3 小时前
管理网络安全
linux
灵晔君3 小时前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
wsad05323 小时前
CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 论坛完整教程
linux·docker·centos·discuz
张宇Joaquin3 小时前
openEuler编译和更换内核的方法
java·linux·服务器
小此方3 小时前
Re:Linux系统篇(五十六)线程篇 · 九:基于阻塞队列的生产者消费者模型与条件变量
linux·运维·服务器
迷途之人不知返4 小时前
自动化工程的构建
linux·自动化