摘自:大陸新聞組
From: lb.bbs@bbs.gliet.edu.cn (吻我)
你的Linux有多大?最小的Linux kernel 。這篇文章有些奇怪,在文章的一開
始,我就要宣稱本文是沒有太大意義的。
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加回去,重新編譯,核心變成189K。10K換個
TCP/IP stack,似乎是很上算的生意。
不過有stack沒有driver也是惘然,所以我把embedded board常用的RTL8139的
driver加回去,195K。
如果你需要DOS檔案系統,那大小成為213K。如果minix用ext2換代,則大小成
長至222K。
不過大家要注意,那裡的大小指的是核心檔的大小。那和所需要的隨取記憶體
是二回事。這個數字代表的意義是你需要多小的ROM來存放你的核心。
Linux所需的記憶體大約在600至800K之間。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
左右。
從上面的數據來看,Linux所減小的mm部份反到省的不多, 其原因主要是mm除
了virtual memory之外,也要處理memory allocation 的部份,這部份是省不得的
。如果二者齊做,則100K以下的Linux 核心不是不可能的事。
結語
如果有人有閒的話,不妨拿2.0或1.0的核心來試試。看能做出多小的核心。看
完本文後,143K的核心不再是技術上的挑戰了,是嗎?也許明天有人宣稱做了120K
的核心了……
不過,所為何來,省那幾十K。不如好好想想compressed filesystem等更有用
的技術吧!