4.x版本内核中platform_device的生成

2024-08-30 17:32

本文主要是介绍4.x版本内核中platform_device的生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Display Server

X Windows 和 X Server

The X Window System (X11, or shortened to simply X) is a windowing system for bitmap displays, common on UNIX-like computer operating systems. 
X provides the basic framework for a GUI environment: drawing and moving windows on the display device and interacting with a mouse and keyboard. X does not mandate the user interface – this is handled by individual programs. As such, the visual styling of X-based environments varies greatly; different programs may present radically different interfaces

X Windows 是用于位图显示的窗口系统,常用于 UNIX 系的操作系统上。它为 GUI 环境提供了基本框架:在显示设备上绘制和移动窗口,并与鼠标和键盘进行交互。 
它在设计之初,便秉承“提供机制,而非策略”的理念。(是的,和 Unix 设计哲学相同)所以它对用户接口不作要求,比如它提供了生成窗口(window)的方法,却对窗口呈现方式不作任何要求。 
另一个设计特点是它是基于 Client/Server 网络模型。不论本地还是远程应用程序,都统一通过 C/S 模型来运作。

我们看一下 X Windows 的架构图(图来自 imtx.me 作者 TualatriX):

拿一个简单的应用场景举例。点击按钮引发按钮更新动作。 
1. 内核捕获鼠标点击事件并发送给 X server。 
2. X Server 会计算该把这一事件发送给哪个窗口(事实上,窗口位置是由 Compositor 控制的,X Server 并不能够正确的计算 Compositor 做过特效变化之后的按钮的正确位置)。 
3. 应用程序对此事件进行处理(将引发按钮更新动作)。但是,在此之前它得向X Server 发送绘制请求。 
4. X Server 接收到这条绘制请求,然后把它发给视频驱动来渲染。X 还计算了更新区域,并且这条“垃圾信息”发送给了 Compositor。 
5. 这时,Compositor 知道它必须要重新合成屏幕上的一块区域。当然,这还是要向X Server发送绘制请求的。 
6. 开始绘制。但是 X Server 还会去做一些不必要的本职工作(窗口重叠计算、窗口剪裁计算等)。

我们通过一个实例理解了上面的架构图。 
它呈现出了一个缺点: 
X Client – X Server – Compositor 
三者的交互比较耗时,不是很高效。除了交互方面的问题,其实 X Server 还会做一些重复无意义的工作,这里不再赘述。 
有痛点就有解决方案,新一代的 Display Server 呼之欲出。 
接下来 Wayland 诞生了。

Wayland

Wayland is A Simple Display Server。 
它在诞生之初的使命是用于改善 X Server 的不足并取代它。 
但是现在看来它所作的不仅仅是替代 X Window 下的 X Server,也不仅仅是要取代 X Widnow。而是要颠覆 Linux 桌面上的 X Server/X Client 的概念。 
以 Compositor/Client 的结构取而代之。 
同时它复用了所有 Linux 内核图形和 I/O 技术:KMS、GEM、DRM、evdev。

其架构图如下(图来自 imtx.me 作者 TualatriX):

同样是上面那个实例,其流程如下: 
1. 内核捕获鼠标点击事件并发送给Wayland Compositor。 
2. 由于是直接发给Wayland Compositor的,所以Wayland Compositor会正确地计算出按钮的位置。同时它会把这一事件发送给按钮所在的应用程序来处理。 
3. 应用程序直接渲染,无需向Wayland Compositor请求。只需在绘制完成之后向Wayland Compositor发送一条信息表明这块区域被更新了。 
4. Wayland Compositor收到这条信息后,立即重新合成整个桌面。

所以基于 Wayland 的整个任务流程非常简单: 
1. 基于Wayland协议,处理evdev的信息; 
2. 通知Client(即应用程序)对相关事件做出反应(至于应用程序想怎么反应,Compositor不需要过问); 
3. 收到Client的状态更新,重新合成图形或管理新的图形布局。

