技術(shù)頻道

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

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

時(shí)間:2007-04-26 16:52:00來源:lihan

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

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:我國工控自動(dòng)化現(xiàn)狀與趨勢(shì)

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

中國傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動(dòng)網(wǎng)(www.treenowplaneincome.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

中國傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號(hào) | 營業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)