減少Linux的系統(tǒng)占用,為應(yīng)用程序保留更多的資源,減少設(shè)備的硬件成本。“你能做到多小?”這個問題通常在嵌入式工程師開始他們的項(xiàng)目時問到。大多數(shù)時候,問這個問題的人是想減少RAM和Flash資源,減少設(shè)備的單位成本或能源需求。
因?yàn)長inux最初是為桌面或服務(wù)器系統(tǒng)設(shè)計(jì)的,默認(rèn)情況下,它沒有為尺寸大小進(jìn)行過優(yōu)化,無論如何,Linux正被越來越多地用在嵌入式設(shè)備中,要讓Linux變小不是一件容易的事情,這里有幾個減少系統(tǒng)占用內(nèi)存的方法。
許多工程師是從減少內(nèi)核大小開始的,這里有個容易著手的方法,本文將詳細(xì)介紹如何減少內(nèi)核的大小,主要通過移除那些在一個典型的嵌入式系統(tǒng)中用不到的代碼。
在一個系統(tǒng)中根文件系統(tǒng)(RFS)可能是內(nèi)存資源最大的消耗者。根文件系統(tǒng)包括了應(yīng)用程序和c庫使用到的基礎(chǔ)結(jié)構(gòu)代碼。為RFS選擇文件系統(tǒng)對最后的大小有非常大的影響,標(biāo)準(zhǔn)是ext3,從一個嵌入式工程師的眼光來看它的效率是非常低的,但那是另一篇文章的主題了。
實(shí)際中,如何減小?
即使最小的Linux發(fā)行版至少也有兩部分:內(nèi)核和根文件系統(tǒng)。有時,這些部件駐扎在同一個文件中,但是它們?nèi)匀环殖刹煌牟考膬?nèi)核中移除特征幾乎差不多的所有代碼,這樣一個系統(tǒng)很容易就減少到不到1MB大小。但是,許多用戶選擇Linux支持網(wǎng)絡(luò)和不同設(shè)備,因此這不是一個現(xiàn)實(shí)的做法。
內(nèi)核
Linux內(nèi)核非常有趣,盡管在編譯時它依賴GCC,但運(yùn)行時它卻不依賴。那些工程師將目光轉(zhuǎn)向Linux初始化RAM磁盤(所謂的initrd),它是內(nèi)核運(yùn)行時的附屬物。Initrd首先是由內(nèi)核加載的,程序運(yùn)行時詢問系統(tǒng)需要載入什么模塊以便支持設(shè)備,這樣真實(shí)的根文件系統(tǒng)才能被加載。實(shí)際上,有兩步加載過程,加載initrd后再加載真實(shí)的根文件系統(tǒng),很少發(fā)現(xiàn)嵌入式系統(tǒng)中有根文件系統(tǒng),因?yàn)檫@樣在一個系統(tǒng)中會增加靈活性,對這個系統(tǒng)做改動要花費(fèi)額外的空間或時間,嵌入式系統(tǒng)一般不需要靈活性。但本文稍后將討論根文件系統(tǒng)。
可載入模塊支持
內(nèi)核載入模塊是重新定位運(yùn)行時內(nèi)核連接到它自身的代碼,典型的可載入模塊的例子是允許從用戶空間載入驅(qū)動到內(nèi)核中(某些探測進(jìn)程執(zhí)行后),以及不關(guān)閉系統(tǒng)升級設(shè)備驅(qū)動。對于大多數(shù)嵌入式系統(tǒng)而言,一旦它們處于該范圍之外,修改根文件系統(tǒng)要么不現(xiàn)實(shí)要么不可能。因此系統(tǒng)設(shè)計(jì)者直接將模塊連接到內(nèi)核中,移除那些可載入的模塊,節(jié)約出來的空間對于內(nèi)核來說是很多的,無論如何,程序管理可載入的模塊(如insmod\rmmod\lsmod)和shell腳本載入它們不是必需的。
Linux-tiny補(bǔ)丁
Linux-tiny補(bǔ)丁集已經(jīng)變得時有時無的項(xiàng)目了,最初是由Matt Mackall在主持。消費(fèi)電子Linux論壇(CLEF)正在努力恢復(fù)這個項(xiàng)目,CLEF開發(fā)者WiKi已經(jīng)給2.6.22.5內(nèi)核(寫本文時的最新版本)發(fā)布了補(bǔ)丁,同時,Linux-tiny項(xiàng)目的許多改變已經(jīng)包括在主線內(nèi)核中,盡管許多原始的Linux-tiny補(bǔ)丁已經(jīng)集成到內(nèi)核中,但實(shí)質(zhì)上節(jié)約空間的補(bǔ)丁還沒有集成進(jìn)去。
如:
1、 Fine-grain printk support:用戶可以控制什么文件可以使用printk。工程師將從不使用printk的文件大小中受益。
2、 Change CRC from calculation to use table lookup:以太網(wǎng)數(shù)據(jù)包需要一個CRC來校驗(yàn)數(shù)據(jù)包的準(zhǔn)確性。這個CRC算法實(shí)現(xiàn)使用表查詢替換了計(jì)算,節(jié)約了大約2K。
3、 Network tweaking:幾個補(bǔ)丁包減少支持的網(wǎng)絡(luò)協(xié)議,緩存大小和打開的套接字。許多嵌入式設(shè)備僅支持少量的協(xié)議,不需要有成百上千連接的服務(wù)。
4、 No panic reporting:如果設(shè)備有三個狀態(tài)燈,一系列的連接,用戶不能看到,更少的影響,應(yīng)急信息顯示在一個不存在的終端上。如果設(shè)備發(fā)生內(nèi)核應(yīng)急失效,用戶只需要重新啟動設(shè)備即可。
5、 Reduction of inlining:直接插入是編譯器將代碼作為宏拷貝到它調(diào)用的每個位置,而不是產(chǎn)生一個函數(shù)調(diào)用。GCC默認(rèn)將直接插入任何函數(shù)。通過抑制直接插入函數(shù),代碼運(yùn)行稍微慢一點(diǎn),因?yàn)榫幾g器需要為調(diào)用和返回產(chǎn)生代碼,得到的報(bào)酬是對象文件更小了。
Linux-tiny補(bǔ)丁發(fā)布成一個tar包,它可以一起應(yīng)用,也可以一個一個單獨(dú)應(yīng)用。
| 共4頁: 1 [2] [3] [4] 下一頁 | ||||||
|


