| linux 能有多小呢 ? 每一個(gè)做 embedded 系統(tǒng)的人都把小看成第一要?jiǎng)?wù),其實(shí)這是不對的。如果我們對系統(tǒng)的好壞和大小作圖,它應(yīng)該長得像 | |---- | | ----- | | -------- | --- |----------------------- 小當(dāng)然不會(huì)比較壞,但不一定比較好。如果系統(tǒng)使用 4MB 和 5MB 沒有價(jià)格或性能上的差別,那 4MB 和 5MB 是一樣好的。 到底有多小 廢話說了一堆,那到底 Linux 有多小呢? 好吧,各位這么有小牛頓的精神。我也只好想辦法生一個(gè)答案出來了。 首先我必須聲明,我的不一定最小。不要說我在欺騙世人,你的核心比我小。我無意比較,我的數(shù)據(jù)只是給大家一個(gè)參考而己。不過我歡迎大家提出自己的心得,告訴大家怎么樣做出更小的核心。 我使用的是 Mandrake 內(nèi)付的 2.2.15,我沒有修改任何一行程序碼,完全只靠修改組態(tài)檔得到這些數(shù)據(jù)。 首先,使用 make xconfig 把所有可以拿掉的選項(xiàng)都拿得。 不要 floppy 不要 SMP,MTRR 不要 networking,SCSI 把所有的 block device 移除,只留下 old IDE device 把所有的 character device 移除 把所有的 filesystem 移除,只留下 minix 不要 sound 支援 相信我,我己經(jīng)把所有的選項(xiàng)都移除了。這樣做之后,我得到了一個(gè) 188K 的核心。 還不夠小嗎? OK,再加上一招,請把下列二個(gè)檔案中的 -O3,-O2 用 -Os 取代。 ./Makefile ./arch/i386/kernel/Makefile 這樣一來,整個(gè)核心水小了 9K,成為 179K。 不過這個(gè)核心恐怕很難發(fā)揮 Linux 的功能,因此我決定把網(wǎng)絡(luò)加回去。把 General 中的 network support 加回去,重新編譯,核心變成 189 K。10K 換個(gè) TCP/ip stack,似乎是很上算的生意。 不過有 stack 沒有 driver 也是惘然,所以我把 embedded board 常用的 RTL8139 的 driver 加回去,195K。 如果你需要 DOS 檔案系統(tǒng),那大小成為 213K。如果 minix 用 ext2 換代,則大小成長至 222K。 不過大家要注意,那里的大小指的是核心檔的大小。那和所需要的隨取記憶體是二回事。這個(gè)數(shù)字代表的意義是你需要多小的 ROM 來存放你的核心。 Linux 所需的記憶體大約在 600~800 K 之間。1MB 可能可以開機(jī)了,但可能不太有用。因?yàn)榭赡苓B載入 C 程序庫都有困難。2MB 應(yīng)該就可以做點(diǎn)事了,但可能要到 4MB 以上才可以執(zhí)行一個(gè)比較完整的系統(tǒng)。 到底誰占了這些空間 看到這里,是不是覺得 Linux 真的有點(diǎn)大。好吧! 那我們就來看看誰占用了這些空間,下面這個(gè)列表是從 222K 這個(gè)核心做出來的。 # 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 結(jié)果如下 : 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 先說明一下,這里的大小和最終的大小有點(diǎn)差別,但大致還是可以做個(gè)參考。這邊顯示 730K 實(shí)際上大約在 600K 左右。 很顯然的,filesystem 相當(dāng)?shù)拇蟆4蠹s在 230K 左右,占了 1/3 的體積。記憶體管理占了 80K,和核心其它部份的總合差不多。TCP/IP stack 占了 65K,驅(qū)動(dòng)程序占了 120K。SysV IPC 占了 21K,必要的話可以拿掉,核心檔應(yīng)該可以再小個(gè) 10K 左右。 所以如果要減核心大小,應(yīng)該動(dòng)那里呢? 答案應(yīng)該很明顯,當(dāng)然是檔案系統(tǒng)。Linux 的 VFS 減化了檔案系統(tǒng)的設(shè)計(jì),buffer cache, directory cache 增加了系統(tǒng)的效率。但這些對整個(gè)系統(tǒng)都在 Flash 上的 embedded 系統(tǒng)而言根本就用處不大。如果可以把它們對拿掉,核心可以馬上縮小 20K 左右。如果跳過整個(gè) VFS,直接將檔案系統(tǒng)寫成一個(gè) driver 的型式,應(yīng)該可以將 230K 縮減至 50K左右。整個(gè)核心縮到 100K 左右。 從上面的數(shù)據(jù)來看,ucLinux 所減小的 mm 部份反到省的不多,主要是 mm 除了 virtual memory 之外,也要處理 memory allocation 的部份,這部份是省不得的。如果二者齊做,則 100K 以下的 Linux 核心不是不可能的事。 結(jié)語 如果有人有閑的話,不妨拿 2.0 或 1.0 的核心來試試。看能做出多小的核心。看完本文后,143K 的核心不再是技術(shù)上的挑戰(zhàn)了,是嗎? 也許明天就有人宣稱做了 120K 的核心了..... 不過,所為何來,省那幾十K。不如好好想想 comPRessed filesystem 等更有用的技術(shù)吧! |
新聞熱點(diǎn)
疑難解答
圖片精選