drm分析
drm架構是?主要函數(shù)有哪些?
● DRM(Direct Rendering Manager)是Linux內(nèi)核中負責管理顯卡和GPU的核心子系統(tǒng),支持硬件加速的2D/3D渲染、顯示輸出和內(nèi)存管理。以下是其架構解析和關鍵函數(shù):
- DRM核心架構
graph LR
A[用戶空間] -->|libdrm API| B(DRM Core)
B --> C[DRM Driver]
C --> D[GPU硬件]
C --> E[顯示輸出]
subgraph DRM驅動組件
C --> F[GEM/TTM內(nèi)存管理]
C --> G[渲染引擎]
C --> H[模式設置]
end
核心組件
- DRM Core
- 提供通用API、設備管理、IOCTL接口。
- 處理多進程同步(如drm_file權限管理)。 - KMS(Kernel Mode Setting)
- 控制顯示管線:CRTC(顯示控制器)、Encoder、Connector、Plane。
- 負責分辨率設置、多屏輸出等。 - GEM/TTM內(nèi)存管理
- GPU顯存分配(drm_gem_object)、DMA-BUF共享。 - 渲染加速
- 通過drm_scheduler管理渲染任務提交(如Vulkan/OpenGL驅動)。
- 關鍵數(shù)據(jù)結構
| 結構體 | 作用 |
|---|---|
| struct drm_device | 代表一個GPU設備實例 |
| struct drm_driver | 驅動實現(xiàn)的操作集合 |
| struct drm_connector | 表示物理顯示接口(如HDMI/DP) |
| struct drm_framebuffer | 幀緩沖(包含顯存指針) |
| struct drm_gem_object | GPU顯存對象抽象 |
- 核心函數(shù)
(1) 驅動初始化和設備管理
// 驅動注冊(模塊入口)
int drm_dev_register(struct drm_device *dev, unsigned long flags);
// 設備操作集(需驅動實現(xiàn))
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) 內(nèi)存管理(GEM)
// 顯存對象分配
struct drm_gem_object *rockchip_gem_create_object(...);
// DMA-BUF導出(進程間共享顯存)
int drm_gem_prime_export(struct drm_gem_object *obj, int flags);
(4) 渲染任務提交
// 調(diào)度渲染作業(yè)(如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調(diào)用(如drmModeSetCrtc)。
- Mesa3D:OpenGL/Vulkan驅動通過DRM直接操作GPU。
- Wayland/X11:通過KMS控制顯示輸出。
- 典型調(diào)用流程示例
設置顯示模式:
用戶空間: drmModeSetCrtc(fb_id, crtc_id, ...)
↓
內(nèi)核空間: drm_ioctl(KMS_IOCTL_SET_CRTC)
→ drm_crtc_funcs.set_config()
→ drm_crtc_helper_set_config()
→ 配置CRTC/Encoder/Connector寄存器
調(diào)試工具
- modetest(Libdrm工具):測試顯示模式設置。
- drm_info:查看DRM設備拓撲。
- 內(nèi)核日志:drm.debug=0x0x啟用調(diào)試輸出(如0x1為KMS日志)。
本文來自博客園,作者:瀟汀,轉載請注明原文鏈接:http://www.rzrgm.cn/allalonewithyou/p/19181127,個人郵箱:yaonie4444@foxmail.com

浙公網(wǎng)安備 33010602011771號