Linux 图形堆栈是如何组织的?

Linux 图形堆栈是如何组织的?

任何人都可以解释一下(希望有图片),linux 图形堆栈是如何组织的?我一直听说 X/GTK/GNOME/KDE 等,但我真的不知道它们实际上做什么以及它们如何彼此交互以及堆栈的其他部分。 Unity 和 Wayland 如何融合?

答案1

X Window 系统使用客户端-服务器架构。 X 服务器在具有显示器(显示器+输入设备)的计算机上运行,​​而 X 客户端可以在任何其他计算机上运行,​​并使用 X 协议连接到 X 服务器(不是直接连接,而是通过使用库,例如Xlib,或更现代的非阻塞事件驱动 XCB)。 X 协议被设计为可扩展的,并且有许多扩展(请参阅 参考资料xdpyinfo(1))。

X 服务器只执行低级操作,例如创建和销毁窗口、执行绘图操作(现在大多数绘图是在客户端上完成并作为图像发送到服务器)、向窗口发送事件……您可以看到有多么少X 服务器通过运行X :1 &(使用其他 X 服务器尚未使用的任何号码)或Xephyr :1 &(Xephyr 运行嵌入在当前 X 服务器上的 X 服务器)然后运行xterm -display :1 &并切换到新的 X 服务器(您可能需要设置 X 授权)来完成使用xauth(1))。

正如您所看到的,X 服务器做的事情很少,它不绘制标题栏,不进行窗口最小化/图标化,不管理窗口放置...当然,您可以手动运行命令来控制窗口放置喜欢xterm -geometry -0-0,但是您通常会有一个特殊的 X 客户端来执行上述操作。这个客户端称为窗口管理器。一次只能有一个窗口管理器处于活动状态。如果您仍然打开了前面命令的裸 X 服务器,您可以尝试在其上运行窗口管理器,例如twm, metacity, kwin, compiz, larswm, pawm, ...

正如我们所说,X 只执行低级操作,并不提供更高级别的概念,如按钮、菜单、工具栏……这些由名为工具包,例如:Xaw、GTK、Qt、FLTK、...

桌面环境是旨在提供统一用户体验的程序集合。因此,桌面环境通常提供面板、应用程序启动器、系统托盘、控制面板、配置基础设施(保存设置的位置)。一些著名的桌面环境有 KDE(使用 Qt 工具包构建)、Gnome(使用 GTK)、Enlightenment(使用自己的工具包库)……

一些现代桌面效果最好使用 3D 硬件来完成。于是出现了一个新的组件,复合经理。 X 扩展(XComposite 扩展)将窗口内容发送到复合管理器。合成管理器将这些内容转换为纹理,并通过 OpenGL 使用 3D 硬件以多种方式合成它们(Alpha 混合、3D 投影等)。

不久前,X 服务器直接与硬件设备通信。该设备处理的很大一部分已转移到操作系统内核:DRI(允许 X 访问 3D 硬件)直接渲染客户端)、evdev(输入设备处理的统一接口)、KMS(将图形模式设置移动到内核)、GEM/TTM(纹理内存管理)。

因此,由于设备处理的复杂性现在主要在 X 之外,因此使用简化的窗口系统进行实验变得更加容易。韦兰是一个基于复合管理器概念的窗口系统,即窗口系统就是复合管理器。 Wayland 利用已从 X 中移出的设备处理并使用 OpenGL 进行渲染。

至于Unity,它是一个桌面环境,旨在拥有适合上网本的用户界面。

答案2

传统堆栈基于 3 个主要组件构建:

  • 处理显示的 X 服务器
  • 窗口管理器将窗口放入框架中,处理最小化窗口等。这是 Unix 中机制与策略分离的一部分
  • 执行有用任务(如显示 stackexchange 网站)的客户端。他们可能直接使用X协议(自杀),使用xlib或xcb(稍微容易一些)或使用GTK+或QT等工具包。

X 架构是网络化的,因此允许客户端位于单独的主机上,然后位于服务器上。

到目前为止,一切都很好。然而那是很久以前的图像。现在处理图形的不再是CPU,而是GPU。人们已经进行了各种尝试将其合并到模型中,并在内核更大程度地发挥作用时进行放置。

首先,对显卡的使用做了一些假设。例如,仅假设屏幕上的渲染。我现在无法在维基百科上找到此信息,但 DRI 1 还假设只有一个应用程序会同时使用 OpenGL(我无法立即引用,但我可以在与 WONTFIX 接近的位置挖掘该错误,并注意等待 DRI 2)。

针对间接渲染(复合 WM 所需)提出了一些临时解决方案:

  • XGL - 支持直接与卡对话的应用程序的早期提议
  • AIGLX - 使用 OpenGL 协议网络属性的公认提议
  • NVidia 专有解决方案

