Chip123 科技應用創新平台

標題: 崁入式開發環境 - 減少footprint方式 [打印本頁]

作者: jacky002    時間: 2008-1-28 10:20 PM
標題: 崁入式開發環境 - 減少footprint方式
這篇是版主前陣子所寫的一篇文章,如果各位網友有其他的獨特見解與看法,歡迎一起加入來討論。* c$ A4 P# B1 r8 [& E! k3 d
6 _  q# t( Y- H4 u, d7 I. ~+ t
在崁入式開發環境中 , 最常遭遇的環境之一就是編譯出來的footprint太大 , 而導致必須採用較大的Flash儲存而形成成本的增加。
2 h/ n" _9 b2 K9 a  P為了要解決此類的問題 , 一般會有以下幾種作法:
% K/ N: f0 M' ?* t& Q1. 僅使用boot loader在Flash device , 將 Kernel/Application image儲存於硬碟或是USB Flash /SD等類似的儲存媒體。# |" ^6 c1 d4 v  ^( K! }6 J* ^
   此類的解決方案大多是以NAS相關的產品居多 , 並且有比較完整的配套方式。譬如網路儲存大廠群暉科技(synology)提供顧客所附加的工具程式 , 就具備將硬碟格式化後並將Kernel/Application image置於硬碟的固定位置 , Boot loader執行結束後就跳到硬碟去執行此image.+ ~* e. E6 l. K* g# j, l
   
8 z# b( v' @8 ^1 g5 E; Q; I2. 選擇適當的 C Library , 可以使編譯出來的image也同步縮小. 但這會有一些問題產生 , 也可能將開發時間加長。! v: |( ^2 q- @. j& o
   以下介紹三種不同的 C Library
8 h& s  y7 I  @9 ]" K- b9 b# S   GLibc:一般稱之為 GNU C Library , 是目前在Desktop Linux最受普羅大眾所喜愛與採用) u1 Y$ e( y$ g/ [2 G
       Pros: 函式庫支援最多而且沒有相容性問題6 w* U4 P/ `% h3 t. t9 {
       Cons: 編譯出來的footprinte過大 不適用於產品量產化
" s: N& W. G; t0 Q3 |   
% z- a" \( ], f( p   uCLibc: 目前在崁入式Linux開發環境中 , 最常被拿來使用的C Libary. 一般而言 , 只要將source code在uCLibc重新編譯就可以在Kernel/Application執行 , 但open source並不一定會用uCLibc編譯 , 所以有時會花很多時間解決相容性的問題。' S( k- o: u5 F
       Pros: 編譯出來的footprint很小 最適用於產品量產化
% [: _  V, ^/ j; A: \, f4 X       Cons: 函式庫支援較少而且會有相容性問題
8 \7 e: N: K- A7 q% w   : N: {" q5 M. z) [
   EGLibc: 全名為Embedded GLIBC , 是不同版本的GNU C Library 主要以崁入式開發環境為考量。目的是要將source與binary都能相容於GLibc.而且對縮小code size與結構劃設定都有比GLibc改善$ D$ \! d  b- u
       Pros: 函式庫支援最多而且沒有相容性問題& n  F& l+ A, Y; }- t  y
       Cons: 編譯出來的footprinte過大 不適用於產品量產化   
% }" X  O3 ^/ d' g4 h" V# J   
5 e# L3 d1 k' K0 N1 z   基本上 , 一樣的source code在此三種C Library中 , 編譯後所表現出的差異為:
4 E% g4 n/ I2 h' d; J; D- W7 z$ e   Footprint size(由大到小): GLibc > EGLib >  uCLibc+ P/ [6 ]  U* Z2 p
   Compatibility (由最佳到次之): GLibc = EGLib >  uCLibc
0 n& T8 |7 T6 J1 V$ A   
0 C2 K6 G% h4 z% p. ~3. 另外, 還有一些技巧可以應用在縮減footprint的大小. 在此列舉一些常用方式提供參考。% L: u0 a0 U% @% @
   - 靜態連結 (Static link) vs.動態連結(Dynamic Link)+ \( n5 }3 V4 u  n3 Q
     Footprint size(由大到小): 靜態連結 (Static link) > 動態連結(Dynamic Link)
& T& I. Z+ k4 j2 G7 _% h1 Y. |# J     Systemoverhead(由大到小): 動態連結(Dynamic Link) > 靜態連結 (Static link). R, n+ H* O, P6 I% G2 V
     取決於所需與目的所在.  T" r8 ^7 o1 P, o
      . W/ ?/ y- K& J) o1 H% h! O/ z
   - 可以使用Linux Kernel 2.4 就不要用 2.6,雖然2.6提供較多的支援如IPv6與protocol ... etc.但相對的footprint就比較大.
- l6 G0 n. y( C5 h( J. Y) Z   
* X! T; l/ J2 `' o   - 在Linux kernel Menu Configure將不必要的module都不要選, 減少footprint5 O6 f* E2 |. O: x, [3 K( R* R4 c
   
0 ~3 }: l  p0 P# o9 J0 h   - 透過壓縮率較佳的程式,將Kernel/Application image壓縮到極緻化.藉由解壓縮後,將file system解壓縮到memory,而此做法通常稱為RAMDisk.. {! ^( p# S( s0 D( G9 n2 H; V
     Pros: 減少footprint size
% s- G: f5 U4 u2 \! k  J     Cons: 浪費部分記憶體空間做RAMDisk虛擬磁碟使用,增加解壓縮程式的binary file size與解壓縮image時間
  b0 S! B/ |% E) O5 o, C     
+ D2 k' [3 C. x" Y9 N. o/ }# [     折衷的取代方案為CramFS,可以即時運算壓縮後的資料儲存位置然後解壓縮到記憶體中執行.
7 q4 P. M. _4 K( }" @  f6 m     缺點為CramsFS是一個唯讀的檔案系統 ,系統須在Flash保留空間做儲存資料之用。
; l. ]$ J; w, ^3 ]+ @$ d' Z8 u. ?( D
. y2 @3 [  |* `# `; j$ C! Y3 {) L
5 l, y1 X; B& g8 [# l   * u% F5 `+ Q8 l
相關資料:
, G2 i; a- ~9 Y8 ~! Q+ Khttp://www.synology.com.tw/cht/index.php
# P8 t* p+ R; \& v- R" p' yhttp://www.eglibc.org/home8 N9 z) q# u/ ?# h1 b) u' F2 z
http://www.gnu.org/software/libc/
3 o" A" C4 }" L/ q- ]/ ^& ?http://www.uclibc.org/
8 X9 e+ W$ a$ [7 q8 ^6 _& Y- _# K( G
[ 本帖最後由 jacky002 於 2008-1-28 10:21 PM 編輯 ]




歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/) Powered by Discuz! X3.2