谁能解释(希望有一个图片),Linux图形堆栈是如何组织的?我一直都在听到有关X / GTK / GNOME / KDE等的信息,但是我真的不知道它们实际上在做什么,以及它们如何相互影响以及如何与堆栈的其他部分交互。Unity和Wayland如何配合?
谁能解释(希望有一个图片),Linux图形堆栈是如何组织的?我一直都在听到有关X / GTK / GNOME / KDE等的信息,但是我真的不知道它们实际上在做什么,以及它们如何相互影响以及如何与堆栈的其他部分交互。Unity和Wayland如何配合?
Answers:
X Window系统使用客户端-服务器体系结构。X服务器在具有显示器的计算机(监视器+输入设备)上运行,而X客户端可以在任何其他计算机上运行,并使用X协议(不是直接而是通过使用库,例如Xlib,或更现代的非阻塞事件驱动XCB)。X协议被设计为可扩展的,并且具有许多扩展(请参阅参考资料xdpyinfo(1)
)。
X服务器仅执行低级操作,例如创建和销毁窗口,执行绘图操作(当今大多数绘图是在客户端上完成并作为图像发送到服务器),将事件发送到Windows,...您可以看到很少一个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服务器直接与硬件设备通信。该设备处理的重要部分已转移到OS内核:DRI(允许X 和直接渲染客户端访问3d硬件),evdev(用于输入设备处理的统一接口),KMS(将图形模式设置移动到内核) ,GEM / TTM(纹理内存管理)。
因此,由于设备处理的复杂性现在大多在X之外,因此使用简化的窗口系统进行实验变得更加容易。Wayland是基于复合管理器概念的窗口系统,即,窗口系统是复合管理器。Wayland利用从X移出并使用OpenGL渲染的设备处理功能。
至于Unity,这是一个桌面环境,旨在具有适合上网本的用户界面。
传统堆栈基于3个主要组件构建:
X体系结构成为网络,因此允许客户端位于单独的主机上,然后位于服务器上。
到目前为止,一切都很好。但是,那是过去的印象。如今,处理图形的不是CPU,而是GPU。已经进行了各种尝试将其合并到模型中-并在内核出现时进一步扩展。
首先,已经对图形卡的使用做出了一些假设。例如,仅假定屏幕上的渲染。我现在无法在Wikipedia上找到此信息,但DRI 1还假定只有一个应用程序会同时使用OpenGL(我无法立即引用,但是我可以将其挖到与WONTFIX接近的地方,并附有注释以等待DRI 2)。
已经提出了一些间接渲染的临时解决方案(复合WM需要):
开始在较新的体系结构(DRI 2)上进行工作。其中包括:
已经开始以某种方式正交移至内核,运行Gallium驱动程序。Mesa库开始是在CPU上实现OpenGL,然后开始使用GPU加速。一直对OpenGL严格。在OpenGL 3.0中,模型发生了重大变化,并且不可避免地要重写库。但是,他们利用这个机会将代码分成几层来提取通用代码,并提供了底层API,允许在其之上实现各种3D API-例如,Wine提供DirectX直接与Gallium对话而不是通过OpenGL。 API层(可能没有直接的1-1调用)。
Wayland是一个项目,它认为上述内容有点复杂,而且过于“历史化”。1984年的设计(尽管经过了高度修改和改编)并不符合21 c的开始。根据支持者。
尽管它仍然缺少某些重要功能(例如,完全的OpenGL支持(对于某些情况很重要-网络支持)),但它可以提供更大的灵活性和更好的性能。
有关桌面环境和窗口管理器的更多信息。窗口管理器是负责窗口运行方式的应用程序-例如,它负责管理工作区,绘制标题栏(带有windo标题和最小/最大/关闭按钮的屏幕顶部的东西)等。
首先,仅使用了最少的WM,但随后用户开始需要桌面环境-即功能更强的版本,其中包括菜单启动,桌面背景等。但是,桌面环境的大多数部分虽然经常集成,但却不是窗口管理器。
一段时间后,引入了复合WM,该复合WM使用OpenGL和间接渲染进行工作。它们不仅提供图形效果,还使某些辅助功能(如放大镜)的实现更加容易。
首先,实际上没有Linux图形堆栈。Linux没有图形显示功能。
但是,Linux应用程序可以使用图形显示,并且有许多不同的系统可以执行此操作。最常见的都是建立在X窗口之上的。
X是网络协议,因为在X协议栈的中间,您可以将网络作为标准组件。让我们看一个特定的用例。柏林的一位物理学家希望在瑞士的欧洲核子研究中心(CERN)对其中一种核对撞机进行实验。他远程登录并在CERN的一台超级计算机阵列上运行数据分析程序,并在屏幕上以图形方式显示结果。
在柏林,物理学家有一个运行某些X服务器软件的X终端设备,该软件为远程应用程序提供图形显示功能。X服务器软件具有一个帧缓冲区,该缓冲区与特定硬件的特定设备驱动程序对话。X服务器软件使用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是两个桌面环境,它们管理图形桌面上的窗口,提供有用的applet和诸如按钮栏之类的东西。它们还允许多个应用程序通过X服务器(X终端设备)进行通信,即使这些应用程序在不同的远程计算机上运行也是如此。例如,复制和粘贴是应用程序间通信的一种形式。GNOME建立在GTK之上。KDE建立在QT之上。可以在KDE桌面上运行GNOME应用程序,也可以在GNOME桌面上运行KDE应用程序,因为它们都可以使用相同的基础X协议。
这是它的组织机构,您将从这张图片中从几页文字中了解更多信息:
X11-client
它只是一个斑点,但是该斑点中发生了很多事情。正如其他真棒答案所解释的。