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;等更有用的技术吧! |
标签: linux