Linux嵌入式系统的优化
时间:2007-05-14 来源:loughsky
0 引 言 嵌入式系统就是用于控制设备的计算机。它们最初于60年代晚期在通讯中被用于控制机电电话交换机。在过去的十多年里,计算机产业不断朝着更小的系统方向发展,嵌入式系统也与之一起为这些小型机器提供了更多的功能。渐渐地就需要把这些嵌入式系统联接到某种网络上,提高了系统的复杂程度并要求更多的存储器和接口,因而也就产生了对操作系统的服务的要求。70年代晚期出现了用作嵌入式系统的现成的操作系统,如,VxWorks,pSOS,Neculeus和Windows CE。 大多数Linux系统运行在PC平台上,但Lin-ux也可以作为嵌入式操作系统,Linux流行的"back-to-basics"方法使得它的安装和管理比UNIX更加简单灵活。典型的压缩包装Linux系统经过打包,在拥有硬盘和大容量内存的PC机上运行,则嵌入式系统不要这么高的配置。一个功能完备的Lin-ux内核要求大约1 Mbyte内存。而Linux微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用PentiumCPU系统的100 kbyte内存。只要有500 kbyte的内存,一个有网络栈和基本实用程序的完全的Linux系统就可以在一台8位总线(SX)的Intel386微处理器上运行得很好。由于内存要求常常是需要的应用所决定的,比如Web服务器或者SNMP代理,Linux系统甚至可以仅使用256 kbyte ROM和512 kbyteRAM进行工作。核心Linux操作系统本身的微内核体系结构相当简单。网络和文件系统以模块形式置于微内核的上层。驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核。这为构造定制的可嵌入系统提供了高度模块化的构件方法。嵌入式系统也常常要求通用的功能,为了避免重复劳动,这些功能的实现运用了许多现成的程序和驱动程序,它们可以用于公共外设的应用。然而,因为还在起步阶段,目前的嵌入式Linux版本还不是一套非常简洁的系统。如何优化系统至适合嵌入式应用成为最主要的目标。 1 可优化的部分 Linux软件不断发展,积累了越来越多的源程序,形成相同功能程序有多种选择。我们需要的是一个精简的系统,因此必须进行优化。首先把系统分为4个部分,内核(kernel),守护程序(daemons),程序库(libraries),应用和工具程序(applications/utili-ties)。我们进行优化的原则是不直接修改源程序,以确保源代码的完整性。表1是各子系统优化的方向与目标。 因为嵌入式系统的功能规格定义非常明确,在内核的设定中只需要留下必要的选项和模块,其它不必要的都可以舍去。另一种就是利用取代的方式,如果是网络设备,就可以把console的输出用串行端口来取代显卡的输出,这样就可以在Linux2.4的核心中省下42 kbyte的空间。除此以外,即插即用,软驱、光驱、键盘、鼠标、USB等的驱动程序都可以被省略。 1.2 守护程序 在开放源代码的影响下,程序在进一步完善功能的同时,对各种软硬件的支持更加多元化,因此在有限的资源下,必须根据需求,重新定义各程序所需要的功能,而避免安装原本可直接执行的套件。例如,如果只使用Squid作为http proxy,而没有用到其caching的功能。就可在编译时,直接利用Squid的设定程序,关掉对文件系统的支持。这样在Squid2.4.Stable1的版本中,省掉145 kbyte。其它像GNUZebra这些网络相关的程序,也可以把IPv6的支持关掉以节省空间。 1.3 程序库 程序可使用静态或动态链接,静态链接使程序执行时overhead减少,源程序也比较简洁。而动态链接则随公用程序库的程序数目增加而节省大量的空间,因此必须根据需求在两者之间取得平衡,如果程序库只有一个程序在用,便可考虑选择静态链接。使用动态链接的情况下,可以利用工具ldd来检查程序与程序库的关系。由此,可找出及保留系统所需的共用程序库的最小集合。 1.4 应用和工具程序 在应用和工具程序中就有更多的弹性了,因为这类程序的选择性多,而且可用多种方法替代。以核心为例,通过对/proc的支持,便可以读取或修改多项系统的参数设定,不必再使用不常用的工具程序。例如只要读取ARPtable时,便可使用指令#cat/proc/net/arp来完成,不需要使用/sbin/arp这个程序。其次在嵌入式系统上,对象不再是一般PC机使用者,简化程序界面、在线说明,甚至简化程序功能等都可以实现精简化的效果。BusyBox[2]就是其中具有代表性的一套工具程序,它以单一的小程序,十分精简地提供了shell、文字处理、压缩程序等UNIX中常用的功能。表2列出BusyBox与tonylogin[3]的功能及其相对原工具程序的大小。
2 优化方式 screen.width-333)this.width=screen.width-333 }" border=0>
screen.width-333)this.width=screen.width-333 }" border=0>
screen.width-333)this.width=screen.width-333 }" border=0>
4 开发过程 screen.width-333)this.width=screen.width-333 }" border=0>
建立文件系统架构的时候,必须注意权限的设定。因为闪存的可覆盖次数有限,所以会以只读的方式绑定(mount)系统。/var/dev等目录需为可读写的,或是记录一些暂时性文件(易丢失性文件)等,都可以利用系统的存储空间来模拟可写入的存储系统(RAM disk)。通过建立符号联接(symbolic link)取得写入权限,余下的则以只读的方式保存在内存上。如果大量的数据必须开机后留下的话,外挂硬盘至系统/var/log是比较适合的做法。小量的数据是可以写入内存中,但一定要使用缓存,否则频繁的写入会使其使用寿命缩短。同理,我们不可使用swap,如果存储器实在不足的话,可以考虑系统留在闪存上,同样以外加硬盘作为swap disk的功能。 screen.width-333)this.width=screen.width-333 }" border=0>
[2] 嵌入式系统以及如何构造一个嵌入式系统概览[EB/OL].http://www.embed.com.cn/,2001,11-12. [3] The Swiss Army Knife of Embedded Linux[EB/OL].http://busybox.lineo.com,2002,02-05. [4] The Redhat Embedded Debug and BootstrapFirmware[EB/OL].http://sources.redhat.com/reboot,2001,12-24. [5] The Linux KernelArchives[EB/OL].http://www.kernel.org,2001.12-24. [6] 殷茜,温平川,应俊.嵌入式软件调试环境的对等协议的设计与实现[J].重庆邮电学院学报(自然科学版),2002,14(2):70-74. 3 开发的环境 在清楚了解准备建立的系统后,便可开始利用Linux打造嵌入式的设备了。首先我们必须区分开发平台与目标平台。目标平台就是程序最后被移植及执行的地方,因为资源有限,开发与除错的环境都集中在开发平台上。表3和表4列出了2个平台上的主要开发工具。 要建立一个最基本的开发环境,必须具备一套跨平台的开发工具(Cross Development Kit),包含有编译器、连接器、出错器等。另外还要准备制作文件系统所需的程序。而目标平台上,只需准备一段系统开机程序,如etherboot,reboot等。此程序可以在除错阶段时,从网络取得映象后启动,或是直接从快内存储器,把系统启动。一旦启动后,就进入Linux的操作系统,同时也可使用GDBserver作为远端除错的工具。 Linux联盟收集整理 |
||