简单的说,Waylannd 就是一个去除 X Window 中不必要的设计、充分利用现代 Linux 内核图形技术(DRM 子系统中的 KMS、GEM、DRM)的一个显示机制,它的出现是自然而然的,它的使命不是为了消灭X Window,而是将Linux的图形技术发挥至更高的一个境界。传统的X Window(即经典X应用、Gtk 1.x/2.x等旧应用),也会在相当长一段时间内得到继续支持,通过Wayland Client的形式跑在Wayland Compositor上,直到最终升级、取代或被淘汰。

有了以上背景,接下来我们便能更好的理解 DRM Subsystem 了。

二、DRM Subsystem

In computing, the Direct Rendering Manager (DRM), a subsystem of the Linux kernel, interfaces with the GPUs of modern video cards. DRM exposes an API that user-space programs can use to send commands and data to the GPU, and to perform operations such as configuring the mode setting of the display. DRM was first developed as the kernel space component of the X Server’s Direct Rendering Infrastructure,[1] but since then it has been used by other graphic stack alternatives such as Wayland. 
User-space programs can use the DRM API to command the GPU to do hardware-accelerated 3D rendering and video decoding as well as GPGPU computing. 
摘自 wipipedia

DRM,英文全称 Direct Rendering Manager, 即 直接渲染管理器。 
它是为了解决多个程序对 Video Card 资源的协同使用问题而产生的。它向用户空间提供了一组 API,用以访问操纵 GPU。

fbdev

Linux 早在很久以前就已经有一个名为 fbdev 的 API ,用于管理显卡的 framebuffer,但是它不能用于处理 基于视频卡的 GPU 的 3D 加速的需求。 
这些 Video Card 常常需要设置或者管理 卡内存(Video RAM)中的一些命令队列。将命令分配给 GPU,还需要管理 Video RAM 本身的 Buffer 和 Free Space。

在最初的用户空间的程序(比如 X Server)可以直接管理这些资源,但这些程序通常表现的就仿佛他们是唯一去获取这些资源的一样。当有多个程序试图去以自己的方式同时控制 Video Card 资源时,就会崩溃。

DRM

DRM 的诞生就是用来处理多个程序对 Video Card 资源的协同使用问题。 
DRM 获得对 Video Card 的独占访问权限,它负责初始化和维护命令队列、Video RAM 以及其他相关的硬件资源。

要使用 GPU 的程序将请求发送给 DRM,由 DRM 作为仲裁来避免冲突。 
DRM 到现在已经涵盖了以前由用户空间程序处理的很多功能,比如 帧缓存区的管理和模式设置,内存共享对象和内存同步。其中一些拓展具有特定的名称,比如图形执行管理器 GEM 或者内核模式设置 KMS,这些都是属于 DRM 子系统。 
DRM 同时也负责处理 GPUs 切换的问题。

在下一章,我们会开始介绍 Linux 源码中 DRM 的软件架构。





















这篇关于4.x版本内核中platform_device的生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121470

相关文章

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

idea-java序列化serialversionUID自动生成方式

《idea-java序列化serialversionUID自动生成方式》Java的Serializable接口用于实现对象的序列化和反序列化,通过将对象转换为字节流来存储或传输,实现Serializa... 目录简介实现序列化serialVersionUID配置使用总结简介Java.io.Seripyth

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C#自动化生成PowerPoint(PPT)演示文稿

《C#自动化生成PowerPoint(PPT)演示文稿》在当今快节奏的商业环境中,演示文稿是信息传递和沟通的关键工具,下面我们就深入探讨如何利用C#和Spire.Presentationfor.NET... 目录环境准备与Spire.Presentation安装核心操作:添加与编辑幻灯片元素添加幻灯片文本操

Python包管理工具uv下载python版本慢问题解决办法

《Python包管理工具uv下载python版本慢问题解决办法》uv是一个非常快的Python包和项目管理器,用Rust编写,使用热缓存安装Trio的依赖项的速度对比,:本文主要介绍Python包... 目录发现问题对于 MACOS / linux 用户 (zsh/bash):对于 Windows 用户:总

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java使用Swing生成一个最大公约数计算器

《Java使用Swing生成一个最大公约数计算器》这篇文章主要为大家详细介绍了Java使用Swing生成一个最大公约数计算器的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下... 目录第一步:利用欧几里得算法计算最大公约数欧几里得算法的证明情形 1:b=0情形 2:b>0完成相关代码第二步:加