DRM架构介绍(一)

news2025/7/17 10:59:59

1、 DRM简介(Direct Rendering Manager)

传统linux显示设备驱动开发时,通常使用FB驱动架构,随着显卡性能升级:显示覆盖(菜单层级)、GPU加速、硬件光标,传统FB架构无法很好支持,此外,对于多应用的访问冲突也无法很好控制。在这样的背景下,DRM应用而生。

DRM是linux内核中负责与显卡交互的管理架构,用户空间很方便的利用DRM提供的API,实现3D渲染、视频解码和GPU计算等工作。

1.1 DRM发展历史

  • 1999年,Precision Insight公司首次为 XFree86 4.0 Server 开发 DRI 显示框架,用于更好的适配 3DFX 公司显卡,初版DRM代码产出后,接下来的几年时间里,DRM 所支持的显卡列表不断被扩充。

  • 2008年10月,Linux kernel 2.6.27 进行了一次重大的源码重组:DRM 的整套源码被放到了/drivers/gpu/drm/目录下,不同的GPU厂商代码也被放到了各自子目录下。

  • 2014年6月,Atomic API 被添加到Linux 3.16,许多驱动也都转而使用这些新的 API。

  • 2018年,又有10个基于 atomic 框架的 DRM 新增驱动被添加到Linux kernel。

1.2 DRM架构对比FB架构优势

DRM是目前Linux的主流图形显示框架,相比于传统FB架构,DRM允许多个程序同时使用视频硬件资源,管理多个程序的资源请求、访问,综上所述DRM更能适应日益更新的显示硬件,DRM优势主要体现:

  • DRM原生支持多图层合成,FB原生不支持多层合成。

  • FB不支持VSYNC、DMA-BUF、异步更新和fence机制,但DRM原生都支持。

  • DRM统一管理GPU和Display驱动,让软件升级、维护和管理更加方便。

917e0274c21a7d36d69d2a2495b1aa68.png

1.3 DRM图形显示框架

DRM检测到的每个GPU都作为DRM设备,并为之创建一个设备文件/dev/dri/cardX与之连接,从整体架构上来看主要分为3个主要部分:

  • libdrm (接口库)

对底层接口进行封装,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装,便于重用与代码共享。

  • KMS (Kernel Mode Setting)

正常工作时,需要设置显卡或者图形适配器的模式,主要体现在以下两个方面:

更新画面:显示buffer的切换,多图层的合成方式控制,以及每个图层的显示位置。

设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等。

  • GEM (Graphics Execution Manager)

提供内存管理方法,主要负责显示buffer的分配和释放。

f51c2afd260f83da10e3d7eeff85c743.png

图1.1 DRM图形显示框架总览

图片来源:https://en.wikipedia.org/wiki/Direct_Rendering_Manager#/media/File:DRM_architecture.svg

1.4 DRM图形显示框架涉及元素

本章节介绍DRM框架中的一些重点模块的功能与在显示链路中的作用,下图为APP调用DRM到屏幕显示的流程框图。

3d0b13cca16dcc06645d26f50e83e8fc.png

图1.2 DRM图形显示框架框图

下表对DRM中KMS和GEM两个模型的不同组件进行概述性说明,辅以高通平台代码层级的对应关系说明,以加深架构与流程之间的对应联系。

67e5a27e63e43ed1e3b11946f33601fc.png

2 、DRM驱动框架

2.1 DRM驱动对象介绍

DRM内部的Objects是组成DRM框架的核心,下图中蓝色部分为物理硬件的抽象,棕色部分则为软件的抽象,其中GEM结构体为:drm_gem_object,其余部分位于结构体drm_mode_object中.

PS:drm_panel不属于object范畴,只是为了降低LCD驱动与encoder驱动间的耦合,是一堆回调函数集合。

0d0873815f03479f2a11b83de3cd3f9e.png

图2.1 DRM核心组件介绍

2.2 DRM抽象硬件如何关联DRM Object

DRM的objects并不难理解,重要的是如何将实际的硬件与这些object进行关联,下面会以MIPI DSI接口为例进行介绍软件架构与DRM object的对应关系。

5a4a48de8293dc6a970295038bdd55ea.png

图2.2 典型MIPI DSI接口硬件连接图

af6cc2c905ab276a26ab178c5fa1ca9b.png

图2.3 硬件与DRM Objects对应图

其中组件说明:

6278fb51d24e80d445767dae71e9bd07.png

3 、DRM简单示例

DRM代码非常庞大,显卡逻辑也非常复杂,在学习DRM架构时,需要通过实践对DRM的流程进行理解,以达到事半功倍的效果。

下面会以模式设置案例,对DRM架构的流程进行解析。modeset主要流程如下:

31c3601f30bde81bc617d21c32fc8b2a.png

