linux文件系统 裁剪,基于PDA的linux文件系统裁剪问题研究

摘要:从PDA的实际特点提出文件系统的特质(VFS),对于其文件系统的裁剪进行了分析,提出了一种的裁剪方法。

关键词:嵌入式Linux;操作系统;剪裁;PDA

中图分类号:TP316文献标识码:A 文章编号:1009-3044(2007)17-31420-02

Research of Tailoring Embedded Linux File System on PDA

JIANG-ChunMao1, DUAN-Ying2

(1.Haerbin Normal University,Haerbin 150500,China;2.Haerbin Institute of Technology,Haerbin 150001,China)

Abstract:Introduced the VFS, proposed the tailor method of embedded Linux file system, and gives a simplification example onPDA.

Key words:embedded Linux; operating system; tailor; PDA(Personal Date Assistant)

1 引言

PDA作为一种智能化的个人数字工具,已经在很大的范围内得到普及,而作为其核心软件的操作系统的研究与开发已经成为目前非常热门的话题。大体说来大致有三种平台(1)Palm OS 。市场份额占据大半江山,主要有Palm,IBM的wordPad等。(2)Win CE 。虽然起步较晚,但是打破Palm一统江山的局面,现如今国内大部分掌上电脑,如联想,方正等都有此类产品推出。以上两种产品优劣各据,前者电池使用时间长但可用性较差,后者易于上手,但软件数量较少。(3)Linux OS。Linux自从发布以来,在嵌入式领域取得了长足的进展,之所以如此,是因为linux本身具有Open Source,性能高效稳定,易于扩展,完善的网络服务,更为重要的是其可以根据具体的实际应用进行大小的订制,本文就linux在PDA中的应用进行阐述。

2 Linux的虚拟文件系统(VFS)

Linux支持大量的文件系统类型,包括XIA,NTFS,VFAT,JFFS和JFFS2,EXT2,EXT3等,其中EXT2和EXT3 是最为成功的文件系统类型,linux之所以支持这么多的文件系统类型最根本的原因是它引入了虚拟文件系统(Virtual File System,简称VFS),用于对这些文件系统进行统一的管理。

VFS是linux内核中的五个主要部分之一 ,为用户空间的程序提供文件的系统接口。隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口。具体的原理图如下:

Linux文件系统的数据结构类似EXT2文件系统,即采用超级块与inode节点数据结构进行管理。超级块结构驻留在内存空间,存放了该文件系统的重要信息。从超级块中可以取到该文件系统中任何一个文件的inode节点,从inode节点则可对该文件进行读写等操作,这就实现了对磁盘中任一文件的控制。

图1 VFS原理图

VFS 只存在在内存,随系统的启动而产生,关闭时候注销。VFS的功能包括:记录可用的文件系统的类型;将设备同对应的文件系统联系起来;处理一些面向文件的通用操作;涉及到针对文件系统的操作时,VFS把它们影射到与控制文件、目录以及inode相关的物理文件系统。

当某个进程发布了一个面向文件的系统调用时,核心将调用VFS中相应的函数,这个函数处理一些与物理结构无关的操作,并且把它重定向为真实文件系统中相应的函数调用,后者则用来处理那些与物理结构相关的操作。

3 文件系统裁剪的方法

作为PDA这些嵌入式的设备对于linux的要求是体积小,功能适中。根据系统的运行情况决定是否需要日志,网络等功能,还要考虑需要存储的文件特点和大小,是否支持大量的索引结点的问题等。

基于特定的需求,一般的文件系统裁剪主要包括:

(1)函数库的裁剪

在linux庞大的函数库中,事实上存在一些没有被任何程序调用的函数库,而且在一些函数库中存在一些从来没有被调用过的函数。因此找到函数和程序之间的依赖关系,只保留那些有用的函数是一个很有用的方法,而在此过程中,利用一些必要的工具来辅助进行函数调用关系的分析,确定函数和程序的调用关系是非常重要的手段。作为函数库之一的共享库裁剪首当其冲,原因很简单,共享库是多个程序调用的库,而如何对它们进行小型化会使得整个系统的体积有较大的变化。它的基本思想是:

通过提取和解析系统库内目标文件、符号的依赖关系,通过对这些依赖构造关系模型进行关系演算,根据应用程序中的符号信息,在库目标文件一级实现系统库的小型化.实现上分为四步:a、确定待调函数集。在ELF文件内部,存在一个Elf32-Sym 数组结构的符号表,用于内部符号定义和外部符号引用,通过对这个符号表的分析可以将ELF应用程序中待调符号(系统函数)抽取出来,从而建立一个应用程序-待调函数符号的多对多关系。b、确定系统库函数与目标文件的对应关系。系统库逻辑上分成:库、目标文件、符号三个层次,库和目标文件都是ELF格式,通过对库的映像文件*_pic.a和每个目标文件中的符号表分析得到库。目标文件的定义关系、目标文件-符号定义关系和目标文件-符号调用关系。c、确定系统库目标文件之间的相互依赖关系。通过对步骤b中相关关系的关系演算得到目标文件-目标文件的完全依赖关系。d、生成小型化系统库。通过对应用程序-待调符号表和目标文件-目标文件依赖表的关系演算得到待调函数所依赖的目标文件集合,将它们进行重新链接即可得到最小化的库文件。

