一种面向应用的嵌入式Linux内核混合裁剪方法

2011-04-07 05:50崔欢欢王永杰
关键词:源代码读写器内核

崔欢欢,霍 华,王永杰

(河南科技大学电子信息工程学院,河南洛阳471003)

0 前言

近年来,Linux以其源码开放、性能稳定、可裁剪等优势成为嵌入式操作系统的首选。Linux可作为一种通用的操作系统,应用于资源受限的、针对具体应用而设计的专用系统——嵌入式系统之前,需对内核中不同的功能模块进行裁剪,根据软硬件的实际情况定制Linux内核[1-2]。作为RFID系统的核心部分,RFID读写器具有的很重要的技术意义和市场前景,但设计开发一款既具有专用性又具有通用性的RFID手持读写器是当今的难题[3]。针对这个问题,本文将RFID技术和嵌入式技术相结合,根据需求裁剪定制内核,得到适用于RFID手持读写器的内核映像。

Linux的模块化设计、源代码公开和Linux内核重编译功能使得Linux内核具有可裁剪性,但是庞大的内核源代码结构使得分析和裁剪内核有一定的难度[4]。目前对于Linux内核的裁剪常用的方法有[5-6]:配置裁剪方法、基于代码分析的裁剪方法和基于调用图的裁剪方法。配置裁剪方法是根据Linux本身所提供的配置工具裁剪配置内核,将信息保存供内核编译使用;基于代码分析的裁剪方法是通过对内核源代码的分析,使用条件编译或修改源码、直接删除冗余代码(文件、实现函数、相关数据结构等);基于调用图的裁剪方法是通过分析库函数、系统调用和内核函数的调用关系,建立基于函数间调用关系的调用图,删除内核中未调用到的函数。以上3种方法各有优点,但均存在不同程度粒度偏大问题。基于此,本文将以上3种方法的优点相融合,采用一种混合的裁剪方法来提高裁剪率,并面向RFID手持读写器的具体应用对裁剪结果进行验证。

1 面向RFID手持读写器的应用

嵌入式Linux的裁剪[7]是指在开放源码、性能稳定的Linux源代码的基础上,根据特定应用和硬件平台(x86,ARM等),适当的优化删减代码的过程。裁剪后的代码符合嵌入式应用的要求,应用功能有所减少,规模更为精简,体系结构更为紧凑,可配置性有所提高。

1.1 硬件结构分析

图1描述了RFID手持读写器的相关硬件模块:主控制器是三星公司的嵌入式ARM芯片S3C2410,其内部有4K SRAM用于Nand Flash启动;存储器单元(主存储器SDRAM+辅助存储器Nand Flash)用于存储数据;LCD和键盘作为人机交互工作的接口;RFID读写模块用于收发射频信息;JTAG调试模块和用于通讯的串口和以太网接口。

1.2 软件系统分析

图2对RFID手持读写器的软件系统进行了层次性的描述,其中软件层中列出了组成Linux内核的5个部分:进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)。

1.3 可裁剪项分析

通过对Linux内核源码及组成内核的5个部分的分析,得到内核模块中可以裁剪的部分[8-9]:

(1)系统多余的进程。Linux内核中的一些模块对于嵌入式系统并不适用,可以剔除内核对这些进程的创建和调度机制,如虚存管理模块,同时删除与此相关的进程。

(2)平台无关代码和多余硬件相关代码。根据硬件平台裁剪掉内核arch目录下与该平台无关的处理器支持代码;另外,Linux内核支持很多硬件及其周边设备,如硬盘、鼠标等,并不是所有嵌入式系统都需要,可以根据实际情况删除那些无用的硬件驱动程序的相关代码。

(3)异常处理函数。Linux内核提供的一些异常处理函数是嵌入式系统所不需要的,如:debug、divide_error、nmi、overflow、bounds等,可以根据具体情况删除不需要的函数代码。

(4)内存管理。Linux的内存管理采用的是基于分页式的虚拟内存管理机制,会影响到系统的可确定性和响应时间,在嵌入式系统中并不适用可以剔除,直接使用实际内存。

(5)文件系统。Linux内核支持ext2、vfat、jffs、yaffs等多种文件系统,可嵌入式系统一般仅需要里面的几种,可以裁剪掉不需要的文件系统来节省存储空间。

(6)网络协议栈。嵌入式系统可根据需求剔除系统中无需支持的网络协议栈,仅保留需要的网络协议栈,如仅保留TCP/IP协议栈。

2 面向应用的裁剪过程

2.1 混合裁剪方法

配置裁剪方法虽然简单,但裁剪的最小单元为整个功能模块粒度过大,而且缺少与应用程序具体需求的结合,造成目标代码中存在一定量的冗余代码。基于代码分析的裁剪方法虽然可以得到比配置更小粒度的内核,但内核中过多条件编译语句的使用损害了源代码的可读性和可维护性,并导致了调试和测试的复杂性,降低了裁剪率,而且内核源码的复杂性和软件的不可见性,使对内核及各子模块结构间的关系的分析变得困难,增加了裁剪的难度。基于调用图的裁剪方法的裁剪率虽然比前两种方法有所提升,可以得到更小体积的内核,但裁剪粒度还有提升的空间。根据以上分析,这里使用一种混合的裁剪方法来实现更小粒度的内核。

此混合裁剪方法的思路为将裁剪分两步进行:第一步将配置裁剪方法和基于代码分析的裁剪方法相结合;第二步将基于调用图的裁剪方法和基于代码分析的裁剪方法相结合。

