1. Framebuffer基础概念解析
在Linux图形显示系统中,Framebuffer(帧缓冲)是最基础的显示抽象层。简单来说,它就是一块内存区域,存储着屏幕上每个像素点的颜色信息。当我们需要在显示器上呈现图像时,显示控制器会从这块内存中读取数据并输出到显示设备。
1.1 Framebuffer的核心组成
一个完整的Framebuffer包含三个关键信息要素:
-
内存区域引用:指向存储像素数据的物理内存(通常是显存)的指针。在DRM子系统中,这部分内存可能通过GEM(Graphics Execution Manager)或TTM(Translation Table Maps)进行管理。
-
像素格式:定义内存中数据如何组织成图像,比如常见的RGB888、ARGB32等格式。这部分内容我们将在第3章详细讨论。
-
活跃区域:指定实际需要显示的内存区域,可能只是整个缓冲区的子集。这在多显示器或部分刷新场景中特别有用。
1.2 内存管理实现方式
不同的硬件平台对Framebuffer的内存管理有不同的实现方式:
c复制// CMA连续内存分配器的典型实现(drivers/gpu/drm/drm_fb_cma_helper.c)
struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
-
CMA(Contiguous Memory Allocator):默认实现方式,保证内存物理连续,适合大多数简单显示控制器。
-
Scatter-Gather:用于支持非连续内存的硬件,如NVIDIA Tegra平台的实现(drivers/gpu/drm/tegra/)。
-
IOMMU:当需要内存虚拟化或安全隔离时使用,如三星Exynos平台的实现(drivers/gpu/drm/exynos/)。
提示:选择内存管理方式时,必须考虑显示控制器的DMA能力。有些控制器只支持连续物理内存访问,而有些则支持Scatter-Gather列表方式访问非连续内存。
2. drm_framebuffer数据结构详解
2.1 核心结构体定义
DRM子系统中的Framebuffer
