萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 做一個最小的Linux kernel

做一個最小的Linux kernel

class="22283"> Linux;能有多小呢;?;每一個做;embedded;系統的人都把小看成第一要務,其實這是不對的。如果我們對系統的好壞和大小作圖,它應該長得像
|
|----
|
|;-----
|;
|;--------
|;---
|-----------------------;

小當然不會比較壞,但不一定比較好。如果系統使用;4MB;和;5MB;沒有價格或性能上的差別,那;4MB;和;5MB;是一樣好的。;

到底有多小;
廢話說了一堆,那到底;Linux;有多小呢?;好吧,各位這麼有小牛頓的精神。我也只好想辦法生一個答案出來了。;

首先我必須聲明,我的不一定最小。不要說我在欺騙世人,你的核心比我小。我無意比較,我的數據只是給大家一個參考而己。不過我歡迎大家提出自己的心得,告訴大家怎麼樣做出更小的核心。;

我使用的是;Mandrake;內付的;2.2.15,我沒有修改任何一行程序碼,完全只靠修改組態檔得到這些數據。;

首先,使用;make;xconfig;把所有可以拿掉的選項都拿得。;

不要;floppy
不要;SMP,MTRR
不要;networking,SCSI
把所有的;block;device;移除,只留下;old;IDE;device
把所有的;character;device;移除
把所有的;filesystem;移除,只留下;minix
不要;sound;支援
相信我,我己經把所有的選項都移除了。這樣做之後,我得到了一個;188K;的核心。
還不夠小嗎?;OK,再加上一招,請把下列二個檔案中的;-O3,-O2;用;-Os;取代。
./Makefile
./arch/i386/kernel/Makefile;

這樣一來,整個核心水小了;9K,成為;179K。;

不過這個核心恐怕很難發揮;Linux;的功能,因此我決定把網絡加回去。把;General;中的;network;support;加回去,重新編譯,核心變成;189;K。10K;換個;TCP/IP;stack,似乎是很上算的生意。;

不過有;stack;沒有;driver;也是惘然,所以我把;embedded;board;常用的;RTL8139;的;driver;加回去,195K。;

如果你需要;DOS;檔案系統,那大小成為;213K。如果;minix;用;ext2;換代,則大小成長至;222K。;

不過大家要注意,那裡的大小指的是核心檔的大小。那和所需要的隨取記憶體是二回事。這個數字代表的意義是你需要多小的;ROM;來存放你的核心。;

Linux;所需的記憶體大約在;600~800;K;之間。1MB;可能可以開機了,但可能不太有用。因為可能連載入;C;程序庫都有困難。2MB;應該就可以做點事了,但可能要到;4MB;以上才可以執行一個比較完整的系統。;


到底誰占了這些空間;
看到這裡,是不是覺得;Linux;真的有點大。好吧!;那我們就來看看誰占用了這些空間,下面這個列表是從;222K;這個核心做出來的。
#;wc;
arch/i386/kernel/kernel.o;arch/i386/mm/mm.o;kernel/kernel.o;mm/mm.o;fs/fs.o;
ipc/ipc.o;
fs/filesystems.a;
net/network.a;
drivers/block/block.a;
drivers/char/char.a;
drivers/misc/misc.a;
drivers/net/net.a;drivers/pnp/pnp.a;
/usr/src/smalllinux/arch/i386/lib/lib.a;
/usr/src/smalllinux/lib/lib.a;
/usr/src/smalllinux/arch/i386/lib/lib.a;



結果如下;:;


243;2250;81946;arch/i386/kernel/kernel.o
42;316;10569;arch/i386/mm/mm.o
173;1541;74660;kernel/kernel.o
266;2307;68053;mm/mm.o
222;3139;123193;fs/fs.o
49;602;21600;ipc/ipc.o
263;2940;106504;fs/filesystems.a
137;1510;65512;net/network.a
92;719;39178;drivers/block/block.a
230;2308;87556;drivers/char/char.a
1;1;8;drivers/misc/misc.a
83;721;25680;drivers/net/net.a
1;1;8;drivers/pnp/pnp.a
20;187;9526;/usr/src/smalllinux/arch/i386/lib/lib.a
23;150;7714;/usr/src/smalllinux/lib/lib.a
20;187;9526;/usr/src/smalllinux/arch/i386/lib/lib.a
1865;18879;731233;total;

先說明一下,這裡的大小和最終的大小有點差別,但大致還是可以做個參考。這邊顯示;730K;實際上大約在;600K;左右。;

很顯然的,filesystem;相當的大。大約在;230K;左右,占了;1/3;的體積。記憶體管理占了;80K,和核心其它部份的總合差不多。TCP/IP;stack;占了;65K,驅動程序占了;120K。SysV;IPC;占了;21K,必要的話可以拿掉,核心檔應該可以再小個;10K;左右。;

所以如果要減核心大小,應該動那裡呢?;答案應該很明顯,當然是檔案系統。Linux;的;VFS;減化了檔案系統的設計,buffer;cache,;directory;cache;增加了系統的效率。但這些對整個系統都在;flash;上的;embedded;系統而言根本就用處不大。如果可以把它們對拿掉,核心可以馬上縮小;20K;左右。如果跳過整個;VFS,直接將檔案系統寫成一個;driver;的型式,應該可以將;230K;縮減至;50K左右。整個核心縮到;100K;左右。;

從上面的數據來看,ucLinux;所減小的;mm;部份反到省的不多,主要是;mm;除了;virtual;memory;之外,也要處理;memory;allocation;的部份,這部份是省不得的。如果二者齊做,則;100K;以下的;Linux;核心不是不可能的事。;


結語;
如果有人有閒的話,不妨拿;2.0;或;1.0;的核心來試試。看能做出多小的核心。看完本文後,143K;的核心不再是技術上的挑戰了,是嗎?;也許明天就有人宣稱做了;120K;的核心了.....;

不過,所為何來,省那幾十K。不如好好想想;compressed;filesystem;等更有用的技術吧!
copyright © 萬盛學電腦網 all rights reserved