图3.1 DRM Modeset流程总览

3.1 打开DRM设备文件

DRM框架成功加载后,会创建一个设备文件/dev/dri/card0,上层用户应用可以通过该文件节点,获取显卡的各种操作。

288dc23caafe67a9ad6e1cf342b97e43.png

3.2 获取显卡资源句柄

打开DRM设备文件后,通过以下函数获取显卡的资源句柄,进而进行显卡资源的操作。

bde827b8c846f3e4078a5f3c4a79fd45.png

3.3 获取connectorId

获取了drmModeRes后,获取它的连接对象。

f635338749315ad42a9a83a1e9e7c08c.png

3.4 创建FrameBuffer

创建FrameBuffer后,然后映射一片内存,对这块内存进行像素数据填充。

e8805bc2cff6f753c19967570493d25b.png

3.5 设置Crtc模式

FB创建成功并进行清0操作,可以在里面填充任何数据,然后设置CRTC后,FB的内容就可以显示在屏幕。

CRTC模式设置函数:drmModeSetCrtc(),参数为:fd、crtc句柄、FB句柄、X\Y坐标等。

8e6d7f0419c5559eb7cf3a5f31fb8dee.png

3.6 资源清理工作(非必需)

显示完成后,GUI会一直运行,一般不必实施资源清理工作。

37e51d3cf59bd9779681b4242841d80e.png

本章小结

本文介绍了DRM架构的发展历史、驱动框架以及简单示例,旨在帮助读者了解DRM架构的形成、功能流程实现,DRM代码庞大且复杂,想要深入理解它的内涵,最好的办法就是根据实际需求来进行代码流程梳理,后续章节也会对该部分进行展开讲解。

此外,DRM架构符合功能日益强大的现代显示设备,但仍有很多老的设备以及软件需要FB支持,在目前DRM框架中,会存在模拟FB设备的代码,参见drivers/gpu/drm/xxx/drv.c文件,会在设备目录下出现:/dev/fb0 。

Reference

1.https://www.kernel.org/doc/html/latest/gpu/index.html 

Linux GPU Driver Developer’s Guide

2. https://www.kernel.org/doc/html/latest/gpu/drm-kms.html#kms-properties     

Kernel Mode Setting (KMS)

d9815bbd5f6b15dada11f8635d39855c.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章 | 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

activiti-bpmn-converter

activiti-bpmn-converter目录概述需求:设计思路实现思路分析1.BpmnXMLConstants2.BpmnXMLConverter3.StartEventXMLConverter4.EndEventXMLConverter参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full bu…

C++调用OpenCV实现图像平滑处理

1 前言 图像的平滑处理,也叫做模糊处理,是在尽量保留原始图像信息的情况下,抑制或去除图像内的噪声、降低细节层次信息等一系列过程。是一种操作简单但使用频率很高的图像处理方法。由于实际的图像索引方式,与我们常用的x和y轴的…

2022年 SecXOps 安全智能分析技术白皮书 学习笔记 免费下载地址

核心能力 为了加快安全分析能力更全面、更深入的自动化 ,SecXOps 的目标在于创建一个集成的用于 Security 的 XOps 实践,提升安全分析的场景覆盖率和运营效率。SecXOps 技术并不 015 SecXOps 技术体系 是 Ops 技术在安全领域的简单加和,SecXO…

postman拦截浏览器请求

postman可以去浏览器请求进行拦截,并将请求存放至集合。 原理 postman内部有捕获http请求流量的代理; postman app 监听这客户端程序或者设备发出的调用请求;postman 代理端会捕获到请求并把它转发到服务器;服务器将响应返回给p…

双非大学改考408,软件工程专业考研报考人数较少!

