|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。以上是我学习Linux的心得体会,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
削减Linux的体系占用,为使用程序保存更多的资本,削减设备的硬件本钱。“你能做到多小?”这个成绩一般在嵌进式工程师入手下手他们的项目时问到。年夜多半时分,问这个成绩的人是想削减RAM和Flash资本,削减设备的单元本钱或动力需求。
由于Linux最后是为桌面或服务器体系计划的,默许情形下,它没无为尺寸巨细举行过优化,不管怎样,Linux正被愈来愈多地用在嵌进式设备中,要让Linux变小不是一件简单的事变,这里有几个削减体系占用内存的办法。
很多工程师是从削减内核巨细入手下手的,这里有个简单动手的办法,本文将具体先容怎样削减内核的巨细,次要经由过程移除那些在一个典范的嵌进式体系顶用不到的代码。
在一个体系中根文件体系(RFS)多是内存资本最年夜的损耗者。根文件体系包含了使用程序和c库利用到的基本布局代码。为RFS选择文件体系对最初的巨细有十分年夜的影响,尺度是ext3,从一个嵌进式工程师的目光来看它的效力长短常低的,但那是另外一篇文章的主题了。
实践中,怎样减小?
即便最小的Linux刊行版最少也有两部分:内核和根文件体系。偶然,这些部件驻扎在统一个文件中,可是它们仍旧分红分歧的部件。从内核中移除特性几近差未几的一切代码,如许一个体系很简单就削减到不到1MB巨细。可是,很多用户选择Linux撑持收集和分歧设备,因而这不是一个实际的做法。
内核
Linux内核十分风趣,只管在编译时它依附GCC,但运转时它却不依附。那些工程师将眼光转向Linux初始化RAM磁盘(所谓的initrd),它是内核运转时的从属物。Initrd起首是由内核加载的,程序运转时扣问体系必要载进甚么模块以便撑持设备,如许实在的根文件体系才干被加载。实践上,有两步加载历程,加载initrd后再加载实在的根文件体系,很少发明嵌进式体系中有根文件体系,由于如许在一个体系中会增添天真性,对这个体系做修改要消费分外的空间或工夫,嵌进式体系一样平常不必要天真性。但本文稍后将会商根文件体系。
可载进模块撑持
内核载进模块是从头定位运转时内核毗连到它本身的代码,典范的可载进模块的例子是同意从用户空间载进驱动到内核中(某些探测历程实行后),和不封闭体系晋级设备驱动。关于年夜多半嵌进式体系而言,一旦它们处于该局限以外,修正根文件体系要末不实际要末不成能。因而体系计划者间接将模块毗连到内核中,移除那些可载进的模块,勤俭出来的空间关于内核来讲是良多的,不管怎样,程序办理可载进的模块(如insmodmmodlsmod)和shell剧本载进它们不是必须的。
Linux-tiny补钉
Linux-tiny补钉集已变得时偶然无的项目了,最后是由MattMackall在掌管。消耗电子Linux论坛(CLEF)正在勉力恢复这个项目,CLEF开辟者WiKi已给2.6.22.5内核(写本文时的最新版本)公布了补钉,同时,Linux-tiny项目标很多改动已包含在主线内核中,只管很多原始的Linux-tiny补钉已集成到内核中,但本色上勤俭空间的补钉还没有集成出来。
如:
1、Fine-grainprintksupport【细粒度printk撑持】:用户能够把持甚么文件可使用printk。工程师将从不利用printk的文件巨细中受害。
2、ChangeCRCfromcalculationtousetablelookup【改动CRC算法从盘算到利用表查询】:以太网数据包必要一个CRC来校验数据包的正确性。这个CRC算法完成利用表查询交换了盘算,勤俭了约莫2K。
3、Networktweaking【收集调剂】:几个补钉包削减撑持的收集协定,缓存巨细和翻开的套接字。很多嵌进式设备仅撑持大批的协定,不必要有成百上千毗连的服务。
4、Nopanicreporting【无应急呈报】:假如设备有三个形态灯,一系列的毗连,用户不克不及看到,更少的影响,应急信息显现在一个不存在的终端上。假如设备产生内核应急生效,用户只必要从头启动设备便可。
5、Reductionofinlining【削减间接拔出】:间接拔出是编译器将代码作为宏拷贝到它挪用的每一个地位,而不是发生一个函数挪用。GCC默许将间接拔出任何函数。经由过程克制间接拔出函数,代码运转略微慢一点,由于编译器必要为挪用和前往发生代码,失掉的待遇是工具文件更小了。
Linux-tiny补钉公布成一个tar包,它能够一同使用,也能够一个一个独自使用
内核调剂倡议增补
只管Linux-tiny项目触及到很多的方面,另有几个分外的设置修改能够削减Linux脚迹。
1、移除ext2/3撑持,利用别的一个分歧的文件体系:ext2/3文件体系一般对照年夜,年夜于32K,年夜部合作程师启用一个Flash文件体系,可是不由用ext2/3,如许会华侈内存。
2、移除对sysctl的撑持,sysctl同意用户在运转时调剂内核参数,在年夜部分嵌进式设备中,内核设置一旦定了就不必要修改了,利用这个特性会华侈1K。
3、削减IPC选项,年夜多半体系没有SysVIPC特征(grep你的msget、msgct、msgsnd和msgrcv代码)和POSIX动静查询(grepmq_*[a-z])一样能够运转,移除它们能够勤俭18K。
4、检察你修改的效果
Size命令呈报一个工具文件中一切代码和数据的巨细,这与ls命令的输出是分歧的,ls呈报的是在文件体系中的字节数巨细。
比方,一个内核用armv51交织编译器编译呈报以下:
#armv5l-linux-sizevmlinx
textdatabssdechexfilename
20803009990499312227951622c85cvmlinux
Text大节是编译器收回的代码,data大节包含全局和其他利用初始静态标记的值,bss大节包含作为初始化的一部分被调零的静态数据。
固然这个数占有启发感化,但它没有展现体系损耗的内存部分,也没法经由过程查询vmlinux得出,可是检察毗连在一同的文件,创立vmlinux是接上去最好的事变,为了失掉这个信息,利用find命令在内核项目中定位built-in.o文件并盘算巨细:
#find.-name"built-in.o"|xargsarmv5l-linux-size
?--totals|sort-n-k4
这个命令的输入相似上面:
textdatabssdechexfilename
18968016224339442398483a8e8./kernel/built-in.o
25787210056563627356442c9c./net/ipv4/built-in.o
36939691843482441340464edc./fs/built-in.o
452116158201163247956875150./net/built-in.o
484276367441421653523682ac4./drivers/built-in.o
3110478180000159241344971934a377(TOTALS)
这个手艺能够切实地指出占用了大批空间的代码,因而工程师能够起首移除这些代码,当如许做的时分,用户应当在创立之前实行编译扫除举措,由于从内核中丢失落一个特性其实不意味着谁人之前编译好的工具文件将会被删除。
关于那些新增加到Linux内核中的器材,一个罕见的成绩是怎样在内核设置程序中利用一个选项来团结一些built-in.o文件,这能够经由过程检察目次下的Makefile和Kconfig文件来完成,Makefile将包含象上面如许的一行:
obj-$(CONFIG_ATALK)+=p8022.opsnap.o
当用户设置了设置变量CONFIG_ATALK后它将天生右手边的文件。内核设置工具一样平常不会表露上司设置变量名。要查出变量名之间的毗连和甚么是可见的,在Kconfig中寻觅没有CONFIG_前缀的变量名。
find.-nameKconfig-execfgrep-H-C3"configATALK"{};
它将发生上面如许的输入:
./drivers/net/appletalk/Kconfig-#
./drivers/net/appletalk/Kconfig-#Appletalkdriverconfiguration
./drivers/net/appletalk/Kconfig-#
./drivers/net/appletalk/Kconfig:configATALK
./drivers/net/appletalk/Kconfig-tristate"Appletalkprotocolsupport"
./drivers/net/appletalk/Kconfig-selectLLC
./drivers/net/appletalk/Kconfig----help---
另有一些事变必要做,由于用户必要在设置树中找到Appletalk协定撑持,可是最少要分明要查找的是甚么
</p>
给你装的系统里为ubuntu12.04,它已经封装的很臃肿了,但是考虑到你没有很多时间投入其中,所以给你装了它,但是怎么用它提高开发效率,需要你在学习的过程中不断总结; |
|