Linux Graphic DRI 显示子系统 介绍1
1. 前言
圖形子系統(tǒng)是linux系統(tǒng)中比較復(fù)雜的子系統(tǒng)之一:對(duì)下,它要管理形態(tài)各異的、性能各異的顯示相關(guān)的器件;對(duì)上,它要向應(yīng)用程序提供易用的、友好的、功能強(qiáng)大的圖形用戶界面(GUI)。因此,它是linux系統(tǒng)中少有的、和用戶空間程序(甚至是用戶)息息相關(guān)的一個(gè)子系統(tǒng)。
本文是圖形子系統(tǒng)分析文章的第一篇,也是提綱挈領(lǐng)的一篇,將會(huì)從整體上,對(duì)linux顯示子系統(tǒng)做一個(gè)簡單的概述,進(jìn)而羅列出顯示子系統(tǒng)的軟件構(gòu)成,后續(xù)的文章將會(huì)圍繞這些軟件一一展開分析。
注1:本文所有的描述將以原生linux系統(tǒng)為例(如Ubuntu、Debian等),對(duì)其它基于linux的系統(tǒng)(如Android),部分內(nèi)容會(huì)不適用。
注2:本文很多圖片都是從網(wǎng)上搜集而來的(很多是從維基百科)。雖然蝸窩的宗旨是用自己的語言表述,盡量自己畫圖,但是linux圖形子系統(tǒng)太復(fù)雜了,蝸蝸的理解有限,而老外的圖畫的實(shí)在太好,蝸蝸覺得,再怎么努力,也畫不出更好的了,因此本著為讀者負(fù)責(zé)的態(tài)度,就直接copy了。
2. 概念介紹
2.1 GUI(Graphical User Interface,圖形用戶界面)
linux圖形子系統(tǒng)的本質(zhì),是提供圖形化的人機(jī)交互(human-computer interaction)界面,也即常說的GUI(Graphical User Interface)。而人機(jī)交互的本質(zhì),是人腦通過人的輸出設(shè)備(動(dòng)作、聲音等),控制電腦的輸入設(shè)備,電腦經(jīng)過一系列的處理后,經(jīng)由電腦的輸出設(shè)備將結(jié)果輸出,人腦再通過人的輸入設(shè)備接收電腦的輸出,最終實(shí)現(xiàn)“人腦<-->電腦”之間的人機(jī)交互。下面一幅摘自維基百科的圖片(可從“這里”查看比較清晰的SVG格式的原始圖片),對(duì)上述過程做了很好的總結(jié):
該圖以一個(gè)非常前衛(wèi)的應(yīng)用場景----虛擬現(xiàn)實(shí)(VR,Virtual Reality)游戲,說明了以圖形化為主的人機(jī)交互過程:
1)人腦通過動(dòng)作、聲音(對(duì)人腦而言,是output),控制電腦的輸入設(shè)備,包括鍵盤、鼠標(biāo)、操作桿、麥克風(fēng)、游戲手柄(包含加速度計(jì)、陀螺儀等傳感器)。
2)電腦通過輸入設(shè)備,接收人腦的指令,這些指令經(jīng)過kernel Input subsystem、Middleware Gesture/Speech recognition等軟件的處理,轉(zhuǎn)換成應(yīng)用程序(Game)可以識(shí)別的、有意義的信息。
3)應(yīng)用程序(Game)根據(jù)輸入信息,做出相應(yīng)的反饋,主要包括圖像和聲音。對(duì)VR游戲而言,可能需要3D rendering,這可以借助openGL及其相應(yīng)的用戶空間driver實(shí)現(xiàn)。
4)應(yīng)用程序的反饋,經(jīng)由kernel的Video subsystem(如DRM/KMS)、audio subsystem(如ALSA),輸出到電腦的輸出設(shè)備上,包括顯示設(shè)備(2D/3D)、揚(yáng)聲器/耳機(jī)(3D Positional Audio)、游戲手柄(力的反饋)等。
5)輸出到顯示設(shè)備上時(shí),可能會(huì)經(jīng)過圖形加速模塊(Graphics accelerator)。
注3:圖中提到了VR場景的典型幀率(1280×800@95fps?for VR),這是一個(gè)非常龐大的信息輸出,要求圖形子系統(tǒng)能10.5ms的時(shí)間內(nèi),生成并輸出一幀,以RGBA的數(shù)據(jù)格式為例,每秒需要處理的數(shù)據(jù)量是1280x800x95x4x8=3.11296Gb,壓力和挑戰(zhàn)是相當(dāng)大的(更不用提1080P了)。
有關(guān)GUI更為詳細(xì)的解釋,請(qǐng)參考:https://en.wikipedia.org/wiki/Graphical_user_interface。
2.2 Windowing system(窗口系統(tǒng))
窗口系統(tǒng),是GUI的一種(也是當(dāng)前計(jì)算機(jī)設(shè)備、智能設(shè)備廣泛使用的一種),以WIMP (windows、icons、menus、pointer) 的形式,提供人機(jī)交互接口。Linux系統(tǒng)中有很多窗口系統(tǒng)的實(shí)現(xiàn),如X Window System、Wayland、Android SurfaceFlinger等,雖然形態(tài)各異,但思路大致相同,包含如下要點(diǎn):
1)一般都使用client-server架構(gòu),server(稱作display server,或者windows server、compositor等等)管理所有輸入設(shè)備,以及用于輸出的顯示設(shè)備。
2)應(yīng)用程序作為display server的一個(gè)client,在自己窗口(window)中運(yùn)行,并繪制自己的GUI。
3)client的繪圖請(qǐng)求,都會(huì)提交給display server,display server響應(yīng)并處理這些請(qǐng)求,以一定的規(guī)則混合、疊加,最終在有限的輸出資源上(屏幕),顯示多個(gè)應(yīng)用程序的GUI。
3)display server和自己的client之間,通過某種類型的通信協(xié)議交互,該通信協(xié)議通常稱作display server protocol。
4)display server protocol可以是基于網(wǎng)絡(luò)的,甚至是網(wǎng)絡(luò)透明的(network transparent),如X Window System所使用的。也可以是其它類型的,如Android SurfaceFlinger所使用的binder。
有關(guān)Windowing system的詳細(xì)解釋,請(qǐng)參考:https://en.wikipedia.org/wiki/Windowing_system。
2.3 X Window System
似乎終于要進(jìn)入正題了。
X Window System是Windowing System一種實(shí)現(xiàn),廣泛使用于UNIX-like的操作系統(tǒng)上(當(dāng)然也包括Linux系統(tǒng)),由MIT(Massachusetts Institute of Technology,麻省理工學(xué)院)在1984年發(fā)布。下圖(可從“這里”查看比較清晰的SVG格式的原始圖片)是它的典型架構(gòu):
1)X Window System簡稱X,或者X11,或者X-Windows。之所以稱作X,是因?yàn)樵谧帜副碇蠿位于W之后,而W是MIT在X之前所使用的GUI系統(tǒng)。之所以稱作X11,是因?yàn)樵?987年的時(shí)候,X Window System已經(jīng)進(jìn)化到第11個(gè)版本了,后續(xù)所有的X,都是基于X11版本發(fā)展而來的(變動(dòng)不是很大)。為了方便,后續(xù)我們都以X代指X Window System。
2)X最初是由X.org(XOrg Foundation)維護(hù),后來基于X11R6發(fā)展出來了最初專門給Intel X86架構(gòu)PC使用的X,稱作XFree86(提供X服務(wù),它是自由的,它是基于Intel的PC平臺(tái))。而后XFree86發(fā)展成為幾乎適用于所有類UNIX操作系統(tǒng)的X Window系統(tǒng),因此在相當(dāng)長的一段時(shí)間里,XFree86也是X的代名詞。再后來,從2004年的時(shí)候,XFree86不再遵從GPL許可證發(fā)行,導(dǎo)致許多發(fā)行套件不再使用XFree86,轉(zhuǎn)而使用Xorg,再加上Xorg在X維護(hù)工作上又趨于活躍,現(xiàn)在Xorg由成為X的代名詞(具體可參考“http://www.x.org/”)。
3)X設(shè)計(jì)之初,制定了很多原則,其中一條----"It is as important to decide what a system is not as to decide what it is”,決定了X的“性格”,即:X只提供實(shí)現(xiàn)GUI環(huán)境的基本框架,如定義protocol、在顯示設(shè)備上繪制基本的圖形單元(點(diǎn)、線、面等等)、和鼠標(biāo)鍵盤等輸入設(shè)備交互、等等。它并沒有實(shí)現(xiàn)UI設(shè)計(jì)所需的button、menu、window title-bar styles等元素,而是由第三方的應(yīng)用程序提供。這就是Unix的哲學(xué):只做我應(yīng)該做、必須做的事情。這就是這么多年來,X能保持穩(wěn)定的原因。也是Linux OS界面百花齊放(不統(tǒng)一)的原因,各有利弊吧,后續(xù)文章會(huì)展開討論。
4)X包括X server和X client,它們之間通過X protocol通信。
5)X server接收X clients的顯示請(qǐng)求,并輸出到顯示設(shè)備上,同時(shí),會(huì)把輸入設(shè)備的輸入事件,轉(zhuǎn)遞給相應(yīng)的X client。X server一般以daemon進(jìn)程的形式存在。
6)X protocol是網(wǎng)絡(luò)透明(network-transparently)的,也就是說,server和client可以位于同一臺(tái)機(jī)器上的同一個(gè)操作系統(tǒng)中,也可以位于不同機(jī)器上的不同操作系統(tǒng)中(因此X是跨平臺(tái)的)。這為遠(yuǎn)端GUI登錄提供了便利,如上面圖片所示的運(yùn)行于remote computer 的terminal emulator,但它卻可以被user computer的鼠標(biāo)鍵盤控制,以及可以輸出到user computer的顯示器上。?
注4:這種情況下,user computer充當(dāng)server的角色,remote computer是client,有點(diǎn)別扭,需要仔細(xì)品味一下(管理輸入設(shè)備和顯示設(shè)備的是server)。
7)X將protocol封裝為命令原語(X command primitives),以庫的形式(xlib或者xcb)向client提供接口。X client(即應(yīng)用程序)利用這些API,可以向X server發(fā)起2D(或3D,通過GLX等擴(kuò)展,后面會(huì)介紹)的繪圖請(qǐng)求。
有關(guān)X更為詳細(xì)的介紹,請(qǐng)參考:https://en.wikipedia.org/wiki/X_Window_System,后續(xù)蝸蝸可能會(huì)在單獨(dú)的文章中分析它。
2.4 窗口管理器、GUI工具集、桌面環(huán)境及其它
前面講過,X作為Windowing system中的一種,只提供了實(shí)現(xiàn)GUI環(huán)境的基本框架,其它的UI設(shè)計(jì)所需的button、menu、window title-bar styles等基本元素,則是由第三方的應(yīng)用程序提供。這些應(yīng)用程序主要包括:窗口管理器(window manager)、GUI工具集(GUI widget toolkit)和桌面環(huán)境(desktop environment)。
窗口管理器負(fù)責(zé)控制應(yīng)用程序窗口(application windows)的布局和外觀,使每個(gè)應(yīng)用程序窗口盡量以統(tǒng)一、一致的方式呈現(xiàn)給用戶,如針對(duì)X的最簡單的窗口管理程序--twm(Tab Window Manager)。
GUI工具集是Windowing system之上的進(jìn)一步的封裝。還是以X為例,它通過xlib提供給應(yīng)用程序的API,僅僅可以繪制基本的圖形單元(點(diǎn)、線、面等等),這些基本的圖形單元,要組合成復(fù)雜的應(yīng)用程序,還有很多很多細(xì)碎、繁雜的任務(wù)要做。因此,一些特定的操作系統(tǒng),會(huì)在X的基礎(chǔ)上,封裝出一些更為便利的GUI接口,方便應(yīng)用程序使用,如Microwindows、GTK+、QT等等。
桌面環(huán)境是應(yīng)用程序級(jí)別的封裝,通過提供一系列界面一致、操作方式一致的應(yīng)用程序,使系統(tǒng)以更為友好的方式向用戶提供服務(wù)。Linux系統(tǒng)比較主流的桌面環(huán)境包括GNOME、KDE等等。
2.5 3D渲染、硬件加速、OpenGL及其它
渲染(Render)在電腦繪圖中,是指:用軟件從模型生成圖像的過程。模型是用嚴(yán)格定義的語言或者數(shù)據(jù)結(jié)構(gòu)對(duì)于三維物體的描述,它包括幾何、視點(diǎn)、紋理以及照明信息。圖像是數(shù)字圖像或者位圖圖像。
上面的定義摘錄自“百度百科”,它是著重提及“三維物體”,也就是我們常說的3D渲染。其實(shí)我們?cè)贕UI編程中習(xí)以為常的點(diǎn)、線、矩形等等的繪制,也是渲染的過程中,只不過是2D渲染。2D渲染面臨的計(jì)算復(fù)雜度和性能問題沒有3D厲害,因此渲染一般都是指3D渲染。
在計(jì)算機(jī)中,2D渲染一般是由CPU完成(也可以由專門的硬件模塊完成)。3D渲染也可以由CPU完成,但面臨性能問題,因此大多數(shù)平臺(tái)都會(huì)使用單獨(dú)硬件模塊(GPU或者顯卡)負(fù)責(zé)3D渲染。這種通過特定功能的硬件模塊,來處理那些CPU不擅長的事務(wù)的方法,稱作硬件加速(Hardware acceleration),相應(yīng)的硬件模塊,就是硬件加速模塊。
眾所周知,硬件設(shè)備是多種多樣的,為了方便應(yīng)用程序的開發(fā),需要一個(gè)穩(wěn)定的、最好是跨平臺(tái)的API,定義渲染有關(guān)的行為和動(dòng)作。OpenGL(Open Graphics Library)就是這類API的一種,也是最為廣泛接納的一種。
雖然OpenGL只是一個(gè)API,但由于3D繪圖的復(fù)雜性,它也是相當(dāng)?shù)膹?fù)雜的。不過,歸根結(jié)底,它的目的有兩個(gè):
1)對(duì)上,屏蔽硬件細(xì)節(jié),為應(yīng)用程序提供相對(duì)穩(wěn)定的、平臺(tái)無關(guān)的3D圖像處理API(當(dāng)然,也可以是2D)。
2)對(duì)下,指引硬件相關(guān)的驅(qū)動(dòng)軟件,實(shí)現(xiàn)3D圖像處理相關(guān)的功能。
另外,openGL的一個(gè)重要特性,是獨(dú)立于操作系統(tǒng)和窗口系統(tǒng)而存在的,具體可以參考后面軟件框架相關(guān)的章節(jié)。
3. 軟件框架
通過第2章的介紹,linux系統(tǒng)中圖形有關(guān)的軟件層次已經(jīng)呼之欲出,具體如下:
該層次圖中大部分的內(nèi)容,已經(jīng)在第2章解釋過了,這里再補(bǔ)充說明一下:
1)該圖片沒有體現(xiàn)3D渲染、硬件加速等有關(guān)的內(nèi)容,而這些內(nèi)容卻是當(dāng)下移動(dòng)互聯(lián)、智能化等產(chǎn)品比較關(guān)注的地方,也是linux平臺(tái)相對(duì)薄弱的環(huán)節(jié)。后續(xù)會(huì)在軟件框架有關(guān)的內(nèi)容中再著重說明。
2)從層次結(jié)構(gòu)的角度看,linux圖形子系統(tǒng)是比較清晰的,但牽涉到每個(gè)層次上的實(shí)現(xiàn)的時(shí)候,就比較復(fù)雜了,因?yàn)橛刑嗟倪x擇了,這可歸因于“提供機(jī)制,而非策略”的Unix軟件準(zhǔn)則。該準(zhǔn)則為類Unix平臺(tái)軟件的多樣性、針對(duì)性做出了很大的貢獻(xiàn),但在今天這種各類平臺(tái)趨于整合的大趨勢下,過多的實(shí)現(xiàn)會(huì)導(dǎo)致用戶體驗(yàn)的不一致、開發(fā)者開發(fā)精力分散等弊端,值得我們思考。
3)雖然圖形子系統(tǒng)的層次比較多,但不同的人可能關(guān)注的內(nèi)容不太一樣。例如對(duì)Linux系統(tǒng)工程師(驅(qū)動(dòng)&中間件)而言,比較關(guān)注hardware、kernel和display server這三個(gè)層次。而對(duì)Application工程師來說,可能更比較關(guān)心GUI Toolkits。本文以及后續(xù)display subsystem的文章,主要以Linux系統(tǒng)工程師的視角,focus在hardware、kernel和display server(可能包括windows manager)上面。
以X window為例,將hardware、kernel和display server展開如下(可從“這里”查看比較清晰的SVG格式的原始圖片):
From:?https://upload.wikimedia.org/wikipedia/commons/c/c2/Linux_Graphics_Stack_2013.svg
對(duì)于軟件架構(gòu)而言,這張來自維基百科的圖片并不是特別合適,因?yàn)樗颂嗟募?xì)節(jié),從而顯得有些雜亂。不過瑕不掩瑜,對(duì)本文的描述,也足夠了。從向到下,圖中包括如下的軟件的軟件模塊:
1)3D-game engine、Applications和Toolkits,應(yīng)用軟件,其中3D-game engine是3D application的一個(gè)特例。
2)Display Server
圖片給出了兩個(gè)display server:Wayland compositor和X-Server(X.Org)。X-Server是linux系統(tǒng)在PC時(shí)代使用比較廣泛的display server,而Wayland compositor則是新設(shè)計(jì)的,計(jì)劃在移動(dòng)時(shí)代取代X-Server的一個(gè)新的display server。
3)libX/libXCB和libwayland-client
display server提供給Application(或者GUI Toolkits)的、訪問server所提供功能的API。libX/libXCB對(duì)應(yīng)X-server,libwayland-client對(duì)已Wayland compositor。
4)libGL
libGL是openGL接口的實(shí)現(xiàn),3D application(如這里的3D-game engine)可以直接調(diào)用libGL進(jìn)行3D渲染。
libGL可以是各種不同類型的openGL實(shí)現(xiàn),如openGL(for PC場景)、openGL|ES(for嵌入式場景)、openVG(for Flash、SVG矢量圖)。
libGL的實(shí)現(xiàn),既可以是基于軟件的,也可以是基于硬件的。其中Mesa 3D是OpenGL的一個(gè)開源本的實(shí)現(xiàn),支持3D硬件加速。
5)libDRM和kernel DRM
DRI(Direct Render Infrastructure)的kernel實(shí)現(xiàn),及其library。X-server或者M(jìn)esa 3D,可以通過DRI的接口,直接訪問底層的圖形設(shè)備(如GPU等)。
6)KMS(Kernel Mode Set)
一個(gè)用于控制顯示設(shè)備屬性的內(nèi)核driver,如顯示分辨率等。直接由X-server控制。
4. 后續(xù)工作
本文有點(diǎn)像一個(gè)大雜燴,丟進(jìn)去太多的東西,每個(gè)東西又不能細(xì)說。覺得說了很多,又覺得什么都沒有說。后續(xù)蝸蝸將有針對(duì)性的,focus在某些點(diǎn)上面,更進(jìn)一步的分析,思路如下:
1)將會(huì)把顯示框架限定到某個(gè)確定的實(shí)現(xiàn)上,初步計(jì)劃是:Wayland client+Wayland compositor+Mesa+DRM+KMS,因?yàn)樗鼈冎?#xff0c;除了Mesa之外,其它的都是linux系統(tǒng)中顯示有關(guān)的比較前沿的技術(shù)。當(dāng)然,最重要的,是比較適合移動(dòng)端的技術(shù)。
2)通過單獨(dú)的一篇文章,更詳細(xì)的分析Wayland+Mesa+DRM+KMS的軟件框架,著重分析圖像送顯、3D渲染、Direct render的過程,以此總結(jié)出DRM的功能和工作流程。
3)之后,把重心拉回kernel部分,主要包括DRM和KMS,當(dāng)然,也會(huì)順帶介紹framebuffer。
4)kernel部分分析完畢后,回到Wayland,主要關(guān)心它的功能、使用方式等等。
5)其它的,邊學(xué)、邊寫、邊看吧。
總結(jié)
以上是生活随笔為你收集整理的Linux Graphic DRI 显示子系统 介绍1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: imx6 板卡移植官方yocto版本(2
- 下一篇: Linux Graphic DRI