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

相关文章

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O