技術頻道

娓娓工業(yè)
您現在的位置: 中國傳動網 > 技術頻道 > 技術百科 > Linux嵌入式系統(tǒng)淺談

Linux嵌入式系統(tǒng)淺談

時間:2007-04-26 16:52:00來源:lihan

導語:?做為嵌入式系統(tǒng)開發(fā)的解決方案,linux在眾多通用操作系統(tǒng)中具有獨一無二的優(yōu)勢。
過去很多嵌入式系統(tǒng)不是一個操作系統(tǒng),而是提供商的專有核心,或者是DOS操作系統(tǒng)的擴展。顯然這些方法并不能適應今天嵌入式系統(tǒng)開發(fā)的要求!現有的一些商業(yè)實時操作系統(tǒng),盡管提供了很小的核心和多任務開發(fā)環(huán)境,但性能并不理想,也不符合現在實時嵌入式市場的需求。 因此,人們把目光投向了通用操作系統(tǒng)(例如Windows、Solaris、linux),希望把它們“改造”為實時操作系統(tǒng)。通常這些操作系統(tǒng)功能強大,結構復雜,易于軟件的二次開發(fā),實用性強,并且提供編程人員熟悉的標準API。此外,這些操作系統(tǒng)也提供了一些對實時軟件開發(fā)的支持。然而,這些操作系統(tǒng)用于嵌入式系統(tǒng)的開發(fā)還存在不足。嵌入式系統(tǒng)要求具備高可靠性,滿足應用需求的可剪裁性,以及比通用操作系統(tǒng)要求更高的實時性。 做為嵌入式系統(tǒng)開發(fā)的解決方案,linux在眾多通用操作系統(tǒng)中具有獨一無二的優(yōu)勢。 首先,Windows和Solaris等專有商業(yè)操作系統(tǒng)的剪裁受到商家的嚴格控制。這大大限制了開發(fā)者的剪裁深度。而linux遵循GPL協(xié)議,開放所有系統(tǒng)源代碼,非常易于剪裁。 其次,同其它開放源碼的通用操作系統(tǒng)(如FreeBSD)相比,linux在多種處理器、開發(fā)板支持和軟件開發(fā)工具支持上有很強的優(yōu)勢。 linux最初也是作為通用操作系統(tǒng)而設計開發(fā)的,但提供了一些實時處理的支持。這包括支持大部分POSIX標準中的實時功能,支持多任務、多線程,具有豐富的通信機制等。 linux還提供符合了POSIX標準的調度策略,包括FIFO調度策略、時間片輪轉調度策略和靜態(tài)優(yōu)先級搶占式調度策略。其默認的調度策略是第三種。Linux還提供了內存鎖定功能,以避免在實時處理中存儲頁被換出,也提供了符合POSIX 標準的實時信號機制。 一個致命問題是,linux在用戶態(tài)支持可搶占調度策略,而在核心態(tài)卻不支持搶占式調度策略。這樣運行在Linux核心態(tài)的任務(或系統(tǒng)調用)是不能被其它優(yōu)先級更高的任務所搶占的,這樣就會引起優(yōu)先級逆轉問題。另外,Linux操作系統(tǒng)的中斷處理句柄是不可調度的,不能依優(yōu)先級高低調度。而在實時系統(tǒng)中,卻希望中斷處理句柄同實時任務一樣,可以有優(yōu)先級來被系統(tǒng)的調度程序所調度。 此外,我們還關心和任務響應時間相關的時鐘精度,以及由于資源共享而帶來的優(yōu)先級逆轉問題。linux中硬件時鐘中斷的默認時間間隔是10ms,所有的軟件時鐘都是靠硬件來觸發(fā)的。而簡單同步機制(互斥)不支持優(yōu)先級繼承又很可能導致優(yōu)先級逆轉。 獨立核方法 linux作為實時系統(tǒng)的獨立核方法是指設計一種完全獨立的實時核心,但其API 與Linux核心相兼容。這種方法的理論基礎是一款優(yōu)秀的實時操作系統(tǒng)必須在其設計之初就充分考慮到系統(tǒng)實時性的要求,并能夠提供符合標準的API。這種實現方法對很多與POSIX 兼容的專有實時系統(tǒng)提供商很有吸引力。 這種方法的局限性是由于設計了一個完全獨立的實時核心而沒有使用原有l(wèi)inux核心,導致Linux系統(tǒng)的一些優(yōu)勢難以繼承,尤其是與Linux核心相關的一些優(yōu)勢無法獲得。比如Linux核心對大量硬件的廣泛支持,Linux核心超群的可靠性、穩(wěn)定性等。另外,由于這種方法并沒有通過修改Linux核心代碼來開發(fā)實時核心,而是在Linux系統(tǒng)之上重新設計了一個實時核心,這樣的開發(fā)并不要求源代碼開放。因此,Linux一些基于開放源代碼的優(yōu)勢也勢必受損。最后一點,任何基于Linux核心的開發(fā)成果也無法方便地應用到實時核心中。 當然這種實現方法也從linux系統(tǒng)中得到了很多好處。由于Linux系統(tǒng)的支撐,實時核心就并不需要“真”的去實現。而且熟悉Linux系統(tǒng)的開發(fā)人員也可以很快地熟悉這種方法開發(fā)出的實時系統(tǒng)。人們也會自然地想到用Linux系統(tǒng)做嵌入式系統(tǒng)的開發(fā)平臺。此外,如果這種實時系統(tǒng)的API是Linux系統(tǒng)API子集的話,我們還可以只在Linux主機上仿真,進行應用程序的開發(fā)和調試,免去了遠程調試之苦!   與linux API的兼容程度是評估這類實時系統(tǒng)的一個重要指標。如果一個實時系統(tǒng)兼容了所有Linux API,那么就允許所有Linux上的應用程序和庫在其上運行使用。因此,這將會帶來一個巨大的好處,所有在Linux上可用的第三方軟件均可以在其上使用。當然,開發(fā)一款這樣兼容所有Linux API的實時系統(tǒng)決不是件容易的事,尤其是對于單個開發(fā)商來說。 所以,大量的第三方軟件并不能很容易地移植到實時系統(tǒng)中來,這點不足,也使linux的優(yōu)勢大打折扣! 雙核方法 這種方法在同一硬件平臺上采用了兩個相互配合,共同工作的系統(tǒng)核心,一個核心提供精確的實時多任務管理,另一個核心提供復雜的非實時通用功能。 這種方法是通過在linux操作系統(tǒng)的最底層增加一層實時核心層來實現的。實時核心負責硬件管理并提供實時任務管理。實時核心還用軟件“模擬”常規(guī)Linux系統(tǒng)對底層硬件的使用/禁止中斷,而不是真正的操作中斷控制寄存器。Linux核心被看做實時核心中優(yōu)先級最低的任務來調度,只有當沒有可運行的實時任務時Linux核心才被調度。 這種方法的一個關鍵所在是運行在常規(guī)linux核心上的所有非實時任務必須是支持可搶占式調度的。這樣才能做到對實時核心提供精確實時保證沒有任何影響。由于實時核心非常小,并不會增加整個系統(tǒng)的負載,所有這些對開發(fā)實時性要求嚴格的實時軟件都提供了有力保障。 這種方法的弊端在于實時任務的開發(fā)是直接面向提供精確實時服務的小實時核心的,而不是功能強大的常規(guī)linux核心。因此,實時任務是運行在系統(tǒng)核心層的,這就意味著這些實時任務可以運行在沒有內存保護的級別之上。所以,一個實時任務的錯誤可能會導致整個系統(tǒng)的癱瘓!更要命的是,這些實時任務的開發(fā)由于面對的是小的實時核心,而不能直接利用Linux API和第三方軟件及運行庫。 這種開發(fā)模式暗示我們必須要對應用進行靜態(tài)分解。把它分解成實時部分和非實時部分。在大多情況下,這是件好事情。它迫使開發(fā)人員將應用系統(tǒng)分解成實時子系統(tǒng)和非實時子系統(tǒng)兩部分。但很顯然,使用這種開發(fā)模式也限制了應用的類型!因為,這種用二元論觀點看待實時系統(tǒng)的方法并不適合所有的應用。在一些應用中,實時部分和非實時部分的界線并不是十分分明,期間可能存在著不同程度的軟實時部分。 這種方法的另一個不足之處是,開發(fā)模式混合了實時應用的兩個不相干維度——功能需求和實時需求。它要求應用的實時需求必須限制于由實時核心提供的功能需求限度以內。而實時核心提供的功能支持非常有限。當然我們也可以擴展實時核心的功能,比如增加實時網絡功能等。然而,新增加的部分很有可能會重疊linux核心已有功能,而導致了不必要的系統(tǒng)“膨脹”,并折損這種方法的價值。 修改核方法 這種方法是基于已有l(wèi)inux系統(tǒng)對實時軟件開發(fā)的支持,進行源代碼級修改而使Linux變成一個真正的實時操作系統(tǒng)。這種方法也是和Linux哲學相吻合的。任何基于Linux核心源代碼修改的產品,都要遵循GPL 協(xié)議,對所有軟件人員開放源代碼。一旦很多人認為它是有用的,就會有人對它進行維護,或者是混合在通用Linux核心中,或者是單獨分出一個實時Linux分支。 這種方法的中心原則是精心選擇部分改動,就可以滿足一系列相關linux實時開發(fā)。此外,由于這些改動都是相對局部的,不會從根本上改變Linux的核心。而且一些改動還可以通過常規(guī)Linux的可加載模塊方式完成。在需要時系統(tǒng)可以動態(tài)加載該功能模塊,在不需要時還可以動態(tài)卸載該模塊。 比如,修改之一是核心搶占式調度。把核心從非搶占式變成搶占式是結構上的大變動,并可能引起很多問題,但很多問題已經在linux支持SMP 的時候解決了。因此,核心的搶占式修改就可以簡單地利用SMP 掛鉤。另一個修改點是前面提到過的使中斷處理句柄可調度。還有一些修改是全局的,例如修改系統(tǒng)時鐘服務來提供更高精度的“心跳”,而不增加不必要的系統(tǒng)負載,或者是提供在核心實現互斥機制來支持優(yōu)先級繼承。 資源核方法 這種方法是為解決傳統(tǒng)實時操作系統(tǒng)中固定優(yōu)先級搶占式調度策略的局限性而產生的。固定優(yōu)先級搶占式調度算法沒有任務間的臨時保護。因此,可預見的任務響應時間依賴于對所有更高優(yōu)先級任務執(zhí)行時間的預測。在這樣的系統(tǒng)中,可預見性是與全局相關的,并且可能被一個糟糕任務而影響的。此外,這種用靜態(tài)觀點看待實時系統(tǒng)也是不妥的。在很多實時應用中,更希望實時系統(tǒng)可以根據應用程序獲得資源動態(tài)地調整任務屬性,以求得到最優(yōu)效果。 資源核方法是一種以資源為中心來指導實時核心提供精確的、有保證的、可搶占的獲取系統(tǒng)資源的方法。只要實時應用所需資源可以由核心后臺資源管理程序調配滿足,實時核心是允許實時應用可配置的。因此,實時核心其實是提供了實時應用可構建的基礎——從配置簡單的實時系統(tǒng)到復雜的實時系統(tǒng),都可以通過動態(tài)地改變實時任務屬性和它們在整個系統(tǒng)中的優(yōu)先級來滿足。 這種方法的最大優(yōu)點是系統(tǒng)具有很好的健壯性、可精確預見的實時性。另一個優(yōu)點是允許應用程序根據實際情況動態(tài)調整自身屬性。此外,這種方法非常適合嵌入式系統(tǒng)的開發(fā)。 下面為裁剪Linux系統(tǒng)的簡易步驟,僅供參考,如有雷同,絕對不是巧合! 我們的目標 linux 系統(tǒng)運行在一臺普通的 Intel 386 PC 機上,可以有硬盤,也可以不要硬盤,而用 Flash Disk 來代替。如果是用 Flash 盤的話,需要能夠支持從 Flash 盤啟動,而且 Flash 盤的大小要在 16M 字節(jié)或者以上。我們希望用戶一開機啟動,就直接進入 X Window 圖形界面,運行事先指定好的程序。不需要用戶輸入用戶名和密碼進行登錄。 我們設定的這個目標有點像一個 X Terminal 終端工作站。稍加改進,還可以做成干脆無盤的形式,也就是說,連 16M 的 Flash 盤也不要了。不過,這也超出了本文的話題了。讀者朋友們如果有興趣,可以來信和我進行討論。 系統(tǒng)啟動 因為我們要考慮從 Flash 盤進行啟動,所以我們選擇用 LILO 作為我們的 Boot Loader,而不選用 GRUB。這是考慮到 GRUB 有較強的對硬盤和文件系統(tǒng)的識別能力,而 Flash 盤到底不是標準的硬盤,并且我們選用的文件系統(tǒng) GRUB 又不一定認識,搞不好的話 GRUB 反會弄巧成拙。而 LILO 就簡單的多了,它在硬盤開始的 MBR 寫入一個小程序,這個小程序不經過文件系統(tǒng),直接從硬盤扇區(qū)號,讀出 Kernel Image 裝入內存。這樣,保險系數就大大增加。并且也給了我們自由選用文件系統(tǒng)的余地。那么,我們要如何安裝 LILO 呢? 首先,我們要找一塊普通的 800M 左右的 IDE 硬盤,連在目標機器的 IDE 線上。這樣在我們的目標機器上,IDE1 上掛的是 Flash 盤,IDE2 上掛的是一塊工作硬盤。我們用標準的步驟在 IDE2 的標準硬盤上裝上一個 Debian GNU/linux 系統(tǒng)。當然,如果讀者朋友們手頭沒有 Debian,也可以裝 Red Hat 系統(tǒng)。裝好工作系統(tǒng)之后,要首先做一些裁減工作,把不必要的 Service 和 X Window 等等東西都刪掉。這樣做的目的是增進系統(tǒng)啟動速度,因為我們在后面的工作中,肯定要不停的重新啟動機器,所以啟動速度對我們的工作效率是很關鍵的。 裝好工作系統(tǒng)之后,在 Falsh 盤上做一個 Ext2 文件系統(tǒng),這個用 mke2fs 這個命令就可以完成。由于 Flash 盤是接在 IDE1 上的,所以在 linux 里面,它的身份是 /dev/hda。本文作者在操作的時候,把整個 Flash 盤劃分了一個整個的分區(qū),所以,調用 mke2fs 的時候,處理的是 /dev/hda1。讀者朋友們應該可以直接在 /dev/hda 上做一個 Ext2 文件系統(tǒng),而不用事先分區(qū)。 在 Flash 盤上做好了文件系統(tǒng)之后,就可以把一個編譯好的內核映像文件 vmlinuz 拷貝到 Flash 盤上了。注意,必須要先把這個 vmlinuz 映像文件拷貝到 Flash 盤上,然后才能在 Flash 盤上安裝 LILO。不然的話,LILO 到時候可是會 LILILILI 打結巴的,因為它會找不到 Kernel Image 在 Flash 盤上的位置的,那樣的話 Flash 盤也就啟動不起來了。還有,如果讀者朋友們在 Flash 盤上用的是一個壓縮的文件系統(tǒng)的話,到時候 LILO 也會出問題,它雖然能正確的找到 Kernel Image 在硬盤上的起始位置,但是它卻沒有辦法處理被文件系統(tǒng)重新壓縮過的這個 Kernel Image,不知道該如何把它展開到內存中去。 把 Kernel Image 拷貝過去以后,我們就可以動手編輯一份 lilo.conf 文件,這份文件可以就放在工作系統(tǒng)上就行了。但是注意在 lilo.conf 中索引的文件名的路徑可要寫對。這些路徑名都是在工作系統(tǒng)上看上去的路徑名。比如,如果 Flash 盤 Mount 在 /mnt 目錄下面,那么,在 lilo.conf 中,vmlinuz 的路徑名就是 /mnt/vmlinuz。注意這一點千萬不要搞錯。不然的話,如果一不小心把工作系統(tǒng)的 LILO 給破壞掉了,那就麻煩了。編輯好了 lilo.conf,然后再運行 lilo 命令,注意,要告訴它用這個新的 lilo.conf 文件,而不要用 /etc/lilo.conf。 安裝好 LILO 之后,我們可以立即重新啟動,測試一下。首先在 BIOS 里面,設置成從 IDE1 開始啟動,如果我們看到 LILO 的提示符,按回車后還能看到 Kernel 輸出的消息,這就算是 LILO 的安裝成功了。記得這個操作的方法,以后每次我們更新 Flash 盤上的 Kernel Image,都記得要更新 LILO。也就是說,要重新運行一遍 lilo 命令。 編譯內核 試驗成功 LILO 的安裝以后,我們開始考慮編譯一個新的內核。當然,要編譯新的內核,我們首先要進入我們的工作系統(tǒng)。這里有兩個辦法進入工作系統(tǒng),一是在 BIOS 里面設置從 IDE2 啟動,當然,這就要求當初安裝工作系統(tǒng)的時候,要把 LILO 安裝在 /dev/hdb 上;另一個辦法是還是從 IDE1 啟動,不改變 BIOS 的設置,但是在看到 LILO 的提示符的時候,要鍵入 linux root=/dev/hdb1,最前面的 linux 是在 lilo.conf 里面定義的一個 entry,我們只采用這個 entry 所指定的 Kernel Image,但是用 /dev/hdb1 作為 root 文件系統(tǒng)。兩個辦法可能有的時候一個比另一個好,更方便一些。這就要看具體的情況了。不過,它們的設置并不是互相沖突的。 在編譯內核的時候,由于我們的內核是只有一臺機器使用的,所以我們應該對它的情況了如指掌;另外一方面,為了減低不必要的復雜性,我們決定不用 kernel module 的支持,而把所有需要的東西直接編譯到內核的里面。這樣編譯出來的內核,在一臺普通的 586 主板上,把所有必要的功能都加進去,一般也不到 800K 字節(jié)。所以,這個辦法是可行的。而且減低了 init scripts 的復雜程度。從運行方面來考慮,由于需要的 kernel 代碼反正是要裝載到內存中的,所以并不會引起內存的浪費。 在我們的目標平臺上,我們希望使用 USB 存儲設備。還有一點要注意的,就是對 Frame buffer 的支持。這主要是為了支持 XFree86。一般說來,如果我們的顯卡是 XFree86 直接支持的,那當然最好,也就不需要 frame buffer 的內核支持。但是如果 XFree86 不支持我們的顯卡,我們可以考慮用 VESA 模式。但是 XFree86 的 VESA 卡支持運行起來不太漂亮,還有安全方面的問題,有時在啟動和退出 X Window 的時候會出現花屏。所以我們可以采用 kernel 的 vesa 模式的 frame buffer,然后用 xfree86 的 linux frame buffer 的驅動程序。這樣一般就看不到花屏的現象了,而且安全方面也沒有任何問題。 devfs 也是我們感興趣的話題。如果 kernel 不使用 devfs,那么系統(tǒng)上的 root 文件系統(tǒng)就要有 /dev 目錄下面的所有內容。這些內容可以用 /dev/MAKEDEV 腳本來建立,也可以用 mknod 手工一個一個來建。這個方法有其自身的好處。但是它的缺點是麻煩,而且和 kernel 的狀態(tài)又并不一致。相反的,如果使用了 devfs,我們就再也不用擔心 /dev 目錄下面的任何事情了。/dev 目錄下面的項目會有 kernel 的代碼自己負責。實際使用起來的效果,對內存的消耗并不明顯。所以我們選擇 devfs。 busybox 有了 LILO 和 kernel image 之后,接下來,我們要安排 root 文件系統(tǒng)。由于 flash 盤的空間只有 16M 字節(jié),可以說,這是對我們最大的挑戰(zhàn)。這里首先要向大家介紹小型嵌入式 linux 系統(tǒng)安排 root 文件系統(tǒng)時的一個常用的利器:BusyBox。 Busybox 是 Debian GNU/linux 的大名鼎鼎的 Bruce Perens 首先開發(fā),使用在 Debian 的安裝程序中。后來又有許多 Debian developers 貢獻力量,這其中尤推 busybox 目前的維護者 Erik Andersen,他患有癌癥,可是卻是一名優(yōu)秀的自由軟件開發(fā)者。 Busybox 編譯出一個單個的獨立執(zhí)行程序,就叫做 busybox。但是它可以根據配置,執(zhí)行 ash shell 的功能,以及幾十個各種小應用程序的功能。這其中包括有一個迷你的 vi 編輯器,系統(tǒng)不可或缺的 /sbin/init 程序,以及其他諸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat ... 等等這些都是一個正常的系統(tǒng)上必不可少的,但是如果我們把這些程序的原件拿過來的話,它們的體積加在一起,讓人吃不消??墒?busybox 有全部的這么多功能,大小也不過 100K 左右。而且,用戶還可以根據自己的需要,決定到底要在 busybox 中編譯進哪幾個應用程序的功能。這樣的話,busybox 的體積就可以進一步縮小了。 使用 busybox 也很簡單。只要建一個符號鏈接,比方 ln -s /bin/busybox /bin/ls,那么,執(zhí)行 /bin/ls 的時候,busybox 就會執(zhí)行 ls 的功能,也會按照 ls 的方式處理命令行參數。又比如 ln -s /bin/busybox /sbin/init,這樣我們就有了系統(tǒng)運行不可或缺的 /sbin/init 程序了。當然,這里的前提是,你在 busybox 中編譯進去了這兩個程序的功能。 這里面要提出注意的一點是,busybox 的 init 程序所認識的 /etc/inittab 的格式非常簡單,而且和常規(guī)的 inittab 文件的格式不一樣。所以讀者朋友們在為這個 busybox 的 init 寫 inittab 的時候,要注意一下不同的語法。至于細節(jié),就不在我們這里多說了,請大家參考 Busybox 的用戶手冊。 從啟動到進入 shell busybox 安裝好以后,我們就可以考慮重新啟動,一直到進入 shell 提示符了。這之前,我們要準備一下 /etc 目錄下的幾個重要的文件,而且要把 busybox 用到的 library 也拷貝過來。 用 ldd 命令,后面跟要分析的二進制程序的路徑名,就可以知道一個二進制程序,或者是一個 library 文件之間的互相依賴關系,比如 busybox 就依賴于 libc.so 和 ld-linux.so ,我們有了這些知識,就可把動手把所有需要的 library 拷貝到 flash 盤上。由于我們的 flash 盤說大不大,說小倒也不小,有 16M 字節(jié)之多。我們直接就用 Glibc 的文件也沒有太多問題。如果讀者朋友們有特殊的需要,覺得 Glibc 太龐大了的話,可以考慮用 uClibc,這是一個非常小巧的 libc 庫,功能當然沒有 Glibc 全,但是足夠一個嵌入式系統(tǒng)使用了。本文就不再介紹 uClibc 了。 庫程序拷貝過來以后,我們就可以考慮系統(tǒng)啟動的步驟了。啟動的時候,先是 lilo,接下來就是 kernel,kernel 初始化之后,就調用 /sbin/init,然后由 init 解釋 /etc/inittab 運行各種各樣的東西。inittab 會指導 init 去調用一個最重要的系統(tǒng)初始化程序 /etc/init.d/rcS,我們將要在 rcS 中完成各個文件系統(tǒng)的 mount,此外,還有在 rcS 中調用 dhcp 程序,把網絡架起來。rcS 執(zhí)行完了以后,init 就會在一個 console 上,按照 inittab 的指示開一個 shell,或者是開 getty + login,這樣用戶就會看到提示輸入用戶名的提示符。我們這里為了簡單起見,先直接進入 shell,然后等到調試成功以后,再改成直接進入 X Window。 關于 inittab 的語法,我們上面已經提到過了,希望讀者朋友們去查權威的 busybox 的用戶手冊。這里,我們先要講一下文件系統(tǒng)的構成情況。 安排文件系統(tǒng) 大家已經看到,我們的 root 文件系統(tǒng)為了避免麻煩,用的是標準的 ext2 文件系統(tǒng)。由于我們的硬盤空間很小,只有不到 16M,而且我們還要在上面放上 X Window,所以,如果我們全部用 ext2 的話,Flash 盤的有限空間會很快耗盡。我們唯一的選擇是采用一個適當的壓縮文件系統(tǒng)。考慮到 /usr 目錄下面的內容在系統(tǒng)運行的時候,是不需要被改寫的。我們決定選擇只讀的壓縮文件系統(tǒng) cramfs 來容納 /usr 目錄下面的全部內容。 cramfs 是 Linus Torvalds 本人開發(fā)的一個適用于嵌入式系統(tǒng)的小文件系統(tǒng)。由于它是只讀的,所以,雖然它采取了 zlib 做壓縮,但是它還是可以做到高效的隨機讀取。既然 cramfs 不會影響系統(tǒng)讀取文件的速度,又是一個高度壓縮的文件系統(tǒng),對于我們,它就是一個相當不錯的選擇了。 我們首先把 /usr 目錄下的全部內容制成一個 cramfs 的 image 文件。這可以用 mkcramfs 命令完成。得到了這個 usr.img 文件之后,我們還要考慮怎樣才能在系統(tǒng)運行的時候,把這個 image 文件 mount 上來,成為一個可用的文件系統(tǒng)。由于這個 image 文件不是一個通常意義上的 block 設備,我們必須采用 loopback 設備來完成這一任務。具體說來,就是在前面提到的 /etc/init.d/rcS 腳本的前面部分,加上一行 mount 命令: mount -o loop -t cramfs /usr.img /usr 這樣,就可以經由 loopback 設備,把 usr.img 這個 cramfs 的 image 文件 mount 到 /usr 目錄上去了。哦,對了,由于要用到 loopback 設備,讀者朋友們在編譯內核的時候,別忘了加入內核對這個設備的支持。對于系統(tǒng)今后的運行來說,這個 mount 的效果是透明的。cramfs 的壓縮效率一般都能達到將近 50%,而我們的系統(tǒng)上絕大部分的內容是位于 /usr 目錄下面,這樣一來,原本可能要用到 18M 的 Flash 盤,現在可能只需要 11M 就可以了。一個 14M 的 /usr 目錄,給壓縮成了僅僅 7M。 上面考慮了壓縮問題,下面還要考慮到,Flash 盤畢竟不像普通硬盤,多次的擦寫畢竟不太好,所以我們考慮,在需要多次擦寫的地方,使用內存來做。這個任務,我們考慮用 tmpfs 來完成。至于 tmpfs 和經典的 ramdisk 的比較,我們這里就不多說了。一般說來,tmpfs 更加靈活一些,tmpfs 的大小不像 ramdisk,可以順著用戶的需要增長或者縮小。我們選擇把 /tmp、/var 等幾個目錄做成 tmpfs。這只需要我們在 /etc/fstab 里面加上兩行類似下面的文字就可以了: none /var tmpfs default 0 0 然后別忘了在 /etc/init.d/rcS 里面靠近開頭的地方,加上 mount -a。這樣,就可以把 /etc/fstab 里面指定的所有的文件系統(tǒng)都 mount 上來了。 X Window 進行到這里,讀者朋友們可能會以為,X Window 的安裝可能會很復雜。其實不然,由于我們上面的架子搭好了,X Window 的安裝非常簡單,只需要把幾個關鍵的程序拷貝過來就可以了。一般說來,只需要 /usr/X11R6 目錄下面的 bin 和 lib 兩個目錄。然后,根據用戶各自的需要,還可以做大幅的裁減。比如,如果你的局域網上有一個開放的 xfs 字體服務器的話,你可以把所有本地的字體都刪掉,而使用遠端的字體服務器。如果只需要運行有限的程序,別忘了把沒有用的 library 都刪掉。此外,還可以把多余的 X Window 的 driver 都刪掉,只保留本機的顯示卡所需要的 driver 就可以了。當然,這一關免不了要做多次測試。 其它技巧 如果你的工作系統(tǒng)式在另外一臺機器上,通過局域網和本機互聯的話,ssh 是一個不錯的工具。此外,ssh 中帶的 scp 用起來和普通的 cp 拷貝程序差不多,非常方便。用 ssh 和 scp 來共享文件,遠程試驗,你就可以不需要在辦公室里跑來跑去的了。 如果你需要一個 MS Windows 上運行的 X Server 和 xfs 字體服務器,可以考慮包括在 Red Hat 的 Cygwin 工具箱中的 XFree86 系統(tǒng)

標簽:

點贊

分享到:

上一篇:我國工控自動化現狀與趨勢

下一篇:微能WIN-V63矢量控制變頻器在...

中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(m.u63ivq3.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。

本網轉載并注明其他來源的稿件,均來自互聯網或業(yè)內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

網站簡介|會員服務|聯系方式|幫助信息|版權信息|網站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網-工業(yè)自動化與智能制造的全媒體“互聯網+”創(chuàng)新服務平臺

網站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網安備 44030402000946號