最小的 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 加回去,重新編譯,核心變成 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 等更有用的技術吧!
結語
如果有人有閒的話,不妨拿 2.0 或 1.0 的核心來試試。看能做出多小的核心。看完本文後,143K 的核心不再是技術上的挑戰了,是嗎? 也許明天就有人宣稱做了 120K 的核心了.....
不過,所為何來,省那幾十K。不如好好想想 compressed filesystem 等更有用的技術吧!