linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 内核研究 >
栏目导栏
资料搜索
热门文章
·linux-2.6内核升级文档
·Linux源代码的注释
·linux2.6内核编译方法详述
·Linux操作系统内核编译详解
·Linux内核结构详解
·Linux配置与编译内核
·定时器
·Linux内核升级全攻略
·FC5(Fedora Core5)下编译内核总
·Ubuntu 6.06 dapper 内核编译初
·Linux 内核编译详解
·Linux内核管理基础知识概述
·Linux2.4升级到2.6内核升级指南
·第八章 设备驱动
·如何编译linux内核
最新文章
·Linux内核bootsplash功能的实现
·Linux内核2.6.25全新发布加入众
·Debian Linux系统编译内核标准
·Linux2.4内核和2.6内核对Initr
·2.6.24内核编译 initrd-2.6.24
·Qtopia应用程序与Linux内核数据
·Linux 2.6内核中sysfs文件系统
·Linux2.6内核驱动移植参考
·Andrew Morton:Linux内核的执法
·Fedora 8 Linux系统的内核配置
·Kernel中的irq.c函数
·Linux核心出现权限扩张及记忆体
·Linux 2.6本地权限提升漏洞
·结合Linux系统内核源码理解SYN
·关于Linux 内核中五个主要子系
Google
 
