APP下载

一种可靠高效的闪存文件系统

2013-09-25

单片机与嵌入式系统应用 2013年12期
关键词:空余扇区启动

王 江

(上海贝尔股份有限公司N&P,上海201206)

引 言

支持闪存的文件系统多种多样,常见的有JFFS、YAFFS、TrueFFS等,它们各有所长,但却都不适合管理系统启动时的配置文件和软件。为此,笔者开发了一款可靠高效的文件系统——EFFS(Efficient Flash File System,高效闪存文件系统)。

1 文件系统的特点

因为这款文件系统的首要服务对象是系统启动,系统启动要求快速而稳定,所以它的文件系统必须具有以下特点:

①快速。启动速度快无疑会给用户留下美好的印象,所以初始化文件系统、搜索和读取文件应该尽可能快速。

②可靠。可靠性体现在三个方面。首先,目录和文件的完整性——通过校验码来保证;其次,文件的冗余性,如果一个文件被破坏或者加载失败,自动后退加载同一功能的另一个文件,不影响系统的启动;最后,记录文件和目录的信息表有备份,破坏后能够自动恢复。

这是一款以扇区为基础的文件系统,层次结构如图1[1]所示,闪存驱动层屏蔽了闪存芯片的具体信息,例如闪存种类、缓存大小、分区大小。因为文件系统必须支持各种类型的闪存,所以该层的一个重要特性是可以识别多种闪存芯片。扇区管理层负责物理扇区和逻辑扇区的映射,实现坏块管理和磨损均衡。API层提供了丰富的接口给外部应用,可使文件系统内部改变,而不致影响外部应用接口。OS(操作系统)在启动阶段时指启动程序,例如BIOS、Bootloader,启动完成后指应用所依赖的Linux、WinCE等操作系统。

图1 文件系统层次结构

2 文件系统的结构

整个文件系统的架构如图2(a)所示,共分为5个区域:3个目录(目录0~目录2)、2个文件系统信息表。这2个文件系统信息表互为备份,默认使用信息表0。如果信息表0损坏,则使用信息表1,同时把信息表1的数据复制到信息表0,即修复信息表0。每个文件信息表占用闪存的若干个扇区。其存放位置由用户自定义,一般位于闪存的末尾。

每个目录由目录信息表、文件和空闲区域组成。目录信息表中存放了目录和文件的属性,其组织格式如表1所列。信息表的头部是目录属性,定义了目录名称、版本、创建日期、长度、空余空间、校验和等,紧接着目录属性,是每个文件的属性。目录中有几个文件,就有几个文件属性的表项。

文件属性定义了文件名称、版本、校验和、在目录中的偏移地址、长度等。因为有些文件可以执行,例如故障诊断软件和操作系统,所以文件属性中包含了一项入口地址,对于不可执行文件,这一项设置为0。为了节省闪存空间,目前文件系统支持两种压缩格式:gzip和bz2,即文件可以压缩后存放在闪存中,同时在“文件压缩类型”记录对应的压缩格式。当文件被读取时,根据“文件压缩类型”选择适合的解压缩算法。

图2 文件系统架构

表1 目录信息表格式

物理上的3个目录在逻辑上分别被定义为当前(C)、先前(P)和原始(O)3个目录。目录0在硬件上设置为写保护,所以原始目录一般指向目录0,该目录中在出厂时存放一个最保险的、能够让系统稳定运行的软件版本。该设计可以使得其他2个目录都损坏时,系统仍然有一个基本的能正常启动的软件备份。当前目录指向目录2还是目录1、先前目录指向目录2还是目录1允许用户自定义。对于每种类型的文件,在文件系统信息表中均有选择开关,指示下次启动加载哪个目录中的文件。所以文件系统信息表的组织如表2所列,主要定义了3个目录在闪存中的地址、物理目录和逻辑目录的对应关系、各个文件选择的目录和实际加载成功的目录等。

表2 文件系统信息表格式

2.1 文件的选择

当文件系统被加载,即文件系统初始化时,程序将首先检查文件系统信息表的完整性,然后根据信息表,检查各个目录的完整性,这些检查结果都会记录在内存的一个数据结构中。如果今后文件系统没有改变,就可以直接使用内存中的数据,无需再次检查,提高了系统性能。

接着,启动程序会根据文件系统信息表中的设置将文件加载到相应的器件中。文件是根据逻辑目录来进行选择的。如果文件选择的目录为当前目录,则先在当前目录中查找该文件,如果文件不存在、损坏或者加载失败,则从先前目录中查找。如果先前目录中的文件也不存在、损坏或加载失败,则从原始目录加载,原始目录中的文件肯定是存在的,因为它们是写保护并且在出厂时就烧录好的。