(2)基于统计规律的文件要素的选择

文件系统由于存储在磁盘上,因此其磁盘块的管理方式也是非常环节。不宜过大也不宜过小,过大则碎片增多,过小则读取时间将降低。为了使得磁盘块的大小设计的合理要结合具体的应用进行统计方向的分析。实际经验表明,1K的磁盘块大小特别适合总体积在4M-5M之间的文件系统应用。一方面获得了较高的磁盘利用率,另一方面节约了磁盘空间,访问速度也得到了保证。

索引结点在文件很小却很多的情况下占据了太多的不必要的磁盘空间,因此删除那些不必要的小文件尤其是dev目录下的多余设备文件显得非常的重要。根据实际文件的多寡来设计索引结点,可以有效地利用磁盘空间。那么究竟给多少字节设置一个索引结点呢?根据文件的数量和体积的统计结果,发现1K块设置一个索引结点对于4-5M的文件系统而言是非常合适的。

4 LINUX内核在PDA上的组织

Linux系统分为三个层次:用户、核心和硬件。Linux核心源程序通常都安装在/usr/src/linux下,核心源程序文件按树形结构进行组织。在这里,对Linux内核进行分析:

(1)系统的引导和初始化:Linux系统的引导有Lilo、Loadin引导和Linux的自举引导三种。而Linux的自举引导所对应源程序为arch/i386/boot/bootsect.S,它为实模式汇编程序。无论哪种引导方式,最后都要跳转到arch/i386/Kernel/setup.S。setup.S主要进行实模式下的初始化,为系统进入保护模式做准备。此后,系统执行arch/i386/kernel/head.S。head.S中定义的一段汇编程序setup_idt,负责建立一张256项idt表,此表保存着所有自陷和中断的入口地址,其中包括系统调用总控程序system_call人口地址。除此之外,head.S违要做一些其他初始化工作。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

(2)系统初始化后,运行第一个内核程序asmlinkage void_init start_kernel(void),它定义在/usr/src/linux/init/main.c中。它通过调用usr/src/linux/arch/i386/kemel/traps.c中的函数void-init trap init(void),把各个自陷和中断服务程序的入口地址设置到idt表中。其中系统调用的总控程序system_call就是中断服务程序之一。void_init trap_init(void)函数则通过调用一个宏set_system_gate,把系统调用的总控程序入口挂在中断0x80上。其中SYSCALL_VECTOR是定义在/usr/src/linux/arch/i386/kernel/irq?h中的一个常量0x80, 而systern_call为中断总控程序的入口地址。中断总控程序是用汇编语言在/usr/src/linux/arch/i386/kernel/entry.S中定义。

(3)中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法,并根据系统调用向量,使处理机跳转到保存在sys_call_table表中的相应系统服务例程的入口。从系统服务例程返回后退回用户程序状态,而系统调用向量则在/usr/src/linux/include/asm-386/unistd.h中定义,sys_call_table表是在/usr/src/linux/arch/i386/kernel/entry.S中定义,系统调用的用户编程接口在/usr/src/linux/include/asm-386/unistd.h中定义。

(4)由此可见,Linux的系统调用也象DOS系统的int21h中断服务,把0x80中断作为总的入口,然后转到保存在sys_call_table表中的各种中断服务例程的入口地址,形成各种不同的中断服务。由以上源代码分析可知,要增加一个系统调用就必须在sys_call_table表中增加一项,并在其中保存好系统服务例程的入口地址,然后重新编译内核。当然,系统服务例程是必不可少的。

5 结束语

Linux是一个功能强大的操作系统,并且拥有大量的应用程序,将Linux移植到嵌入式系统,能够充分利用这些成熟的技术,提高开发效率和开发质量。实验表明,我们对Ext2文件系统预分配机制修改适用于我们的基于Strong ARM平台嵌入式Linux环境,在对性能没有明显影响的情况下节省系统开销。当然,在这个方面我们还有许多工作要做,例如为了进一步提高文件系统效率,需要对缓冲缓存机制进行优化,以及使用更加紧凑的文件系统。此外,进程管理、内存管理等模块也需要针对嵌入式应用的特点加以优化。而对于数据管理简单的应用,可以把文件系统以设备驱动的形式实现。

参考文献:

[1]沈玉利.Linux的虚拟文件系统中数据结构的研究[J].湛江海洋大学学报,2001,21(3):61-62.

[2]张云蓉.基于调用图的嵌入式Linux裁剪技术研究[J].哈尔滨理工大学学报 2004.

[3]顾咏枫.嵌入式Linux裁剪方法[J].小型微型计算机系统,2003.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值