DRM(Direct Rendering Manager)即直接渲染管理器是Linux内核中负责与显卡交互的管理架构。传统的FB(FrameBuffer)框架有很多的局限性在支持显示覆盖、GPU加速、硬件光标以及多应用访问冲突控制等方面逐渐力不从心。为了解决这些问题DRM应运而生它允许用户空间程序方便地利用其提供的API实现3D渲染、视频解码和GPU计算等工作同时能够有效管理多个程序对显卡资源的协同使用。与传统的FB架构相比DRM具有诸多显著优势多图层合成支持DRM原生支持多图层合成能够实现不同应用界面、菜单层级等的叠加显示而FB架构原生不支持多层合成在处理复杂显示场景时显得力不从心。例如在安卓系统中多个应用程序同时运行时DRM可以将各个应用的界面图层进行合成最终呈现出一个完整的显示画面而FB架构则需要将所有内容绘制到一个单一的帧缓冲中效率低下且难以实现复杂的界面效果。高级功能支持FB架构不支持VSYNC垂直同步、DMA-BUF直接内存访问缓冲区、异步更新和fence机制等高级功能而DRM原生支持这些功能。VSYNC能够确保画面的流畅显示避免出现撕裂现象DMA-BUF可以实现不同进程之间的内存共享提高数据传输效率异步更新和fence机制则能够更好地控制图形渲染的时序提升系统的响应速度。统一管理GPU和Display驱动DRM统一管理GPU和Display驱动使得软件的升级、维护和管理更加方便。在FB架构下GPU和Display驱动的管理相对独立不同厂商的驱动实现方式差异较大给开发者带来了很大的不便。而DRM通过统一的架构和接口将GPU和Display驱动整合在一起降低了开发和维护的成本同时也提高了系统的兼容性和稳定性。DRM显示框架主要分为三个核心部分libdrm接口库、KMSKernel Mode Setting和GEMGraphics Execution Manager。这三个部分相互协作共同完成图形显示的管理和控制工作。libdrm作为用户空间和内核空间之间的桥梁libdrm对底层接口进行封装向上层提供通用的API接口主要是对各种IOCTL接口进行封装便于代码的重用和共享。开发者可以通过libdrm提供的API方便地与DRM内核子系统进行交互实现图形渲染、显示模式设置等操作。KMS即内核模式设置负责设置显卡或者图形适配器的模式主要包括两个方面的工作。一是更新画面包括显示buffer的切换、多图层的合成方式控制以及每个图层的显示位置调整二是设置显示参数如分辨率、刷新率、电源状态休眠唤醒等。KMS通过管理显示设备的资源确保显示画面的正确输出。GEM即图形执行管理器提供内存管理方法主要负责显示buffer的分配和释放。它能够高效地管理GPU内存确保图形数据的存储和访问的高效性。GEM还支持内存的共享和同步使得不同的应用程序和进程可以安全地访问和操作图形数据。DRM的核心对象包括CRTC、Plane、Encoder、Connector和Framebuffer这些对象共同构成了DRM显示框架的基础。CRTCCathode Ray Tube Controller抽象的“扫描时序单元”决定从哪块缓冲读取数据以及以何种时序输出到显示设备。它相当于显示系统的“指挥中心”控制着整个显示过程的时序和节奏。在安卓系统中CRTC负责将合成后的画面数据按照一定的时序发送到显示设备确保画面的稳定显示。Plane硬件叠加平面支持缩放、裁剪、混合、色域转换等功能根据其用途可以分为Primary、Overlay、Cursor等类型。Primary Plane通常用于显示主画面Overlay Plane用于叠加显示其他图层如视频画面、菜单等Cursor Plane则用于显示鼠标光标。通过多个Plane的叠加可以实现复杂的显示效果同时降低GPU的压力。例如在播放视频时视频画面可以通过Overlay Plane进行叠加显示而不需要将视频数据与主画面数据进行合成从而提高显示效率。Encoder负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块如HDMI转换器或DSI ControllerConnector连接外设的接口如eDP、DSI、HDMI、DisplayPort等通过Encoder与CRTC绑定输出。它负责将CRTC输出的信号传输到显示设备是显示系统与外部显示设备之间的桥梁。不同的Connector类型适用于不同的显示设备例如HDMI接口常用于连接电视和显示器DSI接口则广泛应用于移动设备的内置显示屏。Framebufferfb引用一个或多个底层GEM/DMABUF缓冲描述像素格式与尺寸供CRTC/Plane读取。Framebuffer相当于显示数据的“容器”它存储了要显示的图形数据并提供了访问这些数据的接口。在安卓系统中应用程序渲染的画面数据最终会被存储到Framebuffer中然后由CRTC和Plane读取并显示到屏幕上。其他名词说明VBLANK软件和硬件的同步机制RGB时序中的垂直消影区软件通常使用硬件VSYNC来实现property任何你想设置的参数都可以做成property是DRM驱动中最灵活、最方便的Mode setting机制DUMB只支持连续物理内存基于kernel中通用CMA API实现多用于小分辨率简单场景PRIME连续、非连续物理内存都支持基于DMA-BUF机制可以实现buffer共享多用于大内存复杂场景fencebuffer同步机制基于内核dma_fence机制实现用于防止显示内容出现异步问题在安卓系统中DRM是Hardware ComposerHWC实现与显示硬件之间的“内核桥梁”。HWC通常运行在用户态直接或间接通过DRM/KMS与显示控制器打交道完成模式设置、平面叠加、缓冲提交与上屏等操作。安卓应用程序的渲染流程大致如下应用程序将画面渲染到BufferQueue中SurfaceFlinger作为安卓系统的合成服务负责决策哪些层走HWC Overlay、哪些层走GPU合成。HWC实现如HWC2驱动将Overlay层映射到DRM Plane把FramebufferTargetGPU合成结果映射到Primary Plane最终向DRM提交原子事务完成画面的显示。具体的工作步骤初始化阶段当安卓系统启动时DRM驱动会被加载系统会检测到GPU设备并为其创建一个设备文件/dev/dri/cardX。用户空间的应用程序可以通过打开这个设备文件与DRM内核子系统建立连接。同时DRM会初始化KMS和GEM子系统完成显示设备的资源分配和初始化工作。显示模式设置应用程序或系统服务可以通过libdrm提供的API调用KMS的功能设置显示模式包括分辨率、刷新率、色深等参数。KMS会根据设置的参数配置CRTC和Connector确保显示设备能够按照要求输出画面。例如当用户在安卓系统的设置中调整屏幕分辨率时系统会通过DRM的KMS子系统将新的分辨率参数发送到显示设备显示设备会根据这些参数调整其显示模式。图形渲染与缓冲管理应用程序通过OpenGL ES等图形API进行图形渲染渲染结果会被存储到BufferQueue中。SurfaceFlinger会根据画面的复杂度和硬件支持情况决定哪些图层通过HWC进行硬件合成哪些图层通过GPU进行软件合成。对于通过HWC合成的图层HWC会将其映射到DRM Plane对于通过GPU合成的图层合成结果会被存储到FramebufferTarget中然后映射到Primary Plane。在这个过程中GEM子系统负责管理显示buffer的分配和释放确保图形数据的高效存储和访问。原子事务提交当所有的图层都准备好后HWC会将各个Plane的配置信息和Framebuffer的引用信息打包成一个原子事务提交给DRM。DRM的Atomic模式允许一次性提交“整帧”变更避免中间态闪烁确保画面的一致性和稳定性。DRM接收到原子事务后会按照事务中的配置信息控制CRTC从相应的Framebuffer中读取数据并通过Connector将数据输出到显示设备完成画面的显示。