如果文件选择的目录为先前目录,则从先前目录中查找,如果文件不存在、损坏或者加载失败,则加载原始目录中的文件。如果文件选择的目录为原始目录,则直接从原始目录中查找和加载。文件的选择如图3所示。所以在使用时,一般将待测的最新版本的软件存放在当前目录,而将测试通过的软件存放在先前目录,而文件选择开关通常设置为当前目录,这样可以充分利用3个目录逐级备份的冗余特性,提高系统的可靠性。

图3 文件的选择

每个文件加载成功后,系统将在文件系统信息表中记录加载成功的目录,用户可以根据这个信息,结合“文件选择目录”信息,判断出所选择文件是否运行成功。

2.2 运行软件的选择

启动程序将配置文件加载到NPU、DSP、FPGA等器件之后,最后的使命是根据文件系统信息表中“操作系统文件”选项加载软件,该软件可以是故障诊断程序、Linux或VxWorks等操作系统。这个特征允许同一硬件平台支持安装和运行不同的操作系统。

2.3 相关的用户命令

与文件系统密切配合的是简洁实用的用户命令,详见表3,它们方便了用户查看、增减目录和文件,选择启动软件等。

表3 文件系统命令列表

命令主要分为三类:一是与目录操作相关的,包括查看目录属性、创建目录、删除目录、升级目录和目录碎片整理;二是与文件操作相关的,包括查看文件属性、新增文件、删除文件、升级文件;三是其他操作命令,包括设置系统运行的软件、指定文件首选的目录、建立逻辑目录和物理目录之间的关系,例如选择哪个目录为当前目录,哪个目录为先前目录。

其中新增文件命令较为复杂。如果有压缩要求,它首先对文件进行压缩,然后根据压缩后的文件大小在目录中搜寻空余空间,如果没有找到,则调用目录碎片整理程序整理碎片,将分散的不连续小尺寸的碎片组合成连续的大尺寸空间,整理完成后再次搜寻。找到空间后调用闪存驱动将文件写入,接着计算校验和,更新目录信息表中的文件数目,同时写入文件偏移地址、长度和其他文件属性。值得注意的是,在多内核或多任务操作系统中,目录空余空间的搜寻代码需要用互斥锁保护起来,否则当一个任务正在搜寻空余空间时,被中断或被另一个优先级更高的任务所抢占,后者恰巧也调用了搜寻空余空间的函数,则可能导致两个任务都得到了相同地址的空余空间,导致操作失败或者目录损坏。其他需要互斥锁保护的还有目录中文件数目选项的更新等。

当多次在同一目录中执行增加和删除文件操作后,目录中可能出现不连续的空余空间,即碎片,系统将碎片整理程序作为一个低优先级的任务或线程在后台运行,一旦处理器有空闲,则对目录碎片进行整理,有效提高了下一次写入文件操作的速度。

3 与其他文件系统的比较

JFFS/JFFS2和YAFFS/YAFFS2是业界应用较广的闪存文件系统,针对系统启动,加载智能芯片的配置文件方面的应用,与EFFS相比稍逊一筹。表4列举了3种闪存文件系统在几个关键指标上的对比。

表4 文件系统性能比较

由表可见,在闪存类型方面,JFFS2[2]和YAFFS2[3]各有偏爱,而EFFS都能适用。在文件系统的加载速度上,EFFS处于微秒级水平,且于闪存容量无关,远快于其他2种文件系统,后者比较慢且与闪存容量成正比。在可靠性方面,EFFS能够在加载一个文件失败后,自动寻找并加载同类型的文件,JFFS2和YAFFS2却无能为力。

结 语

本文提出了一种适合系统启动闪存使用的文件系统。这种文件系统不仅加载速度快,而且可靠性高,易于移植和扩展。经过测试,其性能并且占用内存少,完全能够帮助用户实现对智能芯片文件的高效管理并满足系统的启动要求。

[1] Numonyx Inc.闪存文件系统概况,2008.

[2] IBM Inc.JFFS2文件系统及新特性介绍,2005.

[3] How Yaffs works[OL] .(2012-06)[2013-06] .http://www.yaffs.net/documents/how-yaffs-works.

猜你喜欢

空余扇区启动
分阶段调整增加扇区通行能力策略
蝶恋花·寂夜
初夏山茶
浣溪沙
管制扇区复杂网络特性与抗毁性分析
U盘故障排除经验谈
雾霾来袭 限产再次启动
安发生物启动2017
基于贝叶斯估计的短时空域扇区交通流量预测
西部最大规模云计算中心启动