Embedded 版 (精华区)

发信人: sundream (boliqiu), 信区: Embedded_system
标  题: 有关嵌入式linux内核精简问题
发信站: 哈工大紫丁香 (Tue Jul 31 13:00:23 2001) , 转信

我读了下面的文章,精简了一下没有成功,请各位高手指教,写出具体的操作步骤!谢谢




1. 精简内核
构造内核常用命令包括:make config, dep, clean, mrproper, zImage, bzImage, modu
le
s, modules_install
(1) make config
核心配置,调用./scripts/Configure 按照arch/i386/config.in 来进行配置。命令执行

后产生文件.config,其中保存着配置信息。下一次再做make config将产生新的.config文

,原.config被改名为.config.old
(2)make dep
寻找依存关系。产生两个文件.depend和.hdepend其中.hdepend表示每个.h文件都包含其它

些嵌入文件。而.depend 文件有多个,在每个会产生目标文件(.o)文件的目录下均有,它

示每个目标文件都依赖哪些嵌入文件(.h)。
(3)make clean
清出以前构核所产生的所有目标文件、模块文件、核心以及一些临时文件等,不产生任何


(4)make rmproper
删除所有因构核过程中产生的所有文件,及除了做make clean外,还要删除.config,.de
pe
nd等文件,把核心源码恢复到最原始的状态。下次构核时就必须重新配置了。
(5)make, make zImage, make bzImage
make:构核。通过各目录的Makefile文件进行。会在各个目录下产生一大堆目标文件,若核

代码没有错误,将产生文件vmlinux,这就是所构的核心。并产生映射文件System.map通过

目录的Makefile文件进行。.version 文件中的数加1,表示版本号(又产生一个新的版本

),让你明白,你已经对核心改动过多少次了。
Make zImage:在make的基础上产生压缩的核心映象文件./arch/$(ARCH)/boot/zImage以及

./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。
Make bzImage:在make 的基础上产生压缩比例更大的核心映象文件./arch/$(ARCH)/boot/
bz
Image以及在./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。在核心太大时进


(6)make modules
编译模块文件,你在make config时所配置的所有模块将在这时编译,形成模块目标文件,

把这些目标文件存放在modules目录中。使用如下命令看一看。Ls modules
(7)make modules_install
把上面编译好的模块目标文件目录/lib/modules/$KERNEL_VERSION/ 中。
比如我的版本是2.0.36,做完这个操作后可使用下面的命令看看:ls /lib/modules/2.0.
36
/
相关的命令还有很多,有兴趣可看相关资料和Makefile文件。另外注意,这儿我们产生了

些隐含文件
.config
.oldconfig
.depend
.hdepend
.version
它们的意义应该很清楚了。
废话说了一堆,现在还是举个例子说明一下:
我使用的是 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 中的
 n
etwork support 加回去,重新编译,核心变成 189 K。10K 换个 TCP/IP stack,似乎是

上算的生意。
不过有 stack 没有 driver 也是惘然,所以我把 embedded board 常用的 RTL8139 的 d
ri
ver 加回去,195K。
如果你需要 DOS 档案系统,那大小成为 213K。如果 minix 用 ext2 换代,则大小成长至
 
222K。
不过大家要注意,那里的大小指的是核心档的大小。那和所需要的随取记忆体是二回事。

个数字代表的意义是你需要多小的 ROM 来存放你的核心。
Linux 所需的记忆体大约在 600~800 K 之间。1MB 可能可以开机了,但可能不太有用。因

可能连载入 C 程序库都有困难。2MB 应该就可以做点事了,但可能要到 4MB 以上才可以

行一个比较完整的系统。
因为Linux 的filesystem 相当的大。大约在 230K 左右,占了 1/3 的体积。记忆体管理

了 80K,和核心其它部份的总合差不多。TCP/IP stack 占了 65K,驱动程序占了 120K。
Sy
sV IPC 占了 21K,必要的话可以拿掉,核心档应该可以再小个 10K 左右。
所以如果要减核心大小,应该动那里呢? 答案应该很明显,当然是文件系统。Linux 的 V
FS
 减化了档案系统的设计,buffer cache, directory cache 增加了系统的效率。但这些对

个系统都在 flash 上的 embedded 系统而言根本就用处不大。如果可以把它们对拿掉,核

可以马上缩小 20K 左右。如果跳过整个 VFS,直接将文件系统写成一个 driver 的型式,

该可以将 230K 缩减至 50K左右。整个核心缩到 100K 左右。





--

※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 202.97.206.198]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.645毫秒