南昌航空大学是一所双非大学,位于江西省南昌市。南昌航空大学计算机学科评估没有,软件工程学科评估C,计算机实力在双非大学中也并不算强。南昌航空大学今年计算机考研大变化,软件学院的所有专业(包括:软件工…

虚拟化性能优化系列-numatune

numatune是什么 numatune是libvirt的一个参数&#xff0c;可以用在numa架构的host上&#xff0c;以控制子机的内存访问策略。 使用方法如下&#xff0c;参考libvirt文档 <domain> ... <numatune> <memory mode"strict" nodeset"1-4,^3"/&…

多线程(1)

多线程 前言 &#xff1a; 上文主要了解到了进程&#xff0c; 那么为啥需要引入进程呢&#xff1f;   或者说为啥要有进程呢&#xff1f; 其实这里最主要的目的是为了解决 并发编程 这样的问题。 了解 &#xff1a;   这里 cpu 进入了多核心的时代&#xff0c;想要进一步提…

解决:给 VSCode 手动添加(解压压缩包)相关插件的问题

1、一般的添加方式为&#xff1a; 在 VSCode 里面扩展程序里面直接搜索添加即可&#xff1b; 2、如何手动添加一个 VSCode 相关插件&#xff1f; 其一、首先把相关文件解压&#xff0c;解压成一个文件夹&#xff1b; 其二、找到 VSCode 的 extensions 的地址并把 A 所述文件…

【Java 设计模式】创建者模式 之抽象工厂模式

抽象工厂模式1 概念2 角色3 甜品店案例3.1 类图3.2 实现4 优缺点1 概念 产品族&#xff1a;华为既有华为手机&#xff0c;也有华为电脑、华为平板&#xff0c;华为手机、华为电脑和华为平板属于一个产品族&#xff0c;因为他们都是华为品牌。产品等级&#xff1a;有华为手机&am…

骁龙咣咣咣三脚,再次改写格局

鱼羊 萧箫 发自 凹非寺量子位 | 公众号 QbitAI盆友们&#xff0c;骁龙&#xff0c;已经不再是以前那个骁龙了。就在大家吃瓜安卓新旗舰芯片谁家首发之际&#xff0c;骁龙峰会的绝对主角&#xff0c;却只差没把“时代变了”写在脸上&#xff1a;先是第一天直接挤爆AI牙膏管&…

创建Struts2项目并实现一个例子

文章目录一、创建Struts2项目二、struts2的一个例子一、创建Struts2项目 本人所用idea应用程序。以下全部内容&#xff0c;都是以idea为例 创建项目前&#xff0c;你需要下载Struts2所需要的jar包&#xff0c;你可以直接去官网下载&#xff0c;也可以点击https://pan.baidu.c…

LeetCode - 1419 数青蛙

题目来源 1419. 数青蛙 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串 croakOfFrogs&#xff0c;它表示不同青蛙发出的蛙鸣声&#xff08;字符串 "croak" &#xff09;的组合。由于同一时间可以有多只青蛙呱呱作响&#xff0c;所以 croakOfFrog…

基于蜻蜓优化算法的认知无线电网络的服务质量研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

葡萄糖-聚乙二醇-牛血清白蛋白,BSA-PEG-Glucose,牛血清白蛋白-PEG-葡萄糖

葡萄糖-聚乙二醇-牛血清白蛋白,BSA-PEG-Glucose,牛血清白蛋白-PEG-葡萄糖 牛血清白蛋白&#xff08;BSA&#xff09;&#xff0c;是牛血清中的一种球蛋白&#xff0c;包含607个氨基酸残基&#xff0c;分子量为66.446KDa&#xff0c;可以提供PEG接枝修饰葡萄糖&#xff0c;葡萄…

独家 | 人工智能的记忆与泛化(附链接)

作者&#xff1a;Manuel Brenner 翻译&#xff1a;陈之炎校对&#xff1a;赵茹萱本文约4500字&#xff0c;建议阅读8分钟本文为你介绍了人工智能 记忆与泛化相关知识。标签&#xff1a;人工智能&#xff0c;记忆&#xff0c;泛化“对不可见数据的泛化能力是机器学习的核心。”当…

测试用例设计方法之场景设计法

基本流&#xff1a;采用直黑线表示&#xff0c;是经过用例的最简单的路径&#xff08;无任何差错&#xff0c;程序从开始直接执行到结束&#xff09; 备选流&#xff1a;采用不同颜色表示&#xff0c;一个备选流可能从基本流开始&#xff0c;在某个特定条件下执行&#xff0c;…

声明变量let和const

1.let的声明 JavaScript中用var关键字来声明变量&#xff0c;而在ES6中&#xff0c;还可以使用新增的let的关键字来声明变量。与var不同的是let声明的变量只能在代码块中有效。 {let a5;var b6;console.log(a);console.log(b);} 执行结果&#xff1a; 能正常输出&#xff0c;…

178:vue+openlayers 加载多种形式Esri地图

第178个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中绘制自定义图形,利用Geojson的writeFeatures,来生成geojson格式的数据,然后使用file-saver来导出geojson。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetM…

【论文阅读】半监督时序动作检测 Semi-Supervised Action Detection

文章目录1. Learning Temporal Action Proposals With Fewer Labels (ICCV 2019)论文目的——拟解决问题贡献——创新实现流程详细方法2. Self-Supervised Learning for Semi-Supervised Temporal Action Proposal (CVPR 2021)论文目的——拟解决问题贡献——创新实现流程详细方…

微服务之间,最佳的调用方式是什么?

在微服务架构中&#xff0c;需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式&#xff0c;一种是RPC方式&#xff0c;另一种是事件驱动&#xff08;Event-driven&#xff09;方式&#xff0c;也就是发消息方式。消…