減少Linux的系統佔用,為應用程式保留更多的資源,減少裝置的硬體成本。“你能做到多小?”這個問題通常在嵌入式工程師開始他們的專案時問到。大多數時候,問這個問題的人是想減少RAM和Flash資源,減少裝置的單位成本或能源需求。
因為Linux最初是為桌面或伺服器系統設計的,預設情況下,它沒有為尺寸大小進行過最佳化,無論如何,Linux正被越來越多地用在嵌入式裝置中,要讓Linux變小不是一件容易的事情,這裡有幾個減少系統佔用記憶體的方法。
許多工程師是從減少核心大小開始的,這裡有個容易著手的方法,本文將詳細介紹如何減少核心的大小,主要透過移除那些在一個典型的嵌入式系統中用不到的程式碼。
在一個系統中根檔案系統(RFS)可能是記憶體資源最大的消耗者。根檔案系統包括了應用程式和c庫使用到的基礎結構程式碼。
為RFS選擇檔案系統對最後的大小有非常大的影響,標準是ext3,從一個嵌入式工程師的眼光來看它的效率是非常低的,但那是另一篇文章的主題了。
實際中,如何減小?
即使最小的Linux發行版至少也有兩部分:核心和根檔案系統。有時,這些部件駐紮在同一個檔案中,但是它們仍然分成不同的部件。
從核心中移除特徵幾乎差不多的所有程式碼,這樣一個系統很容易就減少到不到1MB大小。但是,許多使用者選擇Linux支援網路和不同裝置,因此這不是一個現實的做法。
核心
Linux核心非常有趣,儘管在編譯時它依賴GCC,但執行時它卻不依賴。那些工程師將目光轉向Linux初始化RAM磁碟(所謂的initrd),它是核心執行時的附屬物。
Initrd首先是由核心載入的,程式執行時詢問系統需要載入什麼模組以便支援裝置,這樣真實的根檔案系統才能被載入。實際上,有兩步載入過程,載入initrd後再載入真實的根檔案系統,很少發現嵌入式系統中有根檔案系統,因為這樣在一個系統中會增加靈活性,對這個系統做改動要花費額外的空間或時間,嵌入式系統一般不需要靈活性。
可載入模組支援
核心載入模組是重新定位執行時核心連線到它自身的程式碼,典型的可載入模組的例子是允許從使用者空間載入驅動到核心中(某些探測程序執行後),以及不關閉系統升級裝置驅動。對於大多數嵌入式系統而言,一旦它們處於該範圍之外,修改根檔案系統要麼不現實要麼不可能。
因此係統設計者直接將模組連線到核心中,移除那些可載入的模組,節約出來的空間對於核心來說是很多的,無論如何,程式管理可載入的模組(如insmod\rmmod\lsmod)和shell指令碼載入它們不是必需的。
Linux-tiny補丁
Linux-tiny補丁集已經變得時有時無的專案了,最初是由Matt Mackall在主持。
消費電子Linux論壇(CLEF)正在努力恢復這個專案,CLEF開發者WiKi已經給2。6。22。5核心(寫本文時的最新版本)釋出了補丁,同時,Linux-tiny專案的許多改變已經包括在主線核心中,儘管許多原始的Linux-tiny補丁已經整合到核心中,但實質上節約空間的補丁還沒有整合進去。
如:
1、 Fine-grain printk support【細粒度printk支援】:使用者可以控制什麼檔案可以使用printk。工程師將從不使用printk的檔案大小中受益。
2、 Change CRC from calculation to use table lookup【改變CRC演算法從計算到使用表查詢】:乙太網資料包需要一個CRC來校驗資料包的準確性。
這個CRC演算法實現使用表查詢替換了計算,節約了大約2K。
3、 Network tweaking【網路調整】:幾個補丁包減少支援的網路協議,快取大小和開啟的套接字。許多嵌入式裝置僅支援少量的協議,不需要有成百上千連線的服務。
4、 No panic reporting【無應急報告】:如果裝置有三個狀態燈,一系列的連線,使用者不能看到,更少的影響,應急資訊顯示在一個不存在的終端上。
如果裝置發生核心應急失效,使用者只需要重新啟動裝置即可。
5、 Reduction of inlining【減少直接插入】:直接插入是編譯器將程式碼作為宏複製到它呼叫的每個位置,而不是產生一個函式呼叫。GCC預設將直接插入任何函式。透過抑制直接插入函式,程式碼執行稍微慢一點,因為編譯器需要為呼叫和返回產生程式碼,得到的報酬是物件檔案更小了。
減少Linux的系統佔用,為應用程式保留更多的資源,減少裝置的硬體成本。“你能做到多小?”這個問題通常在嵌入式工程師開始他們的專案時問到。大多數時候,問這個問題的人是想減少RAM和Flash資源,減少裝置的單位成本或能源需求。
因為Linux最初是為桌面或伺服器系統設計的,預設情況下,它沒有為尺寸大小進行過最佳化,無論如何,Linux正被越來越多地用在嵌入式裝置中,要讓Linux變小不是一件容易的事情,這裡有幾個減少系統佔用記憶體的方法。
許多工程師是從減少核心大小開始的,這裡有個容易著手的方法,本文將詳細介紹如何減少核心的大小,主要透過移除那些在一個典型的嵌入式系統中用不到的程式碼。
在一個系統中根檔案系統(RFS)可能是記憶體資源最大的消耗者。根檔案系統包括了應用程式和c庫使用到的基礎結構程式碼。
為RFS選擇檔案系統對最後的大小有非常大的影響,標準是ext3,從一個嵌入式工程師的眼光來看它的效率是非常低的,但那是另一篇文章的主題了。
實際中,如何減小?
即使最小的Linux發行版至少也有兩部分:核心和根檔案系統。有時,這些部件駐紮在同一個檔案中,但是它們仍然分成不同的部件。
從核心中移除特徵幾乎差不多的所有程式碼,這樣一個系統很容易就減少到不到1MB大小。但是,許多使用者選擇Linux支援網路和不同裝置,因此這不是一個現實的做法。
核心
Linux核心非常有趣,儘管在編譯時它依賴GCC,但執行時它卻不依賴。那些工程師將目光轉向Linux初始化RAM磁碟(所謂的initrd),它是核心執行時的附屬物。
Initrd首先是由核心載入的,程式執行時詢問系統需要載入什麼模組以便支援裝置,這樣真實的根檔案系統才能被載入。實際上,有兩步載入過程,載入initrd後再載入真實的根檔案系統,很少發現嵌入式系統中有根檔案系統,因為這樣在一個系統中會增加靈活性,對這個系統做改動要花費額外的空間或時間,嵌入式系統一般不需要靈活性。
可載入模組支援
核心載入模組是重新定位執行時核心連線到它自身的程式碼,典型的可載入模組的例子是允許從使用者空間載入驅動到核心中(某些探測程序執行後),以及不關閉系統升級裝置驅動。對於大多數嵌入式系統而言,一旦它們處於該範圍之外,修改根檔案系統要麼不現實要麼不可能。
因此係統設計者直接將模組連線到核心中,移除那些可載入的模組,節約出來的空間對於核心來說是很多的,無論如何,程式管理可載入的模組(如insmod\rmmod\lsmod)和shell指令碼載入它們不是必需的。
Linux-tiny補丁
Linux-tiny補丁集已經變得時有時無的專案了,最初是由Matt Mackall在主持。
消費電子Linux論壇(CLEF)正在努力恢復這個專案,CLEF開發者WiKi已經給2。6。22。5核心(寫本文時的最新版本)釋出了補丁,同時,Linux-tiny專案的許多改變已經包括在主線核心中,儘管許多原始的Linux-tiny補丁已經整合到核心中,但實質上節約空間的補丁還沒有整合進去。
如:
1、 Fine-grain printk support【細粒度printk支援】:使用者可以控制什麼檔案可以使用printk。工程師將從不使用printk的檔案大小中受益。
2、 Change CRC from calculation to use table lookup【改變CRC演算法從計算到使用表查詢】:乙太網資料包需要一個CRC來校驗資料包的準確性。
這個CRC演算法實現使用表查詢替換了計算,節約了大約2K。
3、 Network tweaking【網路調整】:幾個補丁包減少支援的網路協議,快取大小和開啟的套接字。許多嵌入式裝置僅支援少量的協議,不需要有成百上千連線的服務。
4、 No panic reporting【無應急報告】:如果裝置有三個狀態燈,一系列的連線,使用者不能看到,更少的影響,應急資訊顯示在一個不存在的終端上。
如果裝置發生核心應急失效,使用者只需要重新啟動裝置即可。
5、 Reduction of inlining【減少直接插入】:直接插入是編譯器將程式碼作為宏複製到它呼叫的每個位置,而不是產生一個函式呼叫。GCC預設將直接插入任何函式。透過抑制直接插入函式,程式碼執行稍微慢一點,因為編譯器需要為呼叫和返回產生程式碼,得到的報酬是物件檔案更小了。