如何給ARM-linux移植桌面系統?哪款桌面系統適合入門移植?

如題。比如 ubuntu 看網上介紹 是 Unity 還是 Gnome 的,但是搜了一下好像移植桌面環境這方面的資料很少。有沒有做過類似工作的大神指明學習的道路呢?

還有 GUI 與 桌面系統 是什麼關係呢?


既然你在搞arm-linux,那麼相信你對於linux內核應該不陌生,也應該知道在沒有桌面環境的時候linux內核和其他軟體包共同組成的系統的用戶界面是純命令行的。

首先我們考慮直接為arm晶元寫裸機代碼,此時假設你需要圖形界面,怎麼辦?

顯然,我們需要某種在屏幕上進行繪圖的能力,這樣就能畫出我們熟悉的標題欄,熟悉的菜單,構成每天都在用的窗口。怎麼進行繪圖呢?傳統的做法是在晶元的地址空間(32位的晶元通俗來講地址空間有4G,我相信你一定熟悉這個)中分配出一段區域作為顯存地址空間,然後某種電路(比如LCD驅動電路,顯卡)通過某種神秘的方式連接這段顯存與顯示器。往顯存中寫不同的內容,顯示器中就可能會出現不同的畫面。你可以想像一下爛大街的LED點陣屏幕的原理。

如果你寫過arm的裸機代碼的話,就會發現,媽蛋,好麻煩,寫了好多代碼才把ram驅動起來,還不知道malloc這等函數啥時候才移植的過來,LCD驅動程序更是遙遙無期,看文檔眼睛都看瞎了還不一定搞得好。

so,你需要linux內核來做這些基礎工作。由此你的內存有linux幫你管理了,IO也有linux幫你管理了,順帶的,LCD驅動它也可以有。

不知道你有沒有聽說過framebuffer這個東西。簡單的說,這個驅動能夠將顯示器上的每一個像素映射到一段內存,這段內存使用起來與其他用malloc直接分配的內存完全沒有區別,神奇的是,你按照某種規則往其中寫內容,顯示器就會按照某種規則重現內容。這與之前在使用arm裸機繪圖中說的情況類似。

好了,總結下我們現在擁有了什麼。arm晶元以及配套的ram等外圍晶元,已經有了LCD驅動的的linux內核,framebuffer驅動,LCD顯示器。

linux內核是自帶字元界面來闖蕩江湖的,當然,如果不是通過串口或者其他的什麼口來得到眼睛可以看到的字元界面,這些字元還是需要繪製在屏幕上,顯示原理本質上與窗口系統也沒有區別,無非後者要複雜的多。

在稍作配置之後,linux內核就能通過framebuffer將字元界面繪製到屏幕上,就得到了最簡單的人機介面。你想要的是圖形界面,我們可以按照之前說的,自己往framebuffer上一個點一個點的繪製標題欄,菜單欄,xxxx。理論上最終可以得到一個完備的GUI。但是實際上呢。。這不太科學。一是太難,二是沒有必要,都到了arm-linux這個層次,我們無需像單片機那樣從頭搞。在使用現成的GUI系統後,繪製的單位可能就變成了一個控制項一個控制項,而且還附帶布局管理等諸多高級技能。

你知道gnome,kde也應該是了解的,還有個不容忽視的東西就是Qt。Qt與前兩個東西之間容易既區別又聯繫,很容易引起困惑,還有個流傳很久的qt qtpia,以及後來新出的qt embedded。

這裡要分清楚的是,gnome,kde,Qt qtpia,Qt Extended這四個是同一種東西,即桌面環境。而Qt庫,是GUI圖形包,它是桌面環境的子集。實際上Qt庫也可以編譯成arm-linux的版本,與我們之前的arm-linux-lcd驅動-framebuffer驅動組合起來,就成為了一個帶GUI圖形包的系統,此時我們寫一個Qt程序,在系統啟動時啟動這個程序,我們就可以進入一個圖形程序。

想像一下,這個效果大概就是你得到了一個全屏的firefox瀏覽器,你沒有傳統意義上的桌面,沒有開始菜單,也沒有其他程序,你就只有一個firefox瀏覽器。你只能用firefox這麼一個程序。可能你在想,如果我再寫一個Qt程序,也啟動它呢。嗯,linux是多進程多線程系統。。你這樣當然是可以的,Qt也具備了簡單的窗口管理功能,但是你還是沒有開始菜單,你還是沒有任務欄,你強迫症犯了想右鍵刷新一個也不行。

堅毅的你肯定是不服輸的,你又想,這些開始菜單啊之類的,說白了不還是程序么。你對了,你當然可以再寫若干Qt程序來完成這些任務,好了,開始菜單有了,任務欄也有了,xx也有了,連oo都有了。然後你發現,媽蛋,這些程序的文件都好亂,瀏覽器放在這個位置,其他的程序又放在其他位置。潔癖犯了,你搞了個規章制度,規定了配置文件要放在/etc,xxx文件要放在ooo。

最後呢。。你就得到了一個桌面環境,這個環境本質上與Qt Qtpia和Qt extended是一樣的,再複雜一些,就是kde,gnome這種樣子了。

這是Qt Qtpia的經典界面

這是Qt extended的界面,樓主感受下

這是meego,本質上也是同一類東西,不過meego似乎是指帶了整個系統,而不僅僅是桌面環境

回頭移植桌面環境的話題上來。希望你能確定一點:

你的應用場景是什麼,是需要一個像桌面PC一樣的那種界面,是上面我貼的圖這種界面,還是系統一啟動直接進入一個應用,就像ATM機的那種界面?

對於第一種場景,如果你的arm晶元夠強勁,直接移植debia就可以了,這貨是有arm的分支的

對於第二種,移植qtpia或者qt extended

對於第三種,移植qt,minigui或者其他的什麼(我是qt腦殘粉),然後自己基於這個圖形包寫個程序


推薦閱讀:

發現自己有系統和軟體升級強迫症怎麼辦?
你什麼時候對 ubuntu 感到絕望?
用到了高版本Qt庫,但Ubuntu更新不到那麼高的Qt版本,自己拷貝高版本Qt庫過去又有問題,怎麼辦?
Linux上沒有真正的非同步,為什麼伺服器還是用Linux的多?
RHCE证书的含金量怎么样,这个证好不好考,考出来以后做关于Linux的哪方面工作,或者在公司能够做什么

TAG:Linux | 圖形用戶界面 | Ubuntu | 桌面 | GNOME |