本文共4500余字,預(yù)計(jì)閱讀時(shí)間14分鐘,本文同步發(fā)布于知乎(賬號(hào)silaoA)和微信公眾號(hào)平臺(tái)(賬號(hào)偽碼人)。
前面連續(xù)多篇折騰了終端和命令行,本篇先初步了解X,并敬請(qǐng)期待下一篇:在Windows上折騰X。
0x00 前言圖形環(huán)境不是計(jì)算機(jī)系統(tǒng)與生俱來(lái)的,現(xiàn)在習(xí)慣了Windows、Mac OS的用戶,對(duì)于圖形用戶界面(GUI)得心應(yīng)手,然而早期的計(jì)算機(jī)系統(tǒng)只有個(gè)黑框框,僅少數(shù)專業(yè)人員能夠駕馭。一般認(rèn)為,是施樂公司帕洛阿爾托研究中心 (Xerox PARC)在1973年首次研發(fā)出圖形用戶界面,具備了現(xiàn)代圖形環(huán)境基本元素。這個(gè)激動(dòng)人心的發(fā)明,還沒有被施樂公司好好利用起來(lái)掙錢的時(shí)候,很快被蘋果、微軟等多家公司“借鑒”,伴隨著PC發(fā)展,各家GUI系統(tǒng)群雄逐鹿,沒有統(tǒng)一標(biāo)準(zhǔn)。
0x01 X Window System規(guī)范1984年MIT大學(xué)創(chuàng)造了X規(guī)范,就類似TCP/IP協(xié)議棧一樣。本義是在UNIX系統(tǒng)構(gòu)建圖形化視窗系統(tǒng)的設(shè)計(jì)方案,準(zhǔn)確名稱叫“X Window System”,注意拼寫不是“Windows”,與微軟、與Windows沒任何關(guān)系。 X規(guī)范在1987年形成了第11版(Version 11),1994年發(fā)布第11版的第6次發(fā)行(Release 6),確切版本名即為“X11R6”,后來(lái)成為UNIX上圖形視窗系統(tǒng)標(biāo)準(zhǔn)規(guī)范,也簡(jiǎn)稱“X11”或者“X”,目前最新版本是2012年發(fā)布的“X11R7.7”。
X11 圖源:維基百科
“X11”采用了C/S的架構(gòu),在其設(shè)計(jì)下,整個(gè)圖形視窗系統(tǒng)主要分為3個(gè)部分:
- X Server(X服務(wù)器)。X Server一方面負(fù)責(zé)和設(shè)備驅(qū)動(dòng)交互,監(jiān)聽顯示器和鍵盤鼠標(biāo),另一方面響應(yīng)X Client需求傳遞鍵盤、鼠標(biāo)事件、(通過(guò)設(shè)備驅(qū)動(dòng))繪制圖形文字等。反直覺之一,X Server運(yùn)行在本地。
- X Client(X客戶端)。X Client也叫X應(yīng)用程序,負(fù)責(zé)實(shí)現(xiàn)程序邏輯,在收到設(shè)備事件后計(jì)算出繪圖數(shù)據(jù),由于本身沒有繪制能力,只能向X Server發(fā)送繪制請(qǐng)求和繪圖數(shù)據(jù),告訴X Server在哪里繪制一個(gè)什么樣的圖形。X Client可以和X Server在同一個(gè)主機(jī)上,也可以通過(guò)TCP/IP網(wǎng)絡(luò)連接。
- Window Manager(窗口管理器,簡(jiǎn)稱WM),或者叫合成器(Compositor)。多個(gè)X Client向X Server發(fā)送繪制請(qǐng)求時(shí),各X Client程序并不知道彼此的存在,繪制圖形出現(xiàn)重疊、顏色干擾等問題是大概率事件,這就需要一個(gè)管理者統(tǒng)一協(xié)調(diào),即Window Manager,它掌管各X Client的Window(窗口)視覺外觀,如形狀、排列、移動(dòng)、重疊渲染等。反直覺之二,Window Manager并非X Server的一部分,而是一個(gè)特殊的X Client程序。
3個(gè)部分, X Server是整個(gè)X Window System的中心,協(xié)調(diào)X客戶端和窗口管理器的通信。
X11的C/S架構(gòu) 圖源:維基百科
“X11”充分遵循UNIX設(shè)計(jì)哲學(xué),盡可能簡(jiǎn)單,除非必要絕不新增功能,其實(shí)也意味著粗糙、原始;提供機(jī)制而非具體策略,如菜單、按鈕等元素細(xì)節(jié)并不做規(guī)定,交給窗口管理器、客戶端程序等自主實(shí)現(xiàn),于是不同的實(shí)現(xiàn)風(fēng)格各異。任何遵循了X11規(guī)范的客戶端程序和服務(wù)器程序配合起來(lái),即可正常運(yùn)行,X11得益其開放性,迅速發(fā)展,成為UNIX系統(tǒng)的事實(shí)標(biāo)準(zhǔn)。
假定多個(gè)X客戶端程序及窗口管理器在主機(jī)A上,某個(gè)X Server(如下文X.Org Server )運(yùn)行在主機(jī)B上,程序運(yùn)行過(guò)程可簡(jiǎn)化如下過(guò)程。
- 某個(gè)X客戶端進(jìn)程啟動(dòng),向主機(jī)B發(fā)送連接請(qǐng)求,目標(biāo)地址可通過(guò)命令行或配置文件指定,如果給定的地址已有X Server正在監(jiān)聽端口,則進(jìn)行下一步;
- 主機(jī)B上的X Server返回一個(gè)連接正確響應(yīng),X Server也可以配置接受或拒絕某些地址的請(qǐng)求;
- X客戶端向X Server發(fā)送渲染請(qǐng)求及窗口界面數(shù)據(jù);
- X Server一方面將窗口界面數(shù)據(jù)交給顯示驅(qū)動(dòng)計(jì)算渲染緩沖,另一方面綜合各個(gè)X客戶端的渲染請(qǐng)求,計(jì)算更新區(qū)域,但它并不知道如何將多個(gè)窗口“合成到一起”,于是將更新區(qū)域事件發(fā)給窗口管理器;
- 窗口管理器了解到需要在屏幕上重新合成一塊區(qū)域,再向X Server發(fā)送整個(gè)屏幕的繪制請(qǐng)求和數(shù)據(jù);
- X Server將繪圖數(shù)據(jù)交給顯示驅(qū)動(dòng)計(jì)算所有渲染緩沖,并最終繪制圖形;
- 運(yùn)行過(guò)程中,X Server可能收到主機(jī)B上的鼠標(biāo)、鍵盤事件,經(jīng)計(jì)算后,X Server決定發(fā)給哪個(gè)X客戶端(即獲得焦點(diǎn));
- X客戶端收到鼠標(biāo)、鍵盤事件后,回調(diào)事件處理,并計(jì)算界面該如何更新;
- 循環(huán)第3~8,直至X客戶端收到關(guān)閉事件,進(jìn)程終止、連接斷開。
X繪圖過(guò)程示意 以上過(guò)程,主機(jī)A和B的CPU架構(gòu)、操作系統(tǒng)可能都不相同,若A和B是同一個(gè)主機(jī),就相當(dāng)于在本地繪圖、顯示了。
XFree86和X.Org等實(shí)現(xiàn)X11只是規(guī)范,并不是代碼實(shí)現(xiàn)。MIT另外只給了工具包和參考實(shí)現(xiàn),參考實(shí)現(xiàn)的意思是不考慮性能只演示工作原理。
1992年,XFree86 項(xiàng)目順利開展,作為X Window System的一個(gè)早期開源實(shí)現(xiàn),兼容IBM PC機(jī)(XFree86 中86的含義),得到廣泛應(yīng)用,項(xiàng)目地址http://www.。至2004年,由于項(xiàng)目?jī)?nèi)部爭(zhēng)論和許可證分歧,XFree86 從GPL協(xié)議改為XFree86 License發(fā)布,項(xiàng)目從開放走向封閉。
2004年,X.Org基金會(huì)成立,開始領(lǐng)導(dǎo)X項(xiàng)目,不僅推動(dòng)X規(guī)范本身發(fā)展,還在XFree86 4.4 RC2版基礎(chǔ)上開發(fā)了X規(guī)范的另一個(gè)實(shí)現(xiàn)——X.Org Server ,原來(lái)XFree86 上很多開發(fā)者也轉(zhuǎn)向了X.Org Server ,由于更加開放而被多數(shù)GNU/Linux發(fā)行版使用,項(xiàng)目官網(wǎng)https://www.,源代碼庫(kù)地址 http://cgit./xorg/xserver,2019年發(fā)布的穩(wěn)定版為1.20.5。
- 在X Client方面,
X.Org Server 實(shí)現(xiàn)了2個(gè)開發(fā)庫(kù),Xlib 和XCB ,便于開發(fā)者編寫X應(yīng)用程序。
- 在X Server方面,
X.Org Server 實(shí)現(xiàn)了“X Window System”核心規(guī)范及多個(gè)擴(kuò)展組件。
- 在Window Manager方面,
X.Org Server 繼承XFree86 項(xiàng)目的twm 。
- 其他,實(shí)現(xiàn)了一個(gè)X Display Manager(X顯示管理器)——
xdm 。通常透過(guò)字符終端登錄Linux主機(jī)時(shí),用戶僅能獲得字符環(huán)境,而X顯示管理器實(shí)現(xiàn)XDMCP規(guī)范(X Display Manager Control Protocol),為多用戶提供圖形登錄、會(huì)話管理服務(wù),允許用戶登錄時(shí)自主選擇使用哪個(gè)Window Manager等。
除上X Server,X11系統(tǒng)客戶端、窗口管理器也有著很多種實(shí)現(xiàn)。
- 客戶端。
Xlib 及其替代者XCB 開發(fā)庫(kù)過(guò)于靠近底層,于是就出現(xiàn)了進(jìn)一步封裝、抽象級(jí)別更高的GUI庫(kù),如QT、GTK等,比方說(shuō)前者提供繪制點(diǎn)線面的方法,后者提供繪制按鈕、滾動(dòng)條、下拉菜單等控件的方法,更高層次的抽象對(duì)于簡(jiǎn)化開發(fā)工作的重要性不言而喻。在眾多X客戶端程序中,有一個(gè)比較著名——xterm ,它是基于X的終端模擬器,兼容VT102,也是X研發(fā)初期所計(jì)劃的少數(shù)客戶端程序之一。GNU/Linux發(fā)行版中設(shè)備/dev/tty1~tty6對(duì)應(yīng)著6個(gè)全屏純字符的終端模擬器,通過(guò)Ctrl-Alt-F1~F6切換,顯示能力有限;如果運(yùn)行到圖形環(huán)境(通過(guò)Ctrl-Alt-F7切換),一般都集成了xterm ,可配置的特性十分豐富,其他的諸如Gnome Terminal、Konsole、xfce-term等終端模擬器,或基于xterm ,或參考xterm ,增加了更多高級(jí)功能,如tab標(biāo)簽頁(yè)、圖片顯示等。
- 窗口管理器。常見如
Metacity 、Mutter 、KWin 、 vtwm 、Xfwm 、Compiz 等,功能、風(fēng)格各異,有的注重簡(jiǎn)潔高效,有的注重外觀酷炫。
- 服務(wù)器。
X.Org Server 占絕對(duì)統(tǒng)治地位,但也有其他衍生變種或移植,如XQuartz 以及Cygwin/X 、Xming 、WeirdX ,它們所支持的系統(tǒng)平臺(tái)、底層庫(kù)也都不一樣。
需注意的是,X Window System誕生比Linux早,也不是UNIX或Linux內(nèi)核的一部分,而是用戶態(tài)的軟件組件,用戶在系統(tǒng)上可以選擇啟用或禁用X。
桌面環(huán)境X Window System各個(gè)部分都有著多種實(shí)現(xiàn),X規(guī)范本身特別偏底層,加之GNU/Linux自由開放的特點(diǎn),有不少項(xiàng)目在X規(guī)范基礎(chǔ)之上進(jìn)一步封裝,并把上述各組件、圖標(biāo)、主題、及其他特色組件打包在一起,形成開箱即用的桌面環(huán)境(Desktop Environment),常見如Gnome 、KDE 、Unity 、XFCE 、LXDE 等,不一一列舉,每種桌面環(huán)境都有不少用戶群體,所支持的系統(tǒng)平臺(tái)、底層庫(kù)也各不一樣。
另值得一提的是,中國(guó)武漢深之度科技公司基于Debian(早先基于Ubuntu)打造的GNU/Linux發(fā)行版Deepin,擁有自己的桌面環(huán)境DDE ,即Deepin Desktop Environment,Deepin系統(tǒng)在DistroWatch上排名比較靠前,DDE 也同時(shí)支持其他GNU/Linux發(fā)行版。
Deepin桌面環(huán)境 圖源:Deepin官網(wǎng)
應(yīng)用場(chǎng)景X11規(guī)范的模塊化設(shè)計(jì),最大的好處是X Client和X Server相互獨(dú)立,并不需要了解彼此所處的硬件、軟件環(huán)境。常見的X應(yīng)用程序諸如xterm 、輸入法 、Web瀏覽器 、Office套件 等等,部署在一臺(tái)Linux主機(jī)上,如果這個(gè)主機(jī)也同時(shí)部署了X Server,那么運(yùn)行這些X應(yīng)用程序毫無(wú)障礙,這是作為桌面計(jì)算機(jī)的常見應(yīng)用場(chǎng)景。
另一種應(yīng)用場(chǎng)景,Linux主機(jī)通常作為服務(wù)器使用,未配備比較好的圖形顯卡等硬件,也沒有必要部署X Server,從終端登錄到Linux主機(jī)也僅有字符界面,那X應(yīng)用程序該如何運(yùn)行呢?可以在圖形顯卡等硬件設(shè)備比較好的Windows/Mac主機(jī)上部署X Server,保持與Linux主機(jī)網(wǎng)絡(luò)連通,在Linux主機(jī)上寫好配置文件,配置好X Server地址和X11請(qǐng)求轉(zhuǎn)發(fā)(X11 Forwarding),從任意一個(gè)終端登錄到Linux主機(jī)并啟動(dòng)X客戶端應(yīng)用程序,就可以使程序的圖形界面顯示在Windows/Mac主機(jī)上,并與用戶交互。事實(shí)上,在1990年代初期,就有這樣的硬件設(shè)備,稱為“X終端機(jī)(X terminal)”,專門部署X Server,將遠(yuǎn)端UNIX主機(jī)上的圖形界面程序顯示出來(lái),這也正是MIT研發(fā)X的初衷之一。
X 終端機(jī) 圖源:維基百科
從場(chǎng)景描述看出,與常規(guī)Client/Server所不同的是,通常X Server部署在本地用戶主機(jī)上,監(jiān)聽、調(diào)控本地用戶主機(jī)的硬件設(shè)備,而X Client可能部署在遠(yuǎn)端服務(wù)器/嵌入式設(shè)備上,也可能在本地。
0x02 X的競(jìng)爭(zhēng)對(duì)手一方面,X工作在用戶空間,X客戶端程序不能直接訪問顯示驅(qū)動(dòng)、X Server與X客戶端及窗口管理器之間繁瑣的通信流程,拉低了繪圖效率;另一方面,通過(guò)擴(kuò)展、補(bǔ)丁手段允許在本地直接訪問顯示驅(qū)動(dòng),又造成穩(wěn)定性問題。總之,X的設(shè)計(jì)隨著新技術(shù)發(fā)展而顯得臃腫、過(guò)度復(fù)雜,背負(fù)了沉重的歷史包袱。
Wayland2008年,紅帽公司(RedHat)的開發(fā)者Kristian H?gsberg利用業(yè)余時(shí)間搞起了Wayland項(xiàng)目,2010年Wayland加入了Freedesktop.org項(xiàng)目,項(xiàng)目官網(wǎng)為https://wayland.,代碼開源地址https://cgit./wayland/wayland。
Wayland是一個(gè)新的圖形窗口系統(tǒng)方案,一套旨在取代X的新規(guī)范。與X最大的不同是,Wayland將X中的Server和窗口管理器整合到一起作為服務(wù)端,稱為合成器(Compositor),架構(gòu)上只分了客戶端和合成器兩大部件,有沒有覺得終于看著舒服了一些。
- 客戶端(Wayland Client),直接計(jì)算各自界面的渲染緩沖數(shù)據(jù),客戶端程序需要和渲染庫(kù)(如OpenGL)鏈接。
- 合成器(Wayland Compositor),匯總所有客戶端的渲染數(shù)據(jù),實(shí)現(xiàn)各界面窗口“合成”,最后交給顯示驅(qū)動(dòng)繪圖。
Wayland項(xiàng)目提供了兩套底層庫(kù)libwayland-server和libwayland-client,簡(jiǎn)化圖形程序開發(fā),還給了一個(gè)Compositor參考實(shí)現(xiàn)——Weston。
假定多個(gè)Wayland客戶端程序在主機(jī)A上,某個(gè)Wayland Compositor(如Weston)運(yùn)行在主機(jī)B上。
- 某個(gè)客戶端進(jìn)程啟動(dòng),向主機(jī)B發(fā)送連接請(qǐng)求,目標(biāo)地址可通過(guò)命令行或配置文件指定,如果給定的地址已有Compositor正在監(jiān)聽端口,則進(jìn)行下一步;
- 主機(jī)B上的Compositor返回一個(gè)連接正確響應(yīng),Compositor也可以配置接受或拒絕某些地址的請(qǐng)求;
- 客戶端自行生成UI界面和渲染緩沖,不需要向Compositor發(fā)送繪制請(qǐng)求,但需要發(fā)送更新區(qū)域事件,告知渲染緩沖中更新了哪些內(nèi)容;
- Compositor綜合各客戶端的區(qū)域更新事件,重新合成整個(gè)屏幕,并交給顯示驅(qū)動(dòng)繪制圖形;
- 運(yùn)行過(guò)程中,Compositor可能收到主機(jī)B上的鼠標(biāo)、鍵盤事件,經(jīng)計(jì)算后,Compositor決定發(fā)給哪個(gè)客戶端(即獲得焦點(diǎn));
- 客戶端收到鼠標(biāo)、鍵盤事件后,回調(diào)事件處理;
- 循環(huán)第3~6,直至客戶端收到關(guān)閉事件,進(jìn)程終止、連接斷開。
Wayland繪圖過(guò)程示意 Wayland適用于桌面設(shè)備,也適用于移動(dòng)設(shè)備,原來(lái)基于X的GUI庫(kù)、桌面環(huán)境很快適配了對(duì)Wayland的支持,如Qt、Gnome、KDE、Compiz等,Ubuntu更是早在2010年就將Unity切換到適配Wayland。Wayland依賴了較多Linux內(nèi)核技術(shù),不易移植到其他系統(tǒng)平臺(tái)。
XWaylandWayland開發(fā)者在X.Org Server 基礎(chǔ)上打上系列補(bǔ)丁,稱為XWayland ,目的是在Wayland規(guī)范之上搞成新的X Server,在Wayland環(huán)境中運(yùn)行X客戶端程序時(shí),Wayland合成器(如Weston)調(diào)用XWayland進(jìn)行服務(wù),以便在過(guò)渡到Wayland過(guò)程中保持對(duì)X的兼容性。
Mir2013年,Ubuntu背后的開發(fā)商Canonical公司搞出來(lái)Mir項(xiàng)目,計(jì)劃用Mir取代X并兼容X客戶端程序,并且同時(shí)支持桌面設(shè)備和移動(dòng)設(shè)備,統(tǒng)一用戶體驗(yàn)。這種搞分裂的行為招致了批評(píng),萬(wàn)萬(wàn)沒想到的是,2017年Canonical公司又放棄了Mir項(xiàng)目并加大對(duì)Wayland的支持。
其他
- 蘋果公司在MacOS和iOS中,使用Quartz作為自己的圖形窗口系統(tǒng)。
- Android系統(tǒng)上,使用SurfaceFlinger作為自己的圖形窗口系統(tǒng)。
- 歷史上還有一些激進(jìn)的方案,逐漸被淘汰。
0x03 總結(jié)盡管有這樣那樣的問題,X仍然是GNU/Linux、UNIX上的主力,Wayland作為強(qiáng)有力的競(jìng)爭(zhēng)對(duì)手,在遠(yuǎn)程桌面方面亦存在問題,重度依賴Linux內(nèi)核技術(shù)不易移植到其他系統(tǒng)平臺(tái)。在微軟的WSL崛起之時(shí),X的優(yōu)勢(shì)倒可以盡情發(fā)揮出來(lái)。 敬請(qǐng)期待下一篇,在Windows上折騰X。
參考
|