|
這篇是版主前陣子所寫的一篇文章,如果各位網友有其他的獨特見解與看法,歡迎一起加入來討論。
- @- c' b$ T+ C. S: f! `. }) A8 g" E$ o3 `
在崁入式開發環境中 , 最常遭遇的環境之一就是編譯出來的footprint太大 , 而導致必須採用較大的Flash儲存而形成成本的增加。6 x$ G" t# v2 ?6 E: P- H; A
為了要解決此類的問題 , 一般會有以下幾種作法:
( s7 C# f; W) V- A6 G( ] C" y1. 僅使用boot loader在Flash device , 將 Kernel/Application image儲存於硬碟或是USB Flash /SD等類似的儲存媒體。
0 }7 z7 A5 h" K2 a3 I9 O 此類的解決方案大多是以NAS相關的產品居多 , 並且有比較完整的配套方式。譬如網路儲存大廠群暉科技(synology)提供顧客所附加的工具程式 , 就具備將硬碟格式化後並將Kernel/Application image置於硬碟的固定位置 , Boot loader執行結束後就跳到硬碟去執行此image.
2 C6 }1 @0 H" i- l& o + E \& m6 {6 Z
2. 選擇適當的 C Library , 可以使編譯出來的image也同步縮小. 但這會有一些問題產生 , 也可能將開發時間加長。
* U% {2 }+ |3 ~7 Z 以下介紹三種不同的 C Library5 i8 k$ y. }1 g
GLibc:一般稱之為 GNU C Library , 是目前在Desktop Linux最受普羅大眾所喜愛與採用
1 u+ l) n3 `6 p# P Pros: 函式庫支援最多而且沒有相容性問題$ m6 e9 i' E/ F6 g" a" T3 V! R
Cons: 編譯出來的footprinte過大 不適用於產品量產化* D0 w6 s% e9 S! w6 z
2 `( L- l: b$ [2 t4 Q) n$ N
uCLibc: 目前在崁入式Linux開發環境中 , 最常被拿來使用的C Libary. 一般而言 , 只要將source code在uCLibc重新編譯就可以在Kernel/Application執行 , 但open source並不一定會用uCLibc編譯 , 所以有時會花很多時間解決相容性的問題。( ?$ ~4 v+ D: |; ~% \0 n9 w6 \, t5 L
Pros: 編譯出來的footprint很小 最適用於產品量產化
' @5 x; g8 Q% M, A, T8 ^ Cons: 函式庫支援較少而且會有相容性問題# l. I6 T% p# c, e4 d, g, _
7 f5 y6 t) l8 N* E, |
EGLibc: 全名為Embedded GLIBC , 是不同版本的GNU C Library 主要以崁入式開發環境為考量。目的是要將source與binary都能相容於GLibc.而且對縮小code size與結構劃設定都有比GLibc改善+ D# T1 B; ?- i% {2 |. `
Pros: 函式庫支援最多而且沒有相容性問題4 X5 W3 v4 }, d4 h) T
Cons: 編譯出來的footprinte過大 不適用於產品量產化
/ l- h a! F3 b! R/ f
: c) b( L1 p' O: U 基本上 , 一樣的source code在此三種C Library中 , 編譯後所表現出的差異為:
9 t& D4 x6 D: Z( Y) v* m4 n Footprint size(由大到小): GLibc > EGLib > uCLibc
& Z, Y6 D% C- \6 y# ^, { Compatibility (由最佳到次之): GLibc = EGLib > uCLibc9 i: R- u8 s( z$ B
]0 Q7 N# |% v. Z) G m3. 另外, 還有一些技巧可以應用在縮減footprint的大小. 在此列舉一些常用方式提供參考。& H# w) T) p. q" f4 l2 F# N8 a
- 靜態連結 (Static link) vs.動態連結(Dynamic Link)
w8 f) M7 d) V" y! e1 }8 L* F+ r0 @ Footprint size(由大到小): 靜態連結 (Static link) > 動態連結(Dynamic Link)! L8 _5 }5 m5 v& }
Systemoverhead(由大到小): 動態連結(Dynamic Link) > 靜態連結 (Static link)
: u9 b2 L! W$ @, Y0 j5 l 取決於所需與目的所在.
0 x0 `8 m* x# F6 N( u - w4 @: g0 r; A' u# s
- 可以使用Linux Kernel 2.4 就不要用 2.6,雖然2.6提供較多的支援如IPv6與protocol ... etc.但相對的footprint就比較大.
! E/ l* |* b1 r7 V; ?
! L* V J0 {1 t" \ - 在Linux kernel Menu Configure將不必要的module都不要選, 減少footprint
# g! I7 z F6 Q9 q9 }! i8 U# h+ x : u; j9 h0 L8 @0 c* |6 r7 F6 l& Y
- 透過壓縮率較佳的程式,將Kernel/Application image壓縮到極緻化.藉由解壓縮後,將file system解壓縮到memory,而此做法通常稱為RAMDisk.+ i9 z2 Z' L1 t. b1 b% e, I R+ ~
Pros: 減少footprint size' `0 d$ F% t% h& f! F4 G; s+ N+ O
Cons: 浪費部分記憶體空間做RAMDisk虛擬磁碟使用,增加解壓縮程式的binary file size與解壓縮image時間. {! B$ p! \: a5 H
3 N+ E. K6 O5 w
折衷的取代方案為CramFS,可以即時運算壓縮後的資料儲存位置然後解壓縮到記憶體中執行. & J! b, C( x/ ?! \& m4 E+ X* e
缺點為CramsFS是一個唯讀的檔案系統 ,系統須在Flash保留空間做儲存資料之用。& I5 K* H% c$ M- W
0 L: D7 j7 i% O; K, G
# B' d/ Q6 O7 l# H- }! j
6 X+ M6 z4 o7 `相關資料:
5 s- ?$ l$ \- W9 A! _; `( Nhttp://www.synology.com.tw/cht/index.php( C& r: E( l( J' H( }
http://www.eglibc.org/home% f$ s: s% K& J+ C6 ~
http://www.gnu.org/software/libc/
3 P& O% T" I# e7 {8 `http://www.uclibc.org/" w# z+ {+ C8 a- ^
Z* {# e5 O: k8 d
[ 本帖最後由 jacky002 於 2008-1-28 10:21 PM 編輯 ] |
|