Linux 图形子系统

本文转发自:Linux 图形子系统

这是Linux图形子系统系列的第一篇文章。由于笔者最近也在研究Linux图形栈,发现作者“码思图远”的这个系列文章非常不错,对于研究学习Linux图形相关知识,如libdrm、DRM、X11、Wayland等以及总体把握非常有帮助。因此笔者经过稍加修改、修饰、完善,转发到自己的图形相关主题的文章中(再次强调一下,成为博客专家后,笔者不再轻易转发文章了,能让笔者进行转发的,必定是笔者所认为的精华、精粹文章)。下边开始是正文。

Linux的图形子系统是Linux的一个关键组成部分,负责管理和控制图形显示设备,以在屏幕上呈现图像和图形用户界面(GUI)。

1. 基本概念介绍

1.1 GUI 介绍

Linux GUI(Graphical user interface)是一种用于计算机用户与操作系统或应用程序进行交互的方式。它通过图形元素(如窗口、按钮、菜单、图标等)以及鼠标、键盘等输入设备,使用户能够直观地操作计算机系统,而不必记住复杂的命令或编程语法。GUI的设计目标是提供用户友好、可视化的界面,以提高用户体验和效率。可以查看下图(来自维基百科):

图1.1 GUI人机交互界面

在图中,最左端Human作为人脑控制,人的输入输出;中间Hardware作为机器的硬件,比如显示器、音响话筒、手柄、键盘、遥感、mic等等;最右端Software,软件处理。

1.2 Windowing system

Windowing system(或窗口系统)是计算机图形用户界面(GUI)的一个核心组成部分,它负责管理和组织屏幕上的图形元素、窗口以及用户与这些元素的交互。窗口系统提供了一个框架,允许多个应用程序在屏幕上并行运行,并让用户能够以直观的方式与这些应用程序交互。

常见的窗口系统包括:

  • X Window System(X11/X.Org):X Window System是最广泛使用的窗口系统,用于许多Unix和Linux系统。它提供了基本的窗口管理和图形显示功能,但通常需要与窗口管理器一起使用,如GNOME、KDE等。

  • Wayland:Wayland是X Window System的替代品,旨在提供更现代、更安全的窗口系统。它更紧密地集成了窗口管理和图形显示功能。

  • Microsoft Windows:Windows操作系统拥有自己的窗口系统,提供了丰富的用户界面和应用程序支持。

  • macOS:苹果的macOS操作系统使用Quartz Compositor作为其窗口系统,提供了流畅的用户体验和视觉效果。

1.2.1 X11

X11,也称为X Window System,是一种用于Unix和类Unix操作系统的窗口系统和图形用户界面(GUI)协议。它是最早的和最广泛使用的窗口系统之一,为多个Unix和Linux发行版提供了图形显示和窗口管理的功能。

历史

X11最早于1987年发布,是X Window System的第11个版本,前面的版本是为了支持不同的计算机平台和图形硬件而发布的。X11最初由麻省理工学院(MIT)开发,后来由X.Org基金会维护和推动。它是自由开源软件,因此被广泛用于开放源码Unix系统和Linux发行版。

分布式架构

X11采用了分布式架构,它包括X客户端和X服务器两部分。X客户端负责图形界面的创建和交互,而X服务器则负责管理显示和用户输入设备。这种分离的架构使X11更加灵活,可以在不同的硬件和操作系统上运行。

在图例中,X服务器从键盘、鼠标获取输入信息,之后将输入反馈显示于屏幕,而网页浏览器及终端模拟器则在客户端的本机系统上运行。此外客户端也通过网络与远程的机器、服务器保持联系,以保消息状态的更新。如此的机制及架构能使远程运行的软件如同在本机端运行一样。

1.2.2 Wayland

Wayland是一个通信协议,规定了显示服务器与其客户机之间的通信方式,而使用这个协议的显示服务器称为Wayland Compositor。它由Kristian Høgsberg于2008年发起,目标是用更简单的现代化视窗系统取代X Window System。Wayland协议的参考实现称为Weston,由Wayland项目组使用C语言开发。

Wayland与X Window System的最大不同在于,它规定由客户机自身负责窗口边框和装饰的绘制,并且客户机能够通过EGL以及一些Wayland特定的EGL扩展组件直接在显示存储器中自行绘制自己的缓冲器。

窗口管理器简化成显示管理服务,专门负责自行绘制那些屏幕上的程序。这比X Window System中的窗口管理器要更简单、高效。

根据上图看到相关步骤:

(1)Linux 内核的 evdev 模块接收到一个事件并将其发送给 Wayland 合成器;

(2)Wayland合成器将此事件转发给客户端;

(3)与 X 案例类似,当客户端接收到事件时,它会相应地更新用户界面。但在 Wayland 案例中,渲染发生在客户端中,客户端只需向合成器发送请求,指示已更新的区域;

(4)Wayland 合成器从其客户端收集损坏请求,然后重新合成屏幕。然后,合成器可以直接发出 ioctl 命令以计划与 KMS 的页面翻转。

整体来说Wayland协议相比X11性能更好,效率高,安全性更加高,虽然如今还有使用X11,相信以后越来越多Wayland支持。

