linux圖形界面基本知識(ZZ)

導讀:
  (人不要臉,天下無敵), 信區: GNULinux
標 題: linux圖形界面基本知識(ZZ)
發信站: 飲水思源 (2007年10月10日21:02:03 星期三), 站內信件
原來的標題叫“linux圖形界面編程基本知識”,不過我覺得叫”linux圖形界面基本知識
“可能更合適
作者:GuCuiwen email:[email protected]
很多LINUX初學者分不清楚linux和X之間,X和Xfree86之間,X和KDE,GNOME等之間是什
麼關係.常常混淆概念,我想以比較易於理解的方式說明一下X,X11,XFREE,WM,KDE,GNOME
等之間的關係.由於本人水平有限可能存在錯誤,請高手指正.
一,linux本身沒有圖形界面,linux現在的圖形界面的實現只是linux下的應用程序實現的
.
圖形界面並不是linux的一部分,linux只是一個基於命令行的操作系統,linux和Xfree的
關係就相當於當年的DOS和 WINDOWS3.0一樣,windows3.0不是獨立的操作系統,它只是DOS
的擴充,是DOS下的應用程序級別的系統,不是獨立的操作系統,同樣 XFree只是linux下的
一個應用程序而已.不是系統的一部分,但是X的存在可以方便用戶使用電腦.WINDOWS95及
以後的版本就不一樣了,他們的圖形界面是操作系統的一部分,圖形界面在系統內核中就
實現了,沒有了圖形界面windows就不成爲windows了,但linux卻不一樣,沒有圖形界面lin
ux還是linux,很多裝linux的WEB服務器就根本不裝X服務器.這也WINDOWS和linux的重要
區別之一.
二,X是協議,不是具體的某個軟件:
X 是協議,就像HTTP協議,IP協議一樣.這個概念很多初學者甚至學習LINUX有一定時間的
人都混淆,一個基於X的應用程序需要運行並顯示內容時他就聯接到X服務器,開始用X協議
和服務器交談.比如一個X應用程序要在屏幕上輸出一個圓那麼他就用X協議對X服務器說:
喂!我需要在屏幕上畫一個圓.X應用程序只負責告訴X服務器在屏幕的什麼地方用什麼顏
色畫一個多大的圓,而具體的"畫"的動作,比如這個圓如何生成,用什麼顯卡的驅動程序去
指揮顯卡完成等等工作是由X服務器來完成的.X服務器還負責捕捉鍵盤和鼠標的動作,假
設X服務器捕捉到鼠標的左鍵被按下了,他就告訴X應用程序:親愛的應用程序先生,我發現
鼠標被按下了,您有什麼指示嗎?如果X應用程序被設計成當按下鼠標左健後再在屏幕上畫
一個正方形的話,X應用程序就對X服務器說:請再畫一個正方形,當然他會告訴服務器在什
麼地方用什麼顏色畫多大的正方形,但不關心具體怎麼畫--那是服務器的事情.
那麼協議是需要具體的軟件來實現的,這就是下面我要講的:
三,X和XFree86的關係.
有了協議就需要具體的軟件來實現這個協議.就好比我們有了交通法規就需要交警去根據
法規維護交通秩序一樣.Xfree86就是這樣一個去根據法規實現協議的 "交警".他按照X協
議的規定來完成X應用程序提交的在屏幕上顯示的任務.當然不僅僅是某個特定的交警才
可以去維護和實現這個法規,比如還可以由交通協管員來實現交通法規,必要的時候警察
也可以介入,當然前提是他們都要懂得交通法規,也就是要懂得協議.所以實現X協議的軟
件也並不只有 XFree86,XFree86只是實現X協議的一個免費X服務器軟件.商業上常用MOTI
F,現在還有XORG,還有很多很小的由愛好者寫的小的X服務器軟件.甚至可以在WINDOWS上
有X服務器運行,這樣你可以在linux系統上運行一個X應用程序然後在另一臺windows系統
上顯示.多麼神奇. 你可以用google找到這樣的X服務器軟件.只不過在LINUX上最常用的
是XFree86.(現在的linux發行版都用Xorg了)順便說一句,蘋果電腦的圖形界面用的也是X
協議,而且被認爲是做的最好的X協議圖形界面,並且他對X協議的實施是做在系統內核裏
的,所以性能明顯好很多,這就是爲什麼很多大型三維圖形設計軟件都是在蘋果平臺上的
原因.
爲了便於理解拿HTTP協議來比較:
協議是HTTP (hyper text transmission protocol)
實現這個協議的常用服務器有:apache IIS 等
請求這些服務器傳輸文件的客戶有:IE ,MOZILLA ,NETSCAPE等.
協議是X
實現這個協議的常用服務器有Xfree86 ,Xorg ,Xnest等
請求這些服務器來完成顯示任務的客戶:所有的X應用程序.
只不過HTTP協議的服務器和客戶端通常都在兩臺不同的電腦(服務器和客戶機)之間來實
現,所以一般人對這個比較容易理解.而X協議的服務器和客戶端程序通常在同一臺電腦上
,因此很多用戶都感到對此很難理解.既然是協議,那麼肯定和平臺無關的,因此可以讓X應
用程序顯示在任何裝有X服務器的遠程計算機上.甚至顯示在裝有Xnest服務器的windows
系統上.只不過在大多數情況下,X應用程序都用本機的X服務器,然後X服務器將顯示結果
輸出到本機的顯示器.這也是很多人不理解X是一種協議的原因.
四,X和X11R6又是什麼關係?
不知道初學者有沒有注意到/usr/X11R6這個目錄,這是XFree的默認安裝目錄
X11R6 實際上是 X Protocol version 11 Release 6
(X協議第11版第六次發行)的意思,就是說目前用的X協議是第11版的,然後經過了6次小的
修正.不同版本的X協議是不能通信的.就象我們現在IPV4和IPV6不能通信一樣,不過不用
擔心,現在的X服務器軟件和X應用程序都遵循X11R6.
另外XFree86 3.3.6 XFree86 4.3.6 等這些版本是實現X協議的軟件XFree86的版本號.這
是初學者經常高混淆的概念.
協議版本和實現協議的軟件的版本--這兩個概念的區別你分清楚了嗎?
五,X服務器和WM(window manager 窗口管理器)之間是什麼關係.
平時大家起動圖形界面是怎麼啓動的呢?
如果你是一開己就進入圖形界面那就太遺憾了.應爲你錯過了瞭解X服務器起動過程的好
時機.不過沒關係.你打開一個XTERM輸入:
init 3
就可以安全的回到字符界面.
好了,等做完以下實驗你就完全明白X和WM(window manager 窗口管理器)之間是什麼關係
了.
先輸入以下命令:
#startx
起動圖形界面,你看到的是一個和平時使用一樣的完整的圖形界面操作環境.
你可以最大化,最小化,移動,關閉窗口等.
按ctrl+alt+backspace反回字符界面.
輸入:
#xinit
再次啓動圖形界面,你看到了什麼,你看到一個XTERM.而且不能移動.但是你可以在這個XT
ERM中輸入命令打開X應用程序,如果我輸入:
#mozilla
打開瀏覽器,你看到的瀏覽器和平時有什麼不同嗎?他在屏幕中間,不能移動,不能最小化,
不能最大化,沒有邊框.
爲什麼同樣一個X應用程序會有這樣的不同呢?因爲我們用startx起動圖形界面的時候同
時也啓動了一個WM(即窗口管理器),如果你用KDE就起動了KDE,如果你用GNOME就起動了GN
OME.但是你用xinit起動圖形界面的時候卻沒有起動WM.
現在你明白窗口管理器的作用了嗎?他的作用就是最大化,最小化,移動,關閉窗口等.而這
些不是X服務器來負責完成的.
如果你用xinit起動圖形界面並在xterm中輸入twm,看看會有什麼?
xterm被加上了一個邊框,你可以通過這個邊框移動,最大化,最小化這個xterm,twm就是XF
ree86中自帶的窗口管理器,是一個比較簡陋的最簡單的窗口管理器,但是他具有窗口管理
器的全部特徵.
如果你不輸入twm而輸入gnome-session就可以起動GNOME
或者輸入startkde起動KDE.
通過以上的實驗你就可以清楚的明白他們之間的關係.
六,關於KDE和GNOME
KDE 和GNOME是LINUX裏最常用的圖形界面操作環境,他們不僅僅是一個窗口管理器那麼簡
單, KDE是K Desktop Environment 的縮寫.他不僅是一個窗口管理器,還有很多配套的應
用軟件和方便使用的桌面環境,比如任務欄,開始菜單,桌面圖標等等.
GNOME是GNU Network Object Model Environment 的縮寫.和KDE一樣,也是一個功能強大
的綜合環境.
另外在其它UNIX系統中,常常使用CDE作爲這樣一個環境.
其它的小型窗口管理器有:
window maker,after step,blackbox,fvwm,fvwm2,等等都是常用的優秀窗口管理器.REDH
AT9中有 window maker 但是默認不安裝,大家可以裝來試試.只要xinit再wmaker&就可以
用windowmaker了.
七,linux圖形界面層次關係總結
linux本身-->X服務器<-[通過X協議交談]->窗口管理器(綜合桌面環境)-->X應用程序.
Xfree86服務器的實現包括兩個部分,一部分是和顯卡直接打交道的低層,一部分是和X
應用程序打交道的上層.上層負責接收應用程序的請求和鼠標鍵盤的動作.而和顯卡直接
打交道的底層負責指揮顯卡生成圖形,其實就是顯卡驅動.上層接收到應用程序的請求後,
將請求內容做適當處理,然後交給顯卡驅動來指揮顯卡完成畫圖的動作.另外,上層的捕捉
鍵盤和鼠標動作的部分會嚮應用程序提供鼠標和鍵盤的狀態信息,應用程序接收到這些信
息後決定是否再有相應的動作.
平時說的VESA,VGA ,fbdev等其實就是針對不同模式顯卡的驅動程序.
VESA(Video Electronics Standards Association)
VGA (Video Graphics Array)
fbdev (FrameBuffer Device)