做一个最小的Linux kernel
[ 作者:  加入时间:2006-09-19 11:04:10  来自:Linux联盟收集 ]
Linux 能有多小呢 ? 每一个做 embedded 系统的人都把小看成第一要务,其实这是不对的。如果我们对系统的好坏和大小作图,它应该长得像 vTxLinux联盟
vTxLinux联盟
小当然不会比较坏,但不一定比较好。如果系统使用 4MB 和 5MB 没有价格或性能上的差别,那 4MB 和 5MB 是一样好的。 vTxLinux联盟
vTxLinux联盟
到底有多小 vTxLinux联盟
废话说了一堆,那到底 Linux 有多小呢? 好吧,各位这么有小牛顿的精神。我也只好想办法生一个答案出来了。 vTxLinux联盟
vTxLinux联盟
首先我必须声明,我的不一定最小。不要说我在欺骗世人,你的核心比我小。我无意比较,我的数据只是给大家一个参考而己。不过我欢迎大家提出自己的心得,告诉大家怎么样做出更小的核心。 vTxLinux联盟
vTxLinux联盟
我使用的是 Mandrake 内付的 2.2.15,我没有修改任何一行程序码,完全只靠修改组态档得到这些数据。 vTxLinux联盟
vTxLinux联盟
首先,使用 make xconfig 把所有可以拿掉的选项都拿得。 vTxLinux联盟
vTxLinux联盟
不要 floppy vTxLinux联盟
不要 SMP,MTRR vTxLinux联盟
不要 networking,SCSI vTxLinux联盟
把所有的 block device 移除,只留下 old IDE device vTxLinux联盟
把所有的 character device 移除 vTxLinux联盟
把所有的 filesystem 移除,只留下 minix vTxLinux联盟
不要 sound 支援 vTxLinux联盟
相信我,我己经把所有的选项都移除了。这样做之后,我得到了一个 188K 的核心。 vTxLinux联盟
还不够小吗? OK,再加上一招,请把下列二个档案中的 -O3,-O2 用 -Os 取代。 vTxLinux联盟
./Makefile vTxLinux联盟
./arch/i386/kernel/Makefile vTxLinux联盟
vTxLinux联盟
这样一来,整个核心水小了 9K,成为 179K。 vTxLinux联盟
vTxLinux联盟
不过这个核心恐怕很难发挥 Linux 的功能,因此我决定把网络加回去。把 General 中的 network support 加回去,重新编译,核心变成 189 K。10K 换个 TCP/IP stack,似乎是很上算的生意。 vTxLinux联盟
vTxLinux联盟
不过有 stack 没有 driver 也是惘然,所以我把 embedded board 常用的 RTL8139 的 driver 加回去,195K。 vTxLinux联盟
vTxLinux联盟
如果你需要 DOS 档案系统,那大小成为 213K。如果 minix 用 ext2 换代,则大小成长至 222K。 vTxLinux联盟
vTxLinux联盟
不过大家要注意,那里的大小指的是核心档的大小。那和所需要的随取记忆体是二回事。这个数字代表的意义是你需要多小的 ROM 来存放你的核心。 vTxLinux联盟
vTxLinux联盟
Linux 所需的记忆体大约在 600~800 K 之间。1MB 可能可以开机了,但可能不太有用。因为可能连载入 C 程序库都有困难。2MB 应该就可以做点事了,但可能要到 4MB 以上才可以执行一个比较完整的系统。 vTxLinux联盟
vTxLinux联盟
vTxLinux联盟
到底谁占了这些空间 vTxLinux联盟
看到这里,是不是觉得 Linux 真的有点大。好吧! 那我们就来看看谁占用了这些空间,下面这个列表是从 222K 这个核心做出来的。 vTxLinux联盟
# wc vTxLinux联盟
arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o vTxLinux联盟
ipc/ipc.o vTxLinux联盟
fs/filesystems.a vTxLinux联盟
net/network.a vTxLinux联盟
drivers/block/block.a vTxLinux联盟
drivers/char/char.a vTxLinux联盟
drivers/misc/misc.a vTxLinux联盟
drivers/net/net.a drivers/pnp/pnp.a vTxLinux联盟
/usr/src/smalllinux/arch/i386/lib/lib.a vTxLinux联盟
/usr/src/smalllinux/lib/lib.a vTxLinux联盟
/usr/src/smalllinux/arch/i386/lib/lib.a vTxLinux联盟
vTxLinux联盟
vTxLinux联盟
vTxLinux联盟
结果如下 : vTxLinux联盟
vTxLinux联盟
vTxLinux联盟
243 2250 81946 arch/i386/kernel/kernel.o vTxLinux联盟
42 316 10569 arch/i386/mm/mm.o vTxLinux联盟
173 1541 74660 kernel/kernel.o vTxLinux联盟
266 2307 68053 mm/mm.o vTxLinux联盟
222 3139 123193 fs/fs.o vTxLinux联盟
49 602 21600 ipc/ipc.o vTxLinux联盟
263 2940 106504 fs/filesystems.a vTxLinux联盟
137 1510 65512 net/network.a vTxLinux联盟
92 719 39178 drivers/block/block.a vTxLinux联盟
230 2308 87556 drivers/char/char.a vTxLinux联盟
1 1 8 drivers/misc/misc.a vTxLinux联盟
83 721 25680 drivers/net/net.a vTxLinux联盟
1 1 8 drivers/pnp/pnp.a vTxLinux联盟
20 187 9526 /usr/src/smalllinux/arch/i386/lib/lib.a vTxLinux联盟
23 150 7714 /usr/src/smalllinux/lib/lib.a vTxLinux联盟
20 187 9526 /usr/src/smalllinux/arch/i386/lib/lib.a vTxLinux联盟
1865 18879 731233 total vTxLinux联盟
vTxLinux联盟
先说明一下,这里的大小和最终的大小有点差别,但大致还是可以做个参考。这边显示 730K 实际上大约在 600K 左右vTxLinux联盟
vTxLinux联盟
很显然的,filesystem 相当的大。大约在 230K 左右,占了 1/3 的体积。记忆体管理占了 80K,和核心其它部份的总合差不多。TCP/IP stack 占了 65K,驱动程序占了 120K。SysV IPC 占了 21K,必要的话可以拿掉,核心档应该可以再小个 10K 左右。 vTxLinux联盟
vTxLinux联盟
所以如果要减核心大小,应该动那里呢? 答案应该很明显,当然是档案系统。Linux 的 VFS 减化了档案系统的设计,buffer cache, directory cache 增加了系统的效率。但这些对整个系统都在 flash 上的 embedded 系统而言根本就用处不大。如果可以把它们对拿掉,核心可以马上缩小 20K 左右。如果跳过整个 VFS,直接将档案系统写成一个 driver 的型式,应该可以将 230K 缩减至 50K左右。整个核心缩到 100K 左右。 vTxLinux联盟
vTxLinux联盟
从上面的数据来看,ucLinux 所减小的 mm 部份反到省的不多,主要是 mm 除了 virtual memory 之外,也要处理 memory allocation 的部份,这部份是省不得的。如果二者齐做,则 100K 以下的 Linux 核心不是不可能的事。 vTxLinux联盟
vTxLinux联盟
vTxLinux联盟
结语 vTxLinux联盟
如果有人有闲的话,不妨拿 2.0 或 1.0 的核心来试试。看能做出多小的核心。看完本文后,143K 的核心不再是技术上的挑战了,是吗? 也许明天就有人宣称做了 120K 的核心了..... vTxLinux联盟
vTxLinux联盟
不过,所为何来,省那几十K。不如好好想想 compressed filesystem 等更有用的技术吧! Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息