
轉(zhuǎn)載自http://tracera.blog.51cto.com/2876016/550730
PS:幾乎每本介紹linux的書都會提及KDE,GNOME,Xwindow這樣的詞,但是,看了這么多書,從沒有真正明白過它們的含義以及相互之間的關(guān)系。今天無意中看到了這篇博文,感覺介紹的很透徹很詳細,分享一下,希望能夠?qū)Υ蠹矣兴鶐椭鷡
linux圖形界面基本知識(完全搞通X xfree86xwindow等之間的關(guān)系)LINUX初學(xué)者經(jīng)常分不清楚linux和X之間,X和Xfree86之間,X和KDE,GNOME等之間是什么關(guān)系。常常混淆或者不清楚這些概念,本文以比較容易理解的方式來解釋X,X11,XFREE86,WM,KDE,GNOME等之間的關(guān)系。一、 linux本身沒有圖形界面。linux只是一個基于命令行的操作系統(tǒng)。linux現(xiàn)有的圖形界面只是linux下應(yīng)用程序的實現(xiàn)。所以linux圖形界面并不是linux的一部分。linux和Xfree的關(guān)系就相當(dāng)于當(dāng)年的DOS和WINDOWS3.0一樣,windows3.0不是獨立的操作系統(tǒng),它只是DOS的擴充,是DOS下的應(yīng)用程序級別的系統(tǒng),不是獨立的操作系統(tǒng),同樣XFree只是linux下的一個應(yīng)用程序而已。不是系統(tǒng)的一部分,但是Xfree的存在可以方便用戶使用電腦。WINDOWS95及以后的版本就不一樣了,他們的圖形界面是操作系統(tǒng)的一部分,圖形界面是在系統(tǒng)內(nèi)核中就實現(xiàn)的,沒有了圖形界面windows就不成為windows了,但linux卻不一樣,沒有圖形界面linux還是linux,很多裝有l(wèi)inux的WEB服務(wù)器根本就不裝X。.這也WINDOWS和linux的重要區(qū)別之一。二、 X是協(xié)議,不是具體的某個軟件。X是協(xié)議,就像HTTP協(xié)議,IP協(xié)議一樣.這個概念很多初學(xué)者甚至學(xué)習(xí)LINUX有一定時間的人都不怎么清楚的,一個基于X的應(yīng)用程序需要運行并顯示內(nèi)容時他就聯(lián)接到X服務(wù)器,開始用X協(xié)議和X服務(wù)器交談。比如一個X應(yīng)用程序要在屏幕上輸出一個圓,那么他就用X協(xié)議對X服務(wù)器說:“喂!我需要在屏幕上畫一個圓?!盭應(yīng)用程序只負責(zé)告訴X服務(wù)器在屏幕的什么地方用什么顏色畫一個多大的圓,而具體的“畫”的動作,比如這個圓是如何生成的,用什么顯卡的驅(qū)動程序去指揮顯卡完成工作等等都是由X服務(wù)器來完成的。X服務(wù)器還負責(zé)捕捉鍵盤和鼠標的動作,假設(shè)X服務(wù)器捕捉到鼠標的左鍵被按下了,他就告訴X應(yīng)用程序:“親愛的應(yīng)用程序先生,我發(fā)現(xiàn)鼠標被按下了,您有什么指示嗎?”如果X應(yīng)用程序被設(shè)計成當(dāng)按下鼠標左鍵后,再在屏幕上畫一個正方形的話,X應(yīng)用程序就對X服務(wù)器說:“請再畫一個正方形”,當(dāng)然他會告訴服務(wù)器在什么地方用什么顏色畫多大的正方形,但不關(guān)心具體怎么畫,因為那是服務(wù)器的事情。那么X協(xié)議是需要具體的軟件來實現(xiàn)的,這就是下面我要講的:三、X和XFree86的關(guān)系.有了協(xié)議就需要具體的軟件來實現(xiàn)這個協(xié)議。就好比我們有了交通法規(guī)就需要交警去根據(jù)法規(guī)維護交通秩序一樣。Xfree86就是這樣一個根據(jù)法規(guī)實現(xiàn)協(xié)議的“交警”。他按照X協(xié)議的規(guī)定來完成X應(yīng)用程序提交的在屏幕上顯示的任務(wù)。當(dāng)然不僅僅是某個特定的交警才可以去維護和實現(xiàn)這個法規(guī),比如還可以由交通協(xié)管員來實現(xiàn)交通法規(guī),必要的時候警察也可以介入,當(dāng)然前提是他們都要懂得交通法規(guī),也就是要懂得協(xié)議.所以實現(xiàn)X協(xié)議的軟件也并不只有 XFree86。XFree86只是實現(xiàn)X協(xié)議的一個免費X服務(wù)器軟件.商業(yè)上常用MOTIF,現(xiàn)在還有XORG,還有很多很小的由愛好者寫的小的X服務(wù)器軟件.甚至可以在WINDOWS上有X服務(wù)器運行,這樣你可以在linux系統(tǒng)上運行一個X應(yīng)用程序然后,在另一臺windows系統(tǒng)上顯示,就是這么神奇.你可以用google找到這樣的X服務(wù)器軟件.只不過在LINUX上最常用的是XFree86.(現(xiàn)在的linux發(fā)行版都用Xorg了)順便說一句,蘋果電腦的圖形界面用的也是X協(xié)議,而且被認為是做的最好的X協(xié)議圖形界面,并且他對X協(xié)議的實施是做在系統(tǒng)內(nèi)核里的,(那么照以前的定義這個系統(tǒng)就是屬于windows的范疇了)所以性能明顯好很多,這就是為什么很多大型三維圖形設(shè)計軟件都是在蘋果平臺上的原因.為了便于理解拿HTTP協(xié)議來比較:協(xié)議是HTTP (hyper text transmission protocol)實 現(xiàn)這個協(xié)議的常用服務(wù)器有:Apache,IIS 等。請求這些服務(wù)器傳輸文件的客戶有:IE ,MOZILLA ,NETSCAPE等.協(xié)議是X實現(xiàn)這個協(xié)議的常用服務(wù)器有Xfree86 ,Xorg ,Xnest等.對應(yīng)Apache,IIS.請求這些服務(wù)器來完成顯示任務(wù)的客戶:所有的X應(yīng)用程序.對應(yīng)IEMOZILIA.例如:fcitx只不過HTTP協(xié)議的服務(wù)器和客戶端通常都在兩臺不同的電腦(服務(wù)器和客戶機)之間來實現(xiàn),所以一般人對這個比較容易理解.而X協(xié)議的服務(wù)器和客戶端程序通常在同一臺電腦上,因此很多用戶都感到對此很難理解.既然是協(xié)議,那么肯定和平臺無關(guān)的,因此可以讓X應(yīng)用程序顯示在任何裝有X服務(wù)器的遠程計算機上.甚至顯示在裝有Xnest服務(wù)器的windows系統(tǒng)上.只不過在大多數(shù)情況下,X應(yīng)用程序都用本機的X服務(wù)器,然后X服務(wù)器將顯示結(jié)果輸出到本機的顯示器上.這也是很多人不理解X是一種協(xié)議的原因.四、 X和X11R6又是什么關(guān)系?不知道初學(xué)者有沒有注意到/usr/X11R6這個目錄,這是XFree的默認安裝目錄。X11R6 實際上是 X Protocol version 11 Release6(X協(xié)議第11版第六次發(fā)行)的意思,就是說目前用的X協(xié)議是第11版的,然后經(jīng)過了6次小的修正.不同版本的X協(xié)議是不能通信的.就像我們現(xiàn)在IPV4和IPV6不能通信一樣,不過不用擔(dān)心,現(xiàn)在的X服務(wù)器軟件和X應(yīng)用程序都遵循X11R6.另外XFree86 3.3.6,XFree86 4.3.6等這些版本是實現(xiàn)X協(xié)議的軟件XFree86的版本號.這是初學(xué)者經(jīng)常搞混淆的概念.協(xié)議版本和實現(xiàn)協(xié)議的軟件的版本,需要我們區(qū)分這兩個概念。五、X服務(wù)器和WM(window manager 窗口管理器)之間是什么關(guān)系.圖形界面是怎么啟動的呢?如果你是一開機就進入圖形界面那就太遺憾了。因為你錯過了了解X服務(wù)器起動過程的好時機.不過沒關(guān)系.你打開 一個XTERM輸入:init 3就可以安全的回到字符界面.等做完以下實驗?zāi)憔屯耆靼譞和 WM(window manager窗口管理器)之間是什么關(guān)系了.先輸入以下命令:#startx啟動圖形界面,你看到的是一個和平時使用完全一樣的完整的圖形界面操作環(huán)境。你可以最大化,最小化,移動,關(guān)閉窗口等.按 ctrl+alt+backspace反回字符界面.輸入:#xinit再次啟動圖形界面,你看到了什么,你看到一個XTERM.而且不能移動.但是你可以在這個XTERM中輸入命令打開X應(yīng)用程序,如果我輸入:#mozilla打開瀏覽 器,你看到的瀏覽器和平時有什么不同嗎?他在屏幕中間,不能移動,不能最小化,不能最大化,沒有邊框.為什么同樣一個X應(yīng)用程序會有這樣的不同呢?因為我們用startx起動圖形界面的時候同時也啟動了一個WM(即窗口管理器),如果你用KDE就起動了KDE,如果你用GNOME就起動了GNOME.但是你用xinit起動圖形界面的時候卻沒有起動WM.現(xiàn)在你明白窗口管理器的作用了嗎?他的作用:就是最大化,最小化,移動,關(guān)閉窗口等.而這些不是X服務(wù)器來負責(zé)完成的.X系統(tǒng)只負責(zé)顯示圖形,并不限制顯示和操作的風(fēng)格,因此不同的X Window的風(fēng)格并不相同。如果你用xinit起動圖形界面并在xterm中輸入twm,看看會有什么?xterm被加上了一個邊框,你可以通過這個邊框移動,最大化,最小化這個xterm,twm就是 XFree86中自帶的窗口管理器,是一個比較簡陋的最簡單的窗口管理器,但是他具有窗口管理器的全部特征.如果你不輸入twm而輸入gnome-session就可以起動GNOME或者輸入startkde起動KDE.通過以上的實驗?zāi)憔涂梢郧宄拿靼?他們之間的關(guān)系.六、關(guān)于KDE和GNOMEKDE 和GNOME是LINUX里最常用的圖形界面操作環(huán)境,他們不僅僅是一個窗口管理器那么簡單。KDE是KDesktop Environment的縮寫.他不僅是一個窗口管理器,還有很多配套的應(yīng)用軟件和方便使用的桌面環(huán)境,比如任務(wù)欄,開始菜單,桌面圖標等等.GNOME 是GNUNetwork Object Model Environment的縮寫.和KDE一樣,也是一個功能強大的操作環(huán)境.另外在其它UNIX系統(tǒng)中,常常使用CDE作為這樣一個操作環(huán)境.其它的小型窗口管理器有:window maker,afterstep,blackbox,fvwm,fvwm2,等等都是常用的優(yōu)秀窗口管理器.REDHAT9中有 window maker但是默認不安裝,大家可以裝來試試.只要xinit再wmaker&就可以用windowmaker了.KDE項目是在1997年由德國自由程序員發(fā)起的,他們采用了挪威TrollTech軟件公司的Qt圖形界面庫作為基礎(chǔ)開發(fā)平臺,C++為主要開發(fā)語言。1999年KDE1.1.2發(fā)行以后,它就成為Linux界“事實”上的桌面標準。然而,因為KDE使用的Qt庫所遵循的軟件版權(quán)協(xié)議QPL并不是真正的自由軟件協(xié)議,這在自由軟件界引起了很大的非議,例如以純自由軟件構(gòu)成的Linux發(fā)行版Debian就拒絕使用KDE。當(dāng)然,最終用戶并不太關(guān)心軟件許可問題,對他們來說KDE易用性和強大的功能是最重要的。因此,KDE還是得到了廣泛的應(yīng)用。為了與KDE相抗衡,世界最大的自由軟件組織GNU(即自由軟件基金會)發(fā)起了GNOME桌面環(huán)境項目。GNOME采取了完全松散的自由軟件開發(fā)模式,整個項目由一系列獨立的軟件組成,每個軟件都由各自獨立的開發(fā)組負責(zé)。這種松散的開發(fā)模式使得GNOME的進展非常緩慢。1999年推出的GNOME1.0與KDE1.1.2相比在各個方面都差很多,直到2000年推出GNOME1.2后才有了很大的進步。然而與即將推出的KDE2.0相比,GNOME在許多方面還非常不完善,例如沒有一個統(tǒng)一的辦公套件,沒有集文件管理器和網(wǎng)絡(luò)瀏覽器等功能于一身的綜合文件管理軟件,另外GNOME還缺乏成熟的電子郵件、個人信息助理等實用工具軟件。而且與KDE相比GNOME的各個組件的集成度還遠遠不夠,不同組件之間的風(fēng)格也有很大差別。不管從哪個方面來看,一切似乎都對KDE有利而對GNOME不利。曾經(jīng)有一段時間,人們都在擔(dān)心GNOME會半路夭折。與KDE不同,GNOME采用了符合GPL自由軟件協(xié)議的GDK、GTK作為其底層開發(fā)平臺,也就是說GNOME是真正意義上的GPL自由軟件,商業(yè)公司無需支付任何費用就可以自由使用它??梢哉f這是商業(yè)公司選擇GNOME而不選KDE的首要因素。當(dāng)然,光有這個理由還不足以服人,要想成為名副其實的桌面環(huán)境標準,在技術(shù)上也必須有過硬表現(xiàn)才行。GNOME在GTK的基礎(chǔ)上擴充了許多額外的功能,開發(fā)了一系列GNOME程序通用的函數(shù)庫和程序,因此具有統(tǒng)一的界面風(fēng)格和使用習(xí)慣。
KDE適應(yīng)用戶使用, GNOME適合開發(fā)。七、Xwindow QT概念X-Window提供了創(chuàng)建圖形界面的基礎(chǔ)。但是它只管在屏幕畫點、畫線、畫框和著色,至于在哪里畫點、畫什么樣的線、畫什么樣的框,以及著什么色,這些要求都是由客戶端程序提交的。一套桌面環(huán)境一般會包括窗口管理器、面板、菜單、桌面背景設(shè)置和一些常用的小程序,負責(zé)為使用者創(chuàng)建一個友好的圖形化操作界面。大多數(shù)Linux發(fā)行版附帶的X-Window都是XFree86。KDE和gnone則是基于Xwindow運行的操作環(huán)境,并且添加了很多其他方便使用的東西。Qt是諾基亞開發(fā)的一個跨平臺的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮?,很容易擴展,并且允許真正地組件編程。自從1996年早些時候,Qt進入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成 功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的Linux桌面環(huán)境KDE的基礎(chǔ)。 基本上,Qt 同 XWindow 上的 Motif,Openwin,GTK 等圖形界面庫和 Windows平臺上的MFC,OWL,VCL,ATL是同類型的東西,但Qt具有優(yōu)良的跨平臺特性、面向?qū)ο蟆⒇S富的API、大量的開發(fā)文檔等優(yōu)點。QT是一個跨平臺的C++ 圖形用戶界面庫,由挪威 TrollTech 公司于1995年底出品。八、linux 圖形界面層次關(guān)系總結(jié)linux本身-->X服務(wù)器<-[通過X協(xié)議交談]->窗口管理器(綜合桌面操作環(huán)境)-->X應(yīng)用程序.Xfree86服務(wù)器的實現(xiàn)包括兩個部分,一部分是和顯卡直接打交道的低層,一部分是和X應(yīng)用程序打交道的上層。上層負責(zé)接收應(yīng)用程序的請求和鼠標鍵盤的動作。而和顯卡直接打交道的底層負責(zé)指揮顯卡生成圖形,其實就是顯卡驅(qū)動。上層接收到應(yīng)用程序的請求后,將請求內(nèi)容做適當(dāng)處理,然后交給顯卡驅(qū)動來 指揮顯卡完成畫圖的動作.另外上層的捕捉鍵盤和鼠標動作的部分會向應(yīng)用程序提供鼠標和鍵盤的狀態(tài)信息,應(yīng)用程序接收到這些信息后決定是否再有相應(yīng)的動作.九、Xfree86服務(wù)的具體介紹平時說的VESA,VGA ,fbdev等其實就是針對不同模式顯卡的驅(qū)動程序.VESA(Video Electronics Standards Association)VGA (Video Graphics Array)fbdev (FrameBuffer Device)等都是不同的顯卡標準,不過這些標準都已經(jīng)很老了.現(xiàn)在的顯卡都兼容這幾種模式.framebuffer模式的顯卡本身不具有任何運算數(shù)據(jù)的能力,他好比是一個暫時存放水的水池.CPU將運算后的結(jié)果放到這個水池,水池再將結(jié)果流到顯示器.中間不會對數(shù)據(jù)做處理.在這中情況下,所有顯示任務(wù)都有CPU完成,CPU負擔(dān)很重.從frambuffer這個名字我們就能猜測到他的功能了(數(shù)據(jù)偵緩沖).在linux內(nèi)核中有有framebuffer機制模仿顯卡的這種功能.他的好處是把顯卡的硬件結(jié)構(gòu)抽象掉,把所有的顯卡都當(dāng)做一個"水池"來用.應(yīng)用程序也可以直接讀取這個水池的內(nèi)容.framebuffer的設(shè)備名是/dev/fb可以用命令:#dd if=/dev/zero of=/dev/fb清空屏幕.如果你的X用的是framebuffer的驅(qū)動,屏幕將全變黑.通過移動鼠標,切換窗口等動作可以讓原先的內(nèi)容重新顯示.如果你不用framebuffer驅(qū)動,可以在字符模式下做這個試驗.屏幕將全部被清空.以 下的命令:#dd if=/dev/fb of=fbfile可以將fb中的內(nèi)容保存下來,以后可以重新寫回屏幕:#dd if=fbfile of=/dev/fb作用類似于屏幕截圖,但是截下的圖不能用普通圖片瀏覽器看.現(xiàn)在知道 linux中framebuffer設(shè)備的神奇了吧.linux字符界面在高分辨率下,啟動時會有一個小企鵝logo,這個logo就是用framebuffer功能寫上屏幕的.VESA和VGA比FB要好很多,但是他的顯示能力也很有限.CPU仍舊要處理大部分的顯示任務(wù).現(xiàn)在的顯卡就不一樣了,CPU幾乎不參數(shù)顯示任務(wù),而專注于運算工作.我們平時在linux下裝顯卡驅(qū)動,其實就是替 換掉XFree86中底層的那 一部分.使他有更強的顯示能力.比如你的顯卡是nvidia的,XFree默認的驅(qū)動是"nv",他是一個nvidia顯卡的通用驅(qū)動,但是他不能發(fā)揮 nvidia顯卡的性能.這個"nv"驅(qū)動模塊可以在:/usr/X11R6/lib/modules/drivers目錄下找到,文件名是:nv_drv.o這個目錄下還有很多顯卡驅(qū)動模塊.apm_drv.o dummy_drv.o nsc_drv.o sis_drv.oark_drv.o fbdev_drv.o nv_drv.o tdfx_drv.oati_drv.o glint_drv.o r128_drv.o tga_drv.oatimisc_drv.o i128_drv.o radeon_drv.o trident_drv.ochips_drv.o i740_drv.o rendition_drv.o tseng_drv.ocirrus_alpine.o i810_drv.o s3_drv.o vesa_drv.ocirrus_drv.o linux s3virge_drv.o vga_drv.ocirrus_laguna.o mga_drv.o savage_drv.ocyrix_drv.o neomagic_drv.o siliconmotion_drv.ofbdev vga evsa 等都在其中.只要在XF86Conf文件中的Sectionmodule段中指定了什么驅(qū)動,X就用哪個驅(qū)動.代碼:Section "Module"Load "dbe"Load "extmod"Load "fbdevhw" #這里用的是fbdevLoad "glx"Load "record"Load "freetype"Load "type1"Load "dri"EndSection這是XFree86 4.0以上版本的方法.即X主程序和驅(qū)動模塊是分開的.主程序是/usr/X11R6/bin/XFree86 (即上層部分)然后主程序啟動的時候根據(jù)配置文件決定用哪一個驅(qū)動.但是,在XFree86以前的版本(3.3.6)中,X主程序和驅(qū)動模塊是合在一起的,因此,以前的Xfree86 3.3.6 有很多針對不同顯卡的版本.另外其他的X服務(wù)器如 KDrive 也是驅(qū)動也主程序整合的,因此同樣是KDrive X服務(wù)器會有VESA,SVGA ,和 fbdev的版本之分.因為這些都是輕量級的X服務(wù)器,為了簡化結(jié)構(gòu)他做成這樣.Xfree86 4.0 做成驅(qū)動和主程序分離的好處是用戶可以自己添加升級驅(qū)動十、ubuntu下這些概念的具體情況Ubuntu本身默認安裝 gnome,可以自己安裝KDE.Ubuntu并沒有采用init的方法,并沒有/etc/inittab這個文件。init使用的是串行的方式,引導(dǎo)很耗時。RedHat9啟動時串行執(zhí)行大量的腳本以啟動各種需要的服務(wù)(啟動時可以看到)。Ubuntu采用了upstart,是一個基于事件的init 的替代程序,用于 Ubuntu 發(fā)行版。所以上步驟5我并沒有自己實際看到運行的。
愛華網(wǎng)

