做一个最小的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;左右 。;

推荐阅读