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

apo*_*020 33 linux xorg graphics

任何人都可以解释(希望有图片),linux 图形堆栈是如何组织的?我一直听到有关 X/GTK/GNOME/KDE 等的消息,但我真的不知道它们实际做什么以及它们如何相互交互以及如何与堆栈的其他部分交互。Unity 和 Wayland 如何适应?

nin*_*alj 30

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是一个基于复合管理器概念的窗口系统,即窗口系统就是复合管理器。Wayland 利用移出 X 的设备处理并使用 OpenGL 进行渲染。

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


Mac*_*tka 13

传统堆栈建立在 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)。

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


Wayland 是一个项目,它认为上述有点复杂,而且太“历史”了。1984 年的设计(尽管经过高度修改和调整)与 21 c 的开始不相符。根据支持者的说法。

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


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

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

一段时间后,复合 WM 被引入,它使用 OpenGL 和间接渲染来完成它们的工作。它们不仅提供图形效果,而且还允许更容易地实现一些辅助功能(如放大镜)。


Mic*_*lon 9

首先,真的没有Linux图形堆栈。Linux 没有图形显示功能。

但是,Linux 应用程序可以使用图形显示,并且有许多不同的系统可以这样做。最常见的都是建立在 X 窗口之上的。

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

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

然后,在瑞士,该应用程序使用 X 协议连接到显示器并发送图形显示命令,如“绘制矩形”或“alpha 混合”。该应用程序可能使用高级图形库,而该库又可能基于较低级别的库。例如,可以使用 WxWidget 工具包在 Python 中编写应用程序,该工具包构建在 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 协议。

  • 这个答案已经过时了。内核已经参与图形很长时间了。 (7认同)
  • 为了扩展 mattdm 的评论,即使图形由内核树外部的驱动程序驱动,它们仍然使用内核服务来控制对图形资源的访问。内核*总是*位于堆栈的底部。 (5认同)