DRM 显示框架 DRM 显示框架 核心组件说明1️⃣ 设备管理层 (drm_drv.c, drm_device.h)● drm_device: 代表一个完整的显卡设备● drm_driver: 定义驱动操作的虚函数表● drm_minor: 管理字符设备节点/dev/dri/card0, /dev/dri/renderD128● 三种设备节点类型:○ Primary: 传统显示输出 (card0)○ Render: 纯渲染节点 (renderD128)○ Compute: 计算加速节点2️⃣ KMS 显示管道 (drm_crtc.c, drm_plane.c, drm_encoder.c, drm_connector.c)典型的显示数据流plaintextPlane(图层) → CRTC(混合时序) → Encoder(编码) → Connector(接口) → Panel/显示器● CRTC (Cathode Ray Tube Controller):○ 负责像素数据的混合和显示时序生成○ 附加显示模式信息分辨率、刷新率● Plane (平面):○ 提供多个图层叠加能力○ 类型Primary(主画面)、Cursor(光标)、Overlay(视频覆盖)● Encoder (编码器):○ 将像素数据转换为特定接口格式○ HDMI、DP、LVDS、eDP 等● Connector (连接器):○ 物理显示接口○ 管理 EDID 读取、热插拔检测4️⃣ 原子操作框架 (drm_atomic.c)● 提供原子性的模式设置Atomic Modesetting● 保证多个显示参数同时更新避免闪烁● 支持异步提交和测试模式5️⃣ 同步机制● VBlank: 垂直消隐中断处理● dma-fence: 硬件操作同步● Sync Object: 用户空间同步原语 代码文件组织plaintextdrm/├── drm/ # DRM 核心实现│ ├── drm_drv.c # 设备驱动管理│ ├── drm_device.c # 设备结构│ ├── drm_file.c # 文件描述符管理│ ├── drm_ioctl.c # ioctl 接口│ ││ ├── drm_crtc.c # CRTC 核心│ ├── drm_plane.c # 平面管理│ ├── drm_encoder.c # 编码器│ ├── drm_connector.c # 连接器│ ├── drm_bridge.c # 桥接芯片│ ├── drm_panel.c # 显示面板│ ││ ├── drm_gem.c # GEM 内存管理│ ├── drm_prime.c # PRIME 缓冲区共享│ ├── drm_buddy.c # Buddy 分配器│ ││ ├── drm_atomic.c # 原子操作│ ├── drm_atomic_helper.c # 原子辅助│ ││ ├── drm_vblank.c # 垂直中断│ ├── drm_syncobj.c # 同步对象│ ││ ├── drm_fb_helper.c # Framebuffer 辅助│ ├── drm_edid.c # EDID 解析│ └── …│├── include/drm/ # 头文件│ ├── drm_device.h│ ├── drm_drv.h│ ├── drm_crtc.h│ ├── drm_gem.h│ └── …│└── drivers/gpu/drm/ # 具体驱动实现├── i915/ # Intel集成显卡├── amdgpu/ # AMD显卡├── nouveau/ # NVIDIA开源├── panfrost/ # Mali Midgard/Bifrost├── msm/ # Qualcomm Adreno└── … 典型工作流程plaintext驱动加载drm_dev_init() → drm_dev_register() → 注册字符设备打开设备open() → drm_stub_open() → driver-open()模式设置 (KMS)获取资源 → 配置 CRTC/Plane → 设置模式 → 页面翻转内存分配 (GEM)gem_create() → gem_mmap() → gem_execbuf()关闭清理drm_dev_unregister() → drm_dev_put() 关键设计特点分层清晰: 核心层→硬件抽象层→具体驱动原子操作: 所有状态变更通过原子事务完成资源管理: 使用引用计数和 DRM-managed 资源扩展性强: 支持多种显示接口和内存后端用户空间接口: 通过 ioctl 提供统一 API这个框架支撑了从嵌入式到桌面级的所有 Linux 图形显示需求