根据对嵌入式Linux内核的可裁剪项的分析,本文以文件系统的裁剪为例对混合的裁剪方法进行详细的介绍。

2.2 文件系统的裁剪

Linux系统中文件系统用来组织文件和设备,文件系统的存在使得数据和设备得到有效而透明的存取访问,Linux程序、库、系统文件和用户文件都在其里面包含,它构成了Linux系统上所有数据的基础,是Linux系统中庞大复杂而又最为基本和重要的资源。

文件系统的裁剪是嵌入式Linux裁剪中最重要的部分,需要进行简化数据结构、优化系统调用等工作。在RFID手持读写器硬件结构分析中,使用Nand Flash闪存芯片来存储应用程序、数据信息等,这里使用Cramfs+Yaffs2联合作为嵌入式文件系统。其中内核空间使用高压缩、只读的Cramfs作为根文件系统,用于节省存储空间和保护根文件系统;用户空间使用可读写的Yaffs2文件系统,作为系统启动、普通文件被挂载后数据的存储。Yaffs文件系统专为Nand Flash而设计,Yaffs2在读/写/删除/垃圾回收操作及内存消耗上都优于Yaffs。

裁剪流程图如图3所示,具体流程如下:

(1)第一步裁剪:先用配置裁剪方法,在文件系统选项中保留对需要文件系统的支持。再用基于代码分析的裁剪方法,使用直接删除、修改源码的思想,删除fs目录下其他文件系统的子目录,并在相应数据结构中删除其类型支持、修改相应系统调用。

(2)第二步裁剪:采用自上而下的思想,分析可能需要的文件系统调用。从应用程序到库函数再到系统功能调用,分析每个系统调用函数间的关系,找出可移除的系统调用和子函数。

系统调用是连接用户程序和内核的接口,Linux内核中与文件系统相关的有70多个。对其裁剪不仅要考虑是否需要还要考虑此系统功能上下文间的调用关系,所以保留最基本的系统调用,对其他可以裁剪的系统调用使用基于调用图的裁剪方法。

文件系统必须保留的调用:对文件(关闭、创建、打开、读写)、对目录(创建、删除、改变)和对文件系统(安装、卸载、创建节点、删除链接)等的基本操作。图4以文件读写系统的调用关系为例,介绍了基于调用图的裁剪方法。

图3 文件系统裁剪流程图

从图4得出,因为嵌入式系统中不需要支持文件多块数据的传输,所以在库函数中可以删除函数readv和writev,及对应的系统调用sys_readv、sys_writev和仅支持此两个系统调用的子函数do_read_ write,而也被其他系统调用调用的函数fget和fput不能删除。

找出可能需要的系统调用后,可利用基于代码分析的裁剪方法,使用条件编译语句对这些系统调用的相关代码进行修改。如在内核代码中的系统调用及相关函数代码、unistd.h中的系统调用编号和call.S中的系统调用表中添加条件编译#ifdef(CONFIG_XXX_SYS_CALL)和#endif。

图4 文件读写系统调用关系图

3 内核裁剪结果的分析

根据软硬件分析实现了RFID手持读写器嵌入式Linux内核的定制,对可裁剪项使用一种混合的裁剪方法进行裁剪,结果和配置裁剪方法对比,如表1所示。由表1可知:无论在内核整体还是内存管理、文件系统、网络等方面,裁剪率均有一定程度的提高;得到294.5 K的内核映像,比配置裁剪方法减少了24.7%,比原始映像减少了38.6%,得到了一个更细粒度的内核。

4 结束语

表1 内核裁剪度结果分析

通过对已有裁剪方法优缺点的分析,本文提出一种面向应用的混合裁剪方法,并以面向RFID手持读写器的具体应用为例,对嵌入式Linux内核“量体裁衣”,得出可裁剪项,以文件系统的裁剪为例,详细介绍混合裁剪方法的裁剪思路。实验结果表明:该裁剪方法与配置方法相比,有着更小粒度、更高精度的裁剪度,得到了更小体积的内核映像。

[1] 严义,左鼎.基于关系矩阵的嵌入式组件裁剪方法[J].计算机工程与应用,2009,45(24):77-79.

[2] Karim Yaghmour.Building embedded linux system[M].New York:O'Reilly,2008.

[3] 魏登峰,田华.基于ARM的嵌入式RFID读写器设计[J].微计算机信息,2009,25(14):190-191.

[4] 顾咏枫,陈章龙.嵌入式Linux裁剪方法[J].小型微型计算机系统,2003,24(9):1697-1770.

[5] 成月良,方寿海.面向应用的嵌入式Linux裁剪方法研究与实现[J].计算机工程与设计,2009,30(11):2684-2686.

[6] 张云蓉,王培东.基于调用图的嵌入式Linux裁剪技术研究[J].哈尔滨理工大学学报,2004,9(2):60-62.

[7] 蔡虹,沈雷,李永红.基于覆盖测试的嵌入式软件自动裁剪[J].计算机工程,2010,36(1):73-75.

[8] 俞勤丰,孙涌.μC/OS-Ⅱ中内存管理方法的分析及改进[J].计算机工程,2009,35(11):280-282.

[9] 雷必成.嵌入式系统中TCP/IP协议的精简与实现[J].微计算机信息.2006,22(17):107-109.

猜你喜欢
源代码读写器内核
强化『高新』内核 打造农业『硅谷』
基于TXL的源代码插桩技术研究
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
微生物内核 生态型农资
揭秘龙湖产品“源代码”
基于视频抓拍读写器的高速公路防倒卡研究
基于随机时隙的RFID读写器防冲突方法