嵌入式文件系统是指嵌入式系统中实现文件存取、管理等功能的模块,提供一系列文件输入输出等文件管理功能,为嵌入式系统和设备提供文件系统支持。
嵌入式文件系统(Embedded file system)是指嵌入式系统中实现文件存取、管理等功能的模块,提供一系列文件输入输出等文件管理功能,为嵌入式系统和设备提供文件系统支持。在嵌入式系统中,应用程序通常需要对信息进行存取操作,当任务运行的时候,任务可以在其任务堆栈中存放少量信息,但是存储量要受到内存空间的严格限制,而且在内存空间中的信息随着任务的退出而消失,不适于存放要长期保存的信息。
技术介绍
嵌入式文件系统是指嵌入式系统中实现文件存取、管理等功能的模块,提供一系列文件输入输出等文件管理功能,为嵌入式系统和设备提供文件系统支持。在嵌入式系统中,应用程序通常需要对信息进行存取操作,当任务运行的时候,任务可以在其任务堆栈中存放少量信息,但是存储量要受到内存空间的严格限制,而且在内存空间中的信息随着任务的退出而消失,不适于存放要长期保存的信息。另一方面,一些公共信息为多个任务所共享,需要这些信息独立于具体的任务而存在。
嵌入式系统和桌面系统一样,为用户提供文件系统以方便信息的处理。嵌。入式文件系统以普通桌面操作系统的文件系统为基础发展而来,但两种文件系统的应用环境和自身的要求又有很大的不同:在普通桌面操作系统中,文件系统不仅要管理文件,提供文件系统调用 API,还要管理各种设备,支持对设备和文件操作的一致性。而在嵌入式文件系统中,由于大部分嵌入式系统都是针对特殊目的定制的,因而对嵌入式操作系统的系统功能的模块化和可裁减性提出了更高的要求。
嵌入式系统的应用条件往往比桌面计算机恶劣的多,在恶劣使用环境下系统的稳定性、安全性还要得到足够的保障,通用的文件系统对于可靠性和文件系统自身的安全性并没有特殊的保障机制,因此无法保证这些性能。所以,虽然有许多已经较为成熟的桌面操作系统下的文件系统,如 DOS 下的 FAT 文件系统、WINDOWS NT 下的 NTFS 文件系统以及 UNⅨ下的 inocde 文件系统等,但这些文件系统都不能直接适用于嵌入式系统。要想适用于嵌入式系统,必须进行重新设计。嵌入式文件系统应该借鉴成熟的桌面文件系统,并且进一步根据具体的硬件环境以及应用需求来设计文件系统的体系结构和实现方法。嵌入式文件系统作为嵌入式操作系统的重要组成部分,对于实现嵌入式系统中大量数据的存储和各种操作的管理,有着不可替代的作用。
嵌入式文件系统虽然继承了通用文件系统的组织结构,但由于功能和作用与普通桌面操作系统的文件系统不同,同时又有自己的特点:
在嵌入式系统中,文件系统是嵌入式系统的一个组成模块。它是作为系统的一个可加载选项提供给用户,由用户决定是否需要加载它。
需要满足结构紧凑、代码量小的特点,合理地对文件存储器进行管理。嵌入式系统中的文件存储器空间相对不会太大,必须对其进行高效的管理,以避免对资源的浪费。
使用简单便捷。用户只要知道文件名、文件路径等简单信息特征,就可以方便地对文件进行操作,不必知道文件在具体物理存储空间的运作过程。
安全可靠。对文件、数据的保护是文件系统的基本功能。嵌入式系统的应用通常要求系统必须有较高的可靠性。
支持多种存储设备、可伸缩、可剪裁、可移植等特点。嵌入式应用的领域相当广泛,其采用的硬件环境和操作系统也各不相同。为了适应这种差异性,文件系统应降低对具体硬件环境和操作系统的依赖,具备良好的可移植性。
组件分类
国内外流行的嵌入式操作系统中,多数均具有可根据应用需求而进行定制的文件系统组件,下面对几个主流的嵌入式操作系统的文件系统组件做一个简要介绍。
QNX 的文件系统组件
QNX 被称为 X86 平台上最好的嵌入式操作系统。它提供多种资源管理器,包括各种文件系统和设备管理,支持多个文件系统同时运行,包括提供完全的 POSIX.1 以及 UNIX 语法的 POSIX 文件系统,支持多种闪存设备的嵌入式文件系统,支持对多种文件服务器(WINDOWS NT/95、LANManager 等)的透明访问的 SMB 文件系统、DOS 文件系统、CD-ROM 文件系统等,并支持多种外部设备,如 USB 舢 ART,IDE 及 SCSI 磁盘等。
VxWorks 的文件系统组件 FFS
VxWorks 是使用最广泛的嵌入式操作系统。它提供的文件系统组件.“快速文件系统”(FFS)非常适合于实时系统的应用。它包括几种支持使用块设备(如磁盘)的本地文件系统,这些设备都使用一个标准的接口从而使得文件系统能够被灵活的在设备驱动程序上移植。另外,VxWorks 也支持 SCSI 磁带设备的本地文件系统【101。VxWorks 的 I/O 体系结构甚至还支持一个单独的 VxWorks 系统上同时并存几个不同的文件系统,VxWorks 支持四种文件系统:FAT、TRLlFS、rawFS、tapeFS。VxWorks 借鉴了 UNIX 设计中“设备即文件”的重要思想,将外部设备作为一个特殊的数据文件进行处理,使得普通数据文件和外部设备在用户面前有相同语法定义,使用相同的保护机制,便于系统管理和应用设计。
uCLinux 的文件系统
uCLinux 继承了 Linux 完善的文件系统性能,其采用的是 romfs 文件系统。这种文件系统相对于一般的 ext2 文件系统要求更少的空间,空间的节约来自于两个方面:首先,内核支持 romfs 文件系统比支持 ext2 文件系统需要更少的代码;其次,romfs 速度文件系统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。Romfs 文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟 ram 盘的方法进行处理(ram 盘将采用 ext2 文件系统)。
pSOS 文件管理系统
pSOS 文件管理系统称为 pHILE+,它提供了文件系统管理和对块设备的管理。pSOS 可以通过 pHILE+有效的访问各种不同的存储设备,包括本地设备和网络设备。文件系统包括 CD.ROM 设备、FAT 兼容文件系统和 pSOSytem 特有的快速文件系统。以上几种嵌入式文件系统是现在商用嵌入式文件系统的主流,占领大部分的市场,也代表了这个领域的先进技术,但是由于商业机密的限制,源代码和核心技术不可能公开,购买和维护费用昂贵,而且由于嵌入式系统的专用性。无法形成统一的标准。
特点
可移植性
移植性是判定嵌入式软件,特别是操作系统组件实用性的一大重要指标。文件系统组件在设计开始就注重了软件的移植性。首先,整个实时文件系统模块和设备驱动管理模块主体由 C 语言构建,可以较为方便地移植到不同体系结构的 CPU 之上;此外,文件系统组件与实时操作系统内核的接口为有限的信号量、定时器、中断、内存等系统调用。由于几乎所有的实时操作系统内核都提供了上述机制,因此文件系统组件只需针对实际情况作少量修改就可以非常方便的移植到不同的实时内核之上。
资源消耗
文件系统组件的资源消耗主要包括程序代码本身占用的存储空间开销、运行时内存动态分配引起的开销、处理器时间占用开销等。由于在不同平台下使用不同编译器编译生成的代码长度有微小的差别,表 1 以 ARM-7 芯片为硬件平台,列出了 GNU C 编译器下实时文件系统(包括 FAT12/FAT16/FAT32 逻辑文件系统代码,不包括具体的设备驱动和设备高速缓存)引起的内存资源开销。设备驱动程序占用空间大小由取决于具体应用。由于文件系统组件设备驱动管理层对各种设备驱动程序对上层的接口作了统一的抽象处理,支持在运行中方便的挂载各种不同的设备驱动程序,因此文件系统组件除了上表所列的内存资源开销外,还包括使用的设备驱动程序引起的开销。表 2 列出了目前文件系统实现的主要设备驱动的内存空间占用量。不难看出,整个实时文件系统组件结构紧凑、代码量小,并且可以根据应用的需求作进一步裁剪。在一个典型的应用环境下,整个文件系统(含设备驱动)的代码不超过 100KB 完全可以固化在 ROM 中,用于各种嵌入式应用。
FAT 表存取优化
文件系统中借鉴了 Linux 中得以广泛应用的虚拟文件系统(Virtual File System)的实现机制,理论上可以挂载不同逻辑格式的文件系统,目前已完全支持 FAT 全系列(FAT12/FAT16/FAT32)。由于 FAT 是一类位图型的文件系统格式,对文件的读写操作需要不断的访问和修改 FAT 表,因此对 FAT 表的读写效率在一定意义上影响了文件系统的性能。对于 FAT12/FAT16 两种 FAT 表较小的文件系统,采用将 FAT 表一次全部缓冲到物理内存中的方式;FAT32 文件系统的 FAT 表较大(最坏情况下可达数兆之多),在嵌入式应用中完全缓冲显然不现实,因此采取了折中的机制,根据目标环境可以配置 FAT cache 的大小,以提高 FAT 表的存取效率。