都是不同的顯卡標準,不過這些標準都已經很老了.現在的顯卡都兼容這幾種模式.
framebuffer模式的顯卡本身不具有任何運算數據的能力,他好比是一個暫時存放水的水
池.CPU將運算後的結果放到這個水池,水池再將結果流到顯示器.中間不會對數據做處理.
在這中情況下,所有顯示任務都有CPU完成,CPU負擔很重.
從frambuffer這個名字我們就能猜測到他的功能了(數據偵緩衝).
在linux內核中有有framebuffer機制,摹仿framebuffer顯卡的這種功能.他的好處是把顯
卡的硬件結構抽象掉,把所有的顯卡都當做一個"水池"來用.應用程序也可以直接讀取這
個水池的內容.framebuffer的設備名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空屏幕.如果你的X用的是framebuffer的驅動,屏幕將全變黑.通過移動鼠標,切換窗口
等動作可以讓原先的內容重新顯示.
如果你不用framebuffer驅動,可以在字符模式下做這個試驗.屏幕將全部被清空.
以下的命令:
#dd if=/dev/fb of=fbfile
可以將fb中的內容保存下來,以後可以重新寫回屏幕:
#dd if=fbfile of=/dev/fb
作用類似於屏幕截圖,但是截下的圖不能用普通圖片瀏覽器看.
現在知道linux中framebuffer設備的神奇了吧.
linux字符界面在高分辨率下,啓動時會有一個小企鵝logo,這個logo就是用framebuffer
功能寫上屏幕的.
VESA和VGA比FB要好很多,但是他的顯示能力也很有限.CPU仍舊要處理大部分的顯示任務.
現在的顯卡就不一樣了,CPU幾乎不參數顯示任務,而專注於運算工作.我們平時在linux下
裝顯卡驅動,其實就是替換掉XFree86中底層的那一部分. 使他有更強的顯示能力.比如你
的顯卡是nvidia的,XFree默認的驅動是"nv",他是一個nvidia顯卡的通用驅動,但是他不
能發揮 nvidia顯卡的性能.這個"nv"驅動模塊可以在:
/usr/X11R6/lib/modules/drivers
目錄下找到,文件名是:nv_drv.o
這個目錄下還有很多顯卡驅動模塊.
apm_drv.o dummy_drv.o nsc_drv.o sis_drv.o
ark_drv.o fbdev_drv.o nv_drv.o tdfx_drv.o
ati_drv.o glint_drv.o r128_drv.o tga_drv.o
atimisc_drv.o i128_drv.o radeon_drv.o trident_drv.o
chips_drv.o i740_drv.o rendition_drv.o tseng_drv.o
cirrus_alpine.o i810_drv.o s3_drv.o vesa_drv.o
cirrus_drv.o linux s3virge_drv.o vga_drv.o
cirrus_laguna.o mga_drv.o savage_drv.o
cyrix_drv.o neomagic_drv.o siliconmotion_drv.o
fbdev vga evsa 等都在其中.
只要在XF86Conf文件中的Section module段中指定了什麼驅動,X就用哪個驅動.
代碼:
Section "Module"
Load "dbe"
Load "extmod"
Load "fbdevhw" #這裏用的是fbdev
Load "glx"
Load "record"
Load "freetype"
Load "type1"
Load "dri"
EndSection
這是XFree86 4.0以上版本的方法.即X主程序和驅動模塊是分開的.
主程序是/usr/X11R6/bin/XFree86 (即上層部分)
然後主程序啓動的時候根據配置文件決定用哪一個驅動.
但是,在XFree86以前的版本(3.3.6)中, X主程序和驅動模塊是合在一起的,因此,以前的X
free86 3.3.6 有很多針對不同顯卡的版本.
另外其他的X服務器如KDrive 也是驅動也主程序整合的,因此同樣是KDrive X服務器會有
VESA ,SVGA ,和 fbdev的版本之分.因爲這些都是輕量級的X服務器,爲了簡化結構他做
成這樣.
Xfree86 4 做成驅動和主程序分離的好處是用戶可以自己添加升級驅動.
--
君不見黃河之水天上來,奔流到海不復回。君不見高堂明鏡悲白髮,朝如青絲暮成雪。
人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復來。烹羊宰牛且爲樂,會須一飲三百杯。
岑夫子,丹丘生,將進酒,杯莫停。與君歌一曲,請君爲我傾耳聽:鐘鼓饌玉不足貴,但願長醉不復醒。古來聖賢皆寂寞,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。主人何爲言少錢,徑須沽取對君酌。五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁!

本文轉自
http://bbs.sjtu.edu.cn/bbstcon?board=GNULinux&reid=1192021152
發佈了15 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章