# 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 等更有用的技术吧!
(参考链接: http://linux.ccidnet.com/art/741/20061215/977205_1.html)
|