新架构(DRI 2)的工作已经开始。其中包括:

  • 内存处理的内核支持 (GEM/TTM)
  • 内核模式设置(KMS)允许更改内核中的分辨率,从而避免在 X 和控制台之间切换时出现延迟以及其他一些功能(例如,即使 X 正在运行,也会在恐慌时显示消息 - IIRC 计划实施)。

无论如何,正交转移到内核的镓驱动程序的工作已经开始。 Mesa 库最初是在 CPU 上实现 OpenGL,然后开始使用 GPU 加速。它始终与 OpenGL 紧密相关。在OpenGL 3.0中,模型发生了很大的变化,库的重写是不可避免的。然而,他们利用这个机会将代码分成几个层,提取通用代码并提供低级 API,允许在其之上实现各种 3D API - 例如,允许 Wine 提供直接与 Gallium 对话的 DirectX,而不是通过 OpenGL API层(可能没有直接的1-1调用)。


Wayland 是一个认为上述内容有点复杂且太“历史”的项目。 1984 年的设计(尽管经过高度修改和改编)与 21 世纪初期并不相符。据支持者称。

它应该提供更大的灵活性和更好的性能,尽管它仍然缺少一些重要的功能,例如完整的 OpenGL 支持(对某些人来说很重要 - 网络支持)。


有关桌面环境和窗口管理器的更多信息。窗口管理器是一个负责窗口行为的应用程序 - 例如,它负责管理工作区、绘制标题栏(屏幕顶部带有 windows 标题和最小化/最大化/关闭按钮的东西)等。

起初只使用了最小的WM,但后来用户开始想要桌面环境 - 即更多功能的版本,包括菜单启动、桌面背景等。然而,桌面环境的大多数部分不是窗口管理器,尽管它们通常是集成的。

一段时间后,复合 WM 被引入,它使用 OpenGL 和间接渲染来完成工作。它们不仅提供图形效果,还可以更轻松地实现某些辅助功能(例如放大镜)。

答案3

首先,Linux 确实没有图形堆栈。 Linux 没有图形显示功能。

然而,Linux 应用程序可以使用图形显示,并且有许多不同的系统可以执行此操作。最常见的都是构建在 X windows 之上的。

X 是一种网络协议,因为在 X 协议栈的中间,您可以将网络作为标准组件。让我们看一个具体的用例。柏林的一位物理学家希望在瑞士欧洲核子研究中心的一台核粒子对撞机上进行实验。他远程登录并在 CERN 的一台超级计算机阵列上运行数据分析程序,并将结果绘制在屏幕上。

在柏林,物理学家有一个 X 终端设备,运行一些 X 服务器软件,为远程应用程序提供图形显示功能。 X-服务器软件有一个帧缓冲区,可以与特定硬件的特定设备驱动程序进行通信。 X-server 软件使用 X 协议。因此这些层可能是图形设备->设备驱动程序->帧缓冲区->X 服务器->X 协议。

然后,在瑞士,应用程序使用 X 协议连接到显示器,并发送图形显示命令,例如“绘制矩形”或“alpha 混合”。该应用程序可能使用高级图形库,而该库又可能基于较低级别的库。例如,应用程序可以使用 WxWidget 工具包用 Python 编写,该工具包构建在 GTK 之上,GTK 使用名为 Cairo 的库来执行核心图形绘制命令。开罗上面可能也有OPENGL。这些层可能是这样的:WxWidgets->GTK->Cairo->X Toolkit->X 协议。显然,连接事物的是中间的协议,并且由于 Linux 还支持 UNIX 套接字(一种完全内部的数据传输),因此如果您愿意,这两种类型的事物可以在一台机器上运行。

X 指的是协议和架构的任何基础内容,例如运行图形显示、指点设备和键盘的 X 服务器。

GTK 和 QT 是两个通用 GUI 库,支持窗口、对话框、按钮等。

GNOME 和 KDE 是两种桌面环境,它们管理图形桌面上的窗口,提供有用的小程序和按钮栏等东西。它们还允许多个应用程序通过 X 服务器(X 终端设备)进行通信,即使这些应用程序运行在不同的远程计算机上。例如,复制和粘贴是应用程序间通信的一种形式。 GNOME 构建在 GTK 之上。 KDE 构建在 QT 之上。并且可以在 KDE 桌面上运行 GNOME 应用程序或在 GNOME 桌面上运行 KDE 应用程序,因为它们都使用相同的底层 X 协议。

答案4

桌面和某些服务器上的 Linux 仍然是所有 X 和帧缓冲区图形。在 X 窗口下 - 它带有 GTK+ 和 Qt,是的,两者都使用 X 系统,同样有很多桌面环境 - Gnome、KDE ​​使用 X 显示及其 shell 等。

顺便说一句,最近有一个来自 linux conf 的视频 (http://blip.tv/file/4693305/)。来自英特尔的 Keith Packard 谈到了 X 和 GL* 很有趣。

相关内容