分类: LINUX
2008-04-26 18:25:02
尽管Linux-tiny项目涉及到许多的方面,还有几个额外的配置改动可以减少Linux脚印。
1、 移除ext2/3支持,使用另外一个不同的文件系统:ext2/3文件系统通常比较大,大于32K,大部分工程师启用一个Flash文件系统,但是不禁用ext2/3,这样会浪费内存。
2、 移除对sysctl的支持,sysctl允许用户在运行时调整内核参数,在大部分嵌入式设备中,内核配置一旦定了就不需要改动了,使用这个特征会浪费1K。
3、 减少IPC选项,大多数系统没有SysV IPC特性(grep你的msget、msgct、msgsnd和msgrcv代码)和POSIX消息查询(grep mq_*[a-z])一样可以运行,移除它们可以节约18K。
4、 查看你改动的效果
Size命令报告一个对象文件中所有代码和数据的大小,这与ls命令的输入是不同的,ls报告的是在文件系统中的字节数大小。
例如,一个内核用armv51交叉编译器编译报告如下:
# armv5l-linux-size vmlinx
text data bss dec hex filename
2080300 99904 99312 2279516 22c85c vmlinux
Text小节是编译器发出的代码,data小节包括全局和其他使用初始静态符号的值,bss小节包括作为初始化的一部分被调零的静态数据。
虽然这个数据有启迪作用,但它没有展示系统消耗的内存部分,也无法通过查询vmlinux得出,但是查看连接在一起的文件,创建vmlinux是接下来最好的事情,为了得到这个信息,使用find命令在内核项目中定位built-in.o文件并计算大小:
# find . -name "built-in.o" | xargs armv5l-linux-size
↪--totals | sort -n -k4
这个命令的输出类似下面:
text data bss dec hex filename
189680 16224 33944 239848 3a8e8 ./kernel/built-in.o
257872 10056 5636 273564 42c9c ./net/ipv4/built-in.o
369396 9184 34824 413404 64edc ./fs/built-in.o
452116 15820 11632 479568 75150 ./net/built-in.o
484276 36744 14216 535236 82ac4 ./drivers/built-in.o
3110478 180000 159241 3449719 34a377 (TOTALS)
这个技术可以确切地指出占用了大量空间的代码,因此工程师可以首先移除这些代码,当这样做的时候,用户应该在创建之前执行编译清除动作,因为从内核中丢掉一个特征并不意味着那个之前编译好的对象文件将会被删除。
对于那些新添加到Linux内核中的东西,一个常见的问题是如何在内核配置程序中使用一个选项来联合一些built-in.o文件,这可以通过查看目录下的Makefile和Kconfig文件来实现,Makefile将包括象下面这样的一行:
obj-$(CONFIG_ATALK) += p8022.o psnap.o
当用户设置了配置变量CONFIG_ATALK后它将生成右手边的文件。内核配置工具一般不会暴露下属配置变量名。要查出变量名之间的连接以及什么是可见的,在Kconfig中寻找没有CONFIG_前缀的变量名。
find . -name Kconfig -exec fgrep -H -C3 "config ATALK" {} \;
它将产生下面这样的输出:
./drivers/net/appletalk/Kconfig-#
./drivers/net/appletalk/Kconfig-# Appletalk driver configuration
./drivers/net/appletalk/Kconfig-#
./drivers/net/appletalk/Kconfig:config ATALK
./drivers/net/appletalk/Kconfig- tristate "Appletalk protocol support"
./drivers/net/appletalk/Kconfig- select LLC
./drivers/net/appletalk/Kconfig- ---help---
还有一些事情需要做,因为用户需要在配置树中找到Appletalk协议支持,但是至少要清楚要查找的是什么。