drm架构是?主要函数有哪些?
● DRM(Direct Rendering Manager)是Linux内核中负责管理显卡和GPU的核心子系统,支持硬件加速的2D/3D渲染、显示输出和内存管理。以下是其架构解析和关键函数:
- DRM核心架构
graph LR
A[用户空间] -->|libdrm API| B(DRM Core)
B --> C[DRM Driver]
C --> D[GPU硬件]
C --> E[显示输出]
subgraph DRM驱动组件
C --> F[GEM/TTM内存管理]
C --> G[渲染引擎]
C --> H[模式设置]
end
核心组件
- DRM Core
 - 提供通用API、设备管理、IOCTL接口。
 - 处理多进程同步(如drm_file权限管理)。
- KMS(Kernel Mode Setting)
 - 控制显示管线:CRTC(显示控制器)、Encoder、Connector、Plane。
 - 负责分辨率设置、多屏输出等。
- GEM/TTM内存管理
 - GPU显存分配(drm_gem_object)、DMA-BUF共享。
- 渲染加速
 - 通过drm_scheduler管理渲染任务提交(如Vulkan/OpenGL驱动)。
- 关键数据结构
| 结构体 | 作用 | 
|---|---|
| struct drm_device | 代表一个GPU设备实例 | 
| struct drm_driver | 驱动实现的操作集合 | 
| struct drm_connector | 表示物理显示接口(如HDMI/DP) | 
| struct drm_framebuffer | 帧缓冲(包含显存指针) | 
| struct drm_gem_object | GPU显存对象抽象 | 
- 核心函数
(1) 驱动初始化和设备管理
// 驱动注册(模块入口)
int drm_dev_register(struct drm_device *dev, unsigned long flags);
// 设备操作集(需驱动实现)
static const struct drm_driver rockchip_drm_driver = {
.load = rockchip_drm_load,           // 初始化GPU
.unload = rockchip_drm_unload,
.gem_create_object = rockchip_gem_create_object, // 显存分配
.dumb_create = rockchip_gem_dumb_create,         // 用户空间显存映射
.ioctls = rockchip_ioctls,           // 自定义IOCTL
};
(2) 模式设置(KMS)
// CRTC控制(显示控制器)
const struct drm_crtc_funcs rockchip_crtc_funcs = {
.set_config = drm_crtc_helper_set_config,  // 应用显示配置
.page_flip = rockchip_crtc_page_flip,      // 画面翻转
};
// 显示平面操作
const struct drm_plane_funcs rockchip_plane_funcs = {
.update_plane = drm_primary_helper_update_plane,
};
(3) 内存管理(GEM)
// 显存对象分配
struct drm_gem_object *rockchip_gem_create_object(...);
// DMA-BUF导出(进程间共享显存)
int drm_gem_prime_export(struct drm_gem_object *obj, int flags);
(4) 渲染任务提交
// 调度渲染作业(如Vulkan驱动)
drm_sched_entity_init(&entity, DRM_SCHED_PRIORITY_NORMAL, &sched_list);
// GPU指令提交
int rockchip_submit_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
- 用户空间交互
- Libdrm:封装DRM的IOCTL调用(如drmModeSetCrtc)。
- Mesa3D:OpenGL/Vulkan驱动通过DRM直接操作GPU。
- Wayland/X11:通过KMS控制显示输出。
- 典型调用流程示例
设置显示模式:
用户空间: drmModeSetCrtc(fb_id, crtc_id, ...)
↓
内核空间: drm_ioctl(KMS_IOCTL_SET_CRTC)
→ drm_crtc_funcs.set_config()
→ drm_crtc_helper_set_config()
→ 配置CRTC/Encoder/Connector寄存器
调试工具
- modetest(Libdrm工具):测试显示模式设置。
- drm_info:查看DRM设备拓扑。
- 内核日志:drm.debug=0x0x启用调试输出(如0x1为KMS日志)。