1.3 3D渲染、硬件加速和OpenGL

  • 3D渲染

    • 在Linux图形子系统中,3D渲染涉及创建和呈现三维图形场景,通常由专门的图形应用程序或游戏引擎处理。这包括创建和操作三维模型、应用光照效果、执行像素着色、进行纹理映射等操作,以在屏幕上呈现逼真的三维图像。

    • 3D渲染在Linux系统中通常依赖于OpenGL或Vulkan等图形API。这些API提供了一套函数和工具,使开发人员能够轻松地进行3D渲染操作,而不必直接操作硬件。

  • 硬件加速

    • 硬件加速在Linux图形子系统中是至关重要的,它通过利用GPU(图形处理单元)的计算能力来加速图形渲染任务。GPU是专门设计用于高性能图形处理的硬件,具有大量的并行处理核心。

    • 在Linux中,硬件加速可用于2D图形加速、3D渲染、视频解码和其他图形相关任务。硬件加速能够显著提高图形性能,降低CPU负载,并支持流畅的图形用户界面和高性能图形应用程序。

  • OpenGL(Open Graphics Library)

    • OpenGL是一个跨平台的图形渲染API,用于实现高性能的2D和3D图形渲染。它提供了一组函数和工具,允许开发人员创建复杂的图形应用程序、游戏和可视化应用。

    • 在Linux图形子系统中,OpenGL起到了关键作用,因为它提供了访问硬件加速图形渲染的标准接口。许多Linux发行版都集成了OpenGL库,并且支持OpenGL API,以便开发人员可以利用GPU进行图形加速。

2.软件框架

Linux 图形显示软件框架如图2.1所示:

图2.1 Linux 图形显示框架

从图中可以看到,从底部至上依次是:

硬件层(Hardware Layer):这是最底层的层次,包括图形硬件设备,如显卡、显示器、输入设备(键盘、鼠标、触摸屏等)以及与之相关的驱动程序。

内核层(Kernel Layer):内核层包括Linux内核中的图形子系统,它负责硬件通信、设备管理和图形渲染。在这一层中,有一些关键组件如Direct Rendering Manager (DRM)、Framebuffer驱动、输入设备驱动等。

显示服务器(Display Server):显示服务器是位于用户空间的程序,它负责管理图形硬件并处理图形显示和窗口管理。两个常见的显示服务器是Xorg(X Window System)和Wayland。接收来自应用程序和GUI工具包的请求,并将其翻译为图形输出。

窗口管理器(Windows Manager):窗口管理器是一个负责窗口布局、移动、最小化、最大化、关闭等窗口管理任务的组件。它通常与显示服务器协作,确保图形应用程序的窗口能够正确显示在屏幕上,并与用户进行交互。

GUI工具包(GUI Toolkits):GUI工具包是一组库和工具,用于创建图形用户界面(GUI)应用程序。它们提供了一种抽象的方式来创建窗口、按钮、文本框等GUI元素,并处理用户输入事件。常见的GUI工具包包括GTK(GIMP Toolkit)、Qt、FLTK、Microwindows等等。

桌面环境 (Desktop Environment):桌面环境是一个集成的用户界面,提供了任务栏、启动器、文件管理器等功能。它通常构建在GUI工具包之上,并为用户提供一致的桌面体验。常见的桌面环境包括GNOME、KDE、XFCE、CDE等。

用户层 (User Layer):用户层是用户与操作系统和应用程序互动的地方。在这一层,用户可以运行应用程序、操作文件、浏览网页等。

在图2.1中没有将硬件、内核等相关进行一些详细的说明,对图形的3D渲染、硬件加速没有相关内容。如果是对做驱动相关的工作,对于内核与hardware也是比较关心的部分。这一部分如图2.2所示:

图2.2 DRI的一种体系结构

自顶向下依次为:

3D-game engine 和 Applications Toolkits:这两个部分代表了图形应用程序,如3D游戏引擎和GUI工具包。它们是最终的用户应用程序,使用图形堆栈提供的功能来创建图形界面和图像渲染。

Display server:显示服务器是图形堆栈的一部分,负责管理图形硬件、窗口管理和用户界面呈现。在这个示意图中,显示服务器包含两个部分,一个是Wayland compositor,另一个是X服务器(X-server)。这些组件接收来自应用程序和GUI工具包的请求,并将图形输出呈现在屏幕上。

libGL:libGL是OpenGL的用户态库,它提供了OpenGL图形库的API,使应用程序能够进行3D图形渲染。应用程序可以通过libGL与图形堆栈进行通信,以执行3D图形操作。

libDRM:libDRM是Direct Rendering Manager的用户态库,它提供了与DRM子系统通信的API。应用程序可以使用libDRM与内核中的DRM子系统进行交互,以管理图形硬件和执行低级别的图形操作。

DRM:DRM代表Direct Rendering Manager,是Linux内核中的图形子系统。它负责管理图形硬件、内核模式设置(KMS)、显卡驱动程序等。DRM允许用户空间应用程序通过libDRM与内核进行通信,并控制图形硬件。

blob:blob通常指的是二进制驱动程序(Binary Driver),这是一种闭源的显卡驱动程序,通常由硬件制造商提供。这些驱动程序包含硬件的底层控制代码,用于提供高性能的图形支持。在某些情况下,开源显卡驱动程序可能不足以支持某些高级功能,因此硬件制造商提供了二进制驱动程序。

KMS:KMS代表内核模式设置(Kernel Mode Setting),它是DRM的一部分,用于在内核中管理显示器和显示模式。KMS允许内核负责设置和切换显示模式,以及管理显示器输出。从图中可以发现Display server可以与KMS进行通信,以获取有关显示硬件的信息,并将图形输出渲染到屏幕上。

这个体系结构示意图展示了Linux图形堆栈中的关键组件,以及它们之间的通信和协作方式。它说明了应用程序如何与显示服务器、图形库和内核进行交互,以实现图形渲染和用户界面呈现。不同的组件在图形堆栈中扮演不同的角色,共同实现了Linux系统中的图形功能。

3.总结

本文大概介绍了图形子系统,对软件框架也介绍了大部分模块,但是对于图形的3D渲染、render过程后续介绍,还有内核中的DRM/KMS会重点介绍,这个部分对于Linux 显示屏驱动将有很大关系。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/132965095