Cramfs、JFFS2、YAFFS2全面对比 分类: arm-linux-Ubuntu 2013-08-21 10:42 904人阅读 评论(0) 收藏
由 于嵌入式系统自身存在一些特殊要求使得一些传 统的文件系统 (如FAT、EXT2等) 并不十分适合。专 用的嵌入式文件系统应有一些自身的特性如文件系统 面对的储存介质特殊性、文件系统应具有的跨平台的安 全性以及整个系统的实时性等。本 文介绍了3种源 码开放的嵌入式文件系统Cramfs、JFFS2、YAFFS2 详细分析比较了这3种文件系统的主要性能并根据分 析结果指出了各自的适 用领域 Cramfs、JFFS2、YAFFS2是3种性能优越专用于嵌入式系 统的文件系统。本文通过对这3种文件系统的设计原理和主要性 能进行分析与比较归 纳出各自的选型依据据和适用领域。 三种文件系统的介绍 Cramfs Cramfs是Linux的创始人Linus Torvalds开发的一种只读 文件系统采用了zlib压缩压缩比一般可以达到12但仍 可以做到高效的随机读取。在Linux系统中通常把不需 要经 常修改的目录压缩存放在系统引导时再将压缩文件解开。 Cramfs并不需要一次性地把文件系统的所有内容都解压到内存 中而只是在系统需要访问某 个位置的数据时马上计算出该数据在Cramfs中的位置将其解压缩到内存之中然后通过对 内存的访问来获取需要读取的数据。 JFFS2 JFFS意为「Journaling Flash File System」该文件系统 是瑞典Axis通信公司开发的一种基于Flash内存的日志文件系 统。该公司于1999年在GNU/Linux上发行了第一 版JFFS文 件系统后来经过Redhat公司的发展现在已经发行了第二个 版本的JFFS2其全部程序代码都是可供研究开发的。它在设 计时充分考虑了嵌 入式系统中Flash内存的读写特性确保在 系统掉电时正在读写的文件不受影响同时其储存策略以及 抗疲劳性等方面也在第一版的基础上进行了改进。 目前JFFS2 广泛应用于嵌入式系统中尤其是嵌入式μClinux操作系统中。 YAFFS2 YAFFS意为「Yet Another Flash File System」是目前 唯一一个专门为NAND Flash设计的文件系统。它采用了类日志 结构结合NAND Flash的特点提供了损耗平衡和掉电保护机 制可以有效地避免意外掉电对文件系统一致性和完整性的影 响。Aleph One公司于2002年5月发布了第一版YAFFS程序 代码用户可以很方便地在网站上下载到。第一版的YAFFS只 支持每页512字节的NAND Flash。 YAFFS2是YAFFS的升级版即支持每页512字节的NAND Flash内存也支持每页 2048字节的NAND Flash内存。 Flash内存 Flash设备特点 相对于传统储存介质Flash内存具有如下优点 ˙ 可靠性高采用Flash为储存介质可以确保100万次以上的 可靠写入 ˙ 储存速度快写入∕读取均可接近1Mb/s ˙ 使用方便具有很强的环境适应能力。 但是由于其制造制程的问题还存在以下缺点 ˙ 读取和写入以页为单位擦除以块为单位 ˙ 易出现随机坏块 ˙ 块与块之间使用不均衡会导致寿命问题。 NOR Flash和NAND Flash 基于NOR技术的Flash内存是最早出现的Flash内存它 具有以下特点 ˙ 程序和数据可存放在同一芯片上拥有独立的数据总线和地址 总线支持快速随机读取允许系统直接从Flash中读取程序代码并执行而无需先将程序代码下载至RAM中再执行 ˙ 可以单字节或单字程序化但必须以块为单位进行擦除操作。 由于NOR Flash内存的擦除和程序化速度较慢而块尺寸 又比较大因此擦除和程序化操作所花费的时间很长。目前 NOR Flash内存大多只用于储存嵌入式系统的启动程序代码。 NAND Flash内存可以顺序读取储存单元的内容由于制 程上的进步其容量越来越大单位价格越来越便宜正逐步成 为Flash内存的主流。NAND Flash内存具有以下特点 ˙ 以页为单位进行读写操作以块为单位进行擦除操作页大小 为512字节或2048字节每页不仅有 数据区还有几十字节的空闲区。 ˙ 数据、地址采用同一总线接口串行读取。 ˙ 芯片尺寸小接脚少单位成本低。 ˙ 芯片内含有失效块并且在使用过程中可能会出现随机坏块。 表1 比较了这两种Flash内存的性能参数。 三种嵌入式文件系统主要性能分析与比较 数据安全、运行速度、占用资源、使用范围等是嵌入式文 件系统的主要性能指针。下面从这几个方面入手对这三种嵌入 式文件系统进行分析与比较。 数据安全 当前的嵌入式系统主要使用固态Flash芯片作为储存设备。 由于Flash设备自身的特点以及嵌入式系统工作环境的复杂多 样性如何保证数据的安全是嵌入 式文件系统首先要考虑的问 题。数据安全主要包括数据冗余和掉电保护等部分。 资料冗余 提高数据安全性的最有效措施是增加数据的冗余而数据的大量冗余又给维护资料一致性 带来困难。对此应进行合理取舍在尽量降低冗余的前提下确保数据的安全性和可靠性。 Cramfs文件系统是一种只读文件系统文件系统内容不可 更改设计思想遵循「只储存最少的信息」甚至没有时间戳之类的信息除了数据包的CRC校验 信息外几乎没有别的数据 冗余。 JFFS2文件系统是典型的日志结构的文件系统它储存的 数据是日志式数据信息。JFFS2在Flash上只有两种类型的数据 实 体j.ffs2_raw_inode和jffs2_raw dirent。前者包含文件的管 理信息后者用于描述文件在文件系统中的位置。真正的数据信 息就保持在jffs2_raw_inode节点的后面大部分 管理的信息都 是在系统挂载之后建立起来的。两种数据实体有着公共的文件头 结构jffs2 _ unknown_node。在这个结构里有个jint32 _t类型 的hdr_crc变量它代表文件头部中其它域的CRC校验值。这 说明JFFS2文件系统使用的是CRC循环冗余校验码。 YAFFS2文件系统是一种类日志文件系统专用于NAND 型Flash设备。其储存数据的基本单位是chunk相当于Flash 的页。Chunk中的 数据包括两部分一部分是数据区占用Flash 的一页另一部分是文件信息及冗余数据区占用Flash页的 OOB区。其冗余数据主要是ECC校验资 料对于小页每页 512字节的Flash每页有6字节的ECC数据对于大页每 页2048字节的Flash每页有24字节的ECC资 料。 掉电保护 掉电保护的目的是在系统意外失去供电的情况下保证 系统运行状态的确定性以及记录数据的完整性当系统供电恢复 后现场数据可以及时恢复避免系统产生 混乱。很多文件系 统出于运行速度考虑在程序运行过程中常将数据暂存在 SDRAM中一旦系统意外掉电往往会造成数据丢失。 Cramfs文件系统将文件系统内容解压到内存中由于其不 能写入文件系统的内容无法更改因此不存在掉电保护的问题。 JFFS2是一种日志结构文件系统因此不论电源以何种方 式在哪个时刻停止供电JFFS2都能保持数据完整性。当系统 遭受不正常断电后重新启动 时JFFS2自动将系统恢复到断电 前最后一个稳定状态。需要注意的是文件系统在最后一个稳定 状态之后发生的任何改变都无法进行恢复。 YAFFS2是一种类日志文件系统可以在意外掉电重启后 自动提供可靠的数据记录防止文件系统的崩溃。它使用独立的 日志文件跟踪文件系统内容的变化。举 例来说当应用程序需 要写Flash的某一页时它首先修改的是存放于文件日志中的一 块镜像只有当日志中的镜像复制到文件系统中后数据才真实 地写到该 页上。当发生意外掉电重启后YAFFS2没有像JFFS2 那样使用旧文件完全代替新写文件而是选择用新文件完全代替旧的文件或者已写部分使用新文 件未写部分使用旧文件。 这种方式增强了掉电时未完全写入文件的安全性能特别是当意 外掉电发生在数据区时意外掉电时的文件几乎被完好地保存下 来。 运行速度 运行速度可以从以下几个方面考察文件系统挂载速度 读文件速度写文件速度等。这里预设的储存介质是NAND Flash。 一般而言压缩的、只读的文件系统在启动时需要将文件 系统解压到SDRAM中这在一定程度上会减缓文件系统挂载速 度。但是Cramfs文件系统在设计 时充分考虑了系统挂载的时 间并没有一次性地把文件系统的所有内容都解压到内存中而 只是在系统需要访问某个位置的数据时迅速计算出该数据在 Cramfs中的位置将其解压缩到内存之中再进行访问操作。 由于其读文件速度只是找出文件地址以及访问内存的操作所以 无论是挂载速度还是读文 件速度 Cramfs文件系统都比 JFFS2和YAFFS2文件系统要快。 JFFS2文件系统的挂载可以分为以下几个步骤进行 1. 检查每个节点CRC校验码的合法性在内存中为每个节点每个节点分配必需的相关的结构 2. 扫瞄每个i节点的物理节点链表建立链接 3. 释放扫瞄过程中使用的临时信息。 可以看出这个过程还是很复杂的更重要的是在JFFS2 文件系统被挂载时需要对整个Flash储存区域进行扫瞄这就 耗费了大量的时间因此 JFFS2文件系统的开机速度非常缓慢。 与JFFS2相比YAFFS2减少了一些功能挂载时只需扫瞄Flash 内存的空闲区根据从OOB备份资 料区中读取的yaffs_tags 信息判读是文件头页面还是资料页面再根据相应信息在内存中 为每个文件建立一个对应的yaffs_object对 象。由于YAFFS2 在系统加载时只需扫瞄各个页面的OOB区即可建立起整个文 件系统的结构而不需要像JFFS2那样扫瞄整个Flash设备 因此大 大加快了文件系统的启动速度。但是YAFFS2仍然要 求对整个Flash设备所有页的空闲进行扫瞄这就导致当Flash 设备储存空间变大时系统扫瞄 时间会直线上升。 在文件系统运行时JFFS2需要维护几个链表来管理擦写 块。根据擦写块上的内容一个擦写块可能会在不同的链表上。 具体来说当一个擦写块上都是合法 valid的节点时它会 在clean_list上当一个擦写块包含至少一个过时obsolete 的节点时它会在dirty_list上当 一个擦写块被擦写完毕并被写入Cleanmarker节点后它会在free_list上。正是以这些 链表为基础 JFFS2文件系统才可以实现垃圾回收、损耗平衡 等性能。文件系统挂载时YAFFS2在内存中建立一个层次结构 的索引可以看作是一个文件树。树的最底 层指向实际存放文 件的页面高层则是一层层的索引目录。文件树是通过一个联合 结构的节点来实现的。联合结构是固定大小32字节当它 处于最底层时 由16个2字节入口来查找页面ID当处于其 它层时由8个4字节指针指向其它更低层的节点。每个文件对 应一个文件树便于检索。在以NAND Flash为储存介质的嵌入 式系统中YAFFS2的文件读写性能都优于JFFS2。 占用资源 在嵌入式系统中内存和外部内存资源匮乏需要节约使 用。因此占用的内存和外部内存资源量也是衡量嵌入式文件系统 的一个重要指针。 如果使用RAMDISK方式运行文件系统那么在系统运行 之后首先要把Flash上的映像文件解压到内存中才可以开始 运行程序。这样同样的程序代码 不仅在外部内存中占据了空 间而且由于解压缩还在内存中占用了更大的空间。Cramfs 虽然是一个压缩式的文件系统但前面已介绍过它并不需要一 次性地将所有内容解压到内存之中。由于其对文件内容的压缩因此无论是外部内存还是内存 Cramfs都比JFFS2和YAFFS2 占用更少的资源。 JFFS2将文件系统的数据和原数据以节点的形式储存在 Flash上其冗余数据只是节点头部的CRC校验码并且在储 存时对节点的数据进行了压缩。与之 相比YAFFS2不仅储存 了页数据的ECC校验码并且没有Flash设备OOB区储存数 据而是用来储存页节点信息。其映像也是由若干个页面组成 没 有对数据进行压缩因此YAFFS2文件系统映像大大超过了 JFFS2文件系统映像。实验表明普通YAFFS2映像的大小约 为同样JFFS2映像大小的 2倍。当文件系统在内存中运行时 JFFS2在内存中定义了若干链表YAFFS2在内存中为每个文 件创建一个文件树。尽管为每个文件建立一个文件 树需要消耗 掉不少的内存但是比起维护JFFS2所需的链表消耗的内存 还是少一些。在实际运行中YAFFS2占用的内存要小于JFFS2 文件系 统。 使用范围 要使用Cramfs或JFFS2文件系统离不开MTD驱动程 序层的支持。MTDMemory Technology Device是Linux中 的一个储存设备通用界面层。虽然也可以建立在RAM上但它 是专为基于Flash的设备而设计的。MTD包含特定Flash 芯片的驱动程序 Flash芯片驱动向上层提供读、写、擦除等基本 的Flash操作方法。MTD对这些操作进行封装后向用户层提供 MTD char和MTD block类型的设备。MTD char类型的设备包 括/dev/mtd0等可以对Flash的原始字符访问MTD block类 型的设备包括/dev/mtdblock0等将Flash模拟成块设备这样 就可以在这些块设备上创建Cramfs或JFFS2等格式的文 件系 统。在对用户层的界面上 Cramfs或JFFS2文件系统还需要 操作系统VFS虚拟文件系统的支持。 同样YAFFS2文件系统支持使用MTD驱动层和VFS层 这也是一般在嵌入式Linux或者μClinux操作系统中使用 YAFFS2文件系统的常用 方法。除此之外YAFFS2还带有 NAND Flash芯片驱动并为嵌入式系统提供了直接访问文件系 统的API用户可以不使用Linux中的MTD和VFS直接对文 件进行操作。图1 为嵌入式系统的文件系统结构。 YAFFS2中的YAFFS2 Direct提供了直接的文件系统界 面因此在那些没有VFS层的嵌入式系统中也可使用YAFFS2。 YAFFS2文件系统的使用范围要比Cramfs和 JFFS2文件系统 广泛但是需要注意的是YAFFS2只能用在NAND Flash储存 设备上。 结论 这3种嵌入式文件系统在嵌入式系统中的应用非常广泛 但是又具有各自的特点。表2 比较了3种文件系统的主要性能 并归纳出各自最适用的领域。 具体分析如下 1. Cramfs是最早的一种嵌入式文件系统它只储存了最少的信 息对文件内容进行了压缩运行速度比较 快。但是由于其不能写入不支持超过16 MB大小的文件因 此广泛地应用于储存空间小、文件系统内容 较少并且不需要用户写入的嵌入式系统中。 2. JFFS2是一种较早的Flash专用文件系统。目前已有很多 JFFS2应用于μClinux以及嵌入式Linux的例子。事 实上它已经成为新版Linux中的一种标准文件系统。 同时它对NOR Flash和NAND Flash提供支持针对两种Flash 设备共同的特性提供掉电保护和损耗平衡等 功能可供用户读写十分适合于同时用到这两种Flash设备的 嵌入式系统。 3. YAFFS2是专为NAND Flash设计的文件系统它充分考虑 了NAND Flash设备的特性支持ECC校验提 供掉电保护和损耗平衡功能运行和挂载速度都比JFFS2要快。 它支持操作系统广泛包括常见的嵌入 式Linux、WinCE、μClinux。由于它提供Direct界面因此稍 加修改也可使用在没有操作系统的嵌入式 系统中。目前被广泛应用于使用NAND Flash作为储存设备的 嵌入式系统中。 针对具体应用可以在考察各种文件系统特点的基础上 选择更适合自身系统的一种文件系统解决方案。比如在许多以 NAND Flash为储存介质的应用系统中都用到「Cramfs YAFFS2」文件系统。以Cramfs作为根文件系统既提高了启 动速度也能保护根文件不 受破坏使用YAFFS2作为用户文 件系统在保证用户可以自由读写文件的基础上提高了文件系 统的安全性和运行速度不失为一种优良的嵌入式文件系统解 决方案。由 于嵌入式系统自身存在一些特殊要求使得一些传
统的文件系统 (如FAT、EXT2等) 并不十分适合。专
用的嵌入式文件系统应有一些自身的特性如文件系统
面对的储存介质特殊性、文件系统应具有的跨平台的安
全性以及整个系统的实时性等。本 文介绍了3种源
码开放的嵌入式文件系统Cramfs、JFFS2、YAFFS2
详细分析比较了这3种文件系统的主要性能并根据分
析结果指出了各自的适 用领域
Cramfs、JFFS2、YAFFS2是3种性能优越专用于嵌入式系
统的文件系统。本文通过对这3种文件系统的设计原理和主要性
能进行分析与比较归 纳出各自的选型依据据和适用领域。
三种文件系统的介绍 Cramfs Cramfs是Linux的创始人Linus Torvalds开发的一种只读
文件系统采用了zlib压缩压缩比一般可以达到12但仍
可以做到高效的随机读取。在Linux系统中通常把不需 要经
常修改的目录压缩存放在系统引导时再将压缩文件解开。
Cramfs并不需要一次性地把文件系统的所有内容都解压到内存
中而只是在系统需要访问某 个位置的数据时马上计算出该数据在Cramfs中的位置将其解压缩到内存之中然后通过对
内存的访问来获取需要读取的数据。
JFFS2 JFFS意为「Journaling Flash File System」该文件系统
是瑞典Axis通信公司开发的一种基于Flash内存的日志文件系
统。该公司于1999年在GNU/Linux上发行了第一 版JFFS文
件系统后来经过Redhat公司的发展现在已经发行了第二个
版本的JFFS2其全部程序代码都是可供研究开发的。它在设
计时充分考虑了嵌 入式系统中Flash内存的读写特性确保在
系统掉电时正在读写的文件不受影响同时其储存策略以及
抗疲劳性等方面也在第一版的基础上进行了改进。 目前JFFS2
广泛应用于嵌入式系统中尤其是嵌入式μClinux操作系统中。
YAFFS2 YAFFS意为「Yet Another Flash File System」是目前
唯一一个专门为NAND Flash设计的文件系统。它采用了类日志
结构结合NAND Flash的特点提供了损耗平衡和掉电保护机
制可以有效地避免意外掉电对文件系统一致性和完整性的影
响。Aleph One公司于2002年5月发布了第一版YAFFS程序
代码用户可以很方便地在网站上下载到。第一版的YAFFS只
支持每页512字节的NAND Flash。 YAFFS2是YAFFS的升级版即支持每页512字节的NAND Flash内存也支持每页
2048字节的NAND Flash内存。
Flash内存 Flash设备特点
相对于传统储存介质Flash内存具有如下优点
˙ 可靠性高采用Flash为储存介质可以确保100万次以上的
可靠写入
˙ 储存速度快写入∕读取均可接近1Mb/s
˙ 使用方便具有很强的环境适应能力。
但是由于其制造制程的问题还存在以下缺点
˙ 读取和写入以页为单位擦除以块为单位
˙ 易出现随机坏块
˙ 块与块之间使用不均衡会导致寿命问题。
NOR Flash和NAND Flash
基于NOR技术的Flash内存是最早出现的Flash内存它
具有以下特点
˙ 程序和数据可存放在同一芯片上拥有独立的数据总线和地址
总线支持快速随机读取允许系统直接从Flash中读取程序代码并执行而无需先将程序代码下载至RAM中再执行
˙ 可以单字节或单字程序化但必须以块为单位进行擦除操作。
由于NOR Flash内存的擦除和程序化速度较慢而块尺寸
又比较大因此擦除和程序化操作所花费的时间很长。目前
NOR Flash内存大多只用于储存嵌入式系统的启动程序代码。
NAND Flash内存可以顺序读取储存单元的内容由于制
程上的进步其容量越来越大单位价格越来越便宜正逐步成
为Flash内存的主流。NAND Flash内存具有以下特点
˙ 以页为单位进行读写操作以块为单位进行擦除操作页大小
为512字节或2048字节每页不仅有
数据区还有几十字节的空闲区。
˙ 数据、地址采用同一总线接口串行读取。
˙ 芯片尺寸小接脚少单位成本低。
˙ 芯片内含有失效块并且在使用过程中可能会出现随机坏块。
表1 比较了这两种Flash内存的性能参数。
三种嵌入式文件系统主要性能分析与比较 数据安全、运行速度、占用资源、使用范围等是嵌入式文
件系统的主要性能指针。下面从这几个方面入手对这三种嵌入
式文件系统进行分析与比较。
数据安全 当前的嵌入式系统主要使用固态Flash芯片作为储存设备。
由于Flash设备自身的特点以及嵌入式系统工作环境的复杂多
样性如何保证数据的安全是嵌入 式文件系统首先要考虑的问
题。数据安全主要包括数据冗余和掉电保护等部分。
资料冗余
提高数据安全性的最有效措施是增加数据的冗余而数据的大量冗余又给维护资料一致性
带来困难。对此应进行合理取舍在尽量降低冗余的前提下确保数据的安全性和可靠性。
Cramfs文件系统是一种只读文件系统文件系统内容不可
更改设计思想遵循「只储存最少的信息」甚至没有时间戳之类的信息除了数据包的CRC校验 信息外几乎没有别的数据
冗余。
JFFS2文件系统是典型的日志结构的文件系统它储存的
数据是日志式数据信息。JFFS2在Flash上只有两种类型的数据
实 体j.ffs2_raw_inode和jffs2_raw dirent。前者包含文件的管
理信息后者用于描述文件在文件系统中的位置。真正的数据信
息就保持在jffs2_raw_inode节点的后面大部分 管理的信息都
是在系统挂载之后建立起来的。两种数据实体有着公共的文件头
结构jffs2 _ unknown_node。在这个结构里有个jint32 _t类型
的hdr_crc变量它代表文件头部中其它域的CRC校验值。这
说明JFFS2文件系统使用的是CRC循环冗余校验码。
YAFFS2文件系统是一种类日志文件系统专用于NAND
型Flash设备。其储存数据的基本单位是chunk相当于Flash
的页。Chunk中的 数据包括两部分一部分是数据区占用Flash
的一页另一部分是文件信息及冗余数据区占用Flash页的
OOB区。其冗余数据主要是ECC校验资 料对于小页每页
512字节的Flash每页有6字节的ECC数据对于大页每
页2048字节的Flash每页有24字节的ECC资 料。
掉电保护 掉电保护的目的是在系统意外失去供电的情况下保证
系统运行状态的确定性以及记录数据的完整性当系统供电恢复
后现场数据可以及时恢复避免系统产生 混乱。很多文件系
统出于运行速度考虑在程序运行过程中常将数据暂存在
SDRAM中一旦系统意外掉电往往会造成数据丢失。
Cramfs文件系统将文件系统内容解压到内存中由于其不
能写入文件系统的内容无法更改因此不存在掉电保护的问题。
JFFS2是一种日志结构文件系统因此不论电源以何种方
式在哪个时刻停止供电JFFS2都能保持数据完整性。当系统
遭受不正常断电后重新启动 时JFFS2自动将系统恢复到断电
前最后一个稳定状态。需要注意的是文件系统在最后一个稳定
状态之后发生的任何改变都无法进行恢复。
YAFFS2是一种类日志文件系统可以在意外掉电重启后
自动提供可靠的数据记录防止文件系统的崩溃。它使用独立的
日志文件跟踪文件系统内容的变化。举 例来说当应用程序需
要写Flash的某一页时它首先修改的是存放于文件日志中的一
块镜像只有当日志中的镜像复制到文件系统中后数据才真实
地写到该 页上。当发生意外掉电重启后YAFFS2没有像JFFS2
那样使用旧文件完全代替新写文件而是选择用新文件完全代替旧的文件或者已写部分使用新文 件未写部分使用旧文件。
这种方式增强了掉电时未完全写入文件的安全性能特别是当意
外掉电发生在数据区时意外掉电时的文件几乎被完好地保存下
来。
运行速度 运行速度可以从以下几个方面考察文件系统挂载速度
读文件速度写文件速度等。这里预设的储存介质是NAND
Flash。
一般而言压缩的、只读的文件系统在启动时需要将文件
系统解压到SDRAM中这在一定程度上会减缓文件系统挂载速
度。但是Cramfs文件系统在设计 时充分考虑了系统挂载的时
间并没有一次性地把文件系统的所有内容都解压到内存中而
只是在系统需要访问某个位置的数据时迅速计算出该数据在
Cramfs中的位置将其解压缩到内存之中再进行访问操作。
由于其读文件速度只是找出文件地址以及访问内存的操作所以
无论是挂载速度还是读文 件速度 Cramfs文件系统都比
JFFS2和YAFFS2文件系统要快。
JFFS2文件系统的挂载可以分为以下几个步骤进行
1. 检查每个节点CRC校验码的合法性在内存中为每个节点每个节点分配必需的相关的结构
2. 扫瞄每个i节点的物理节点链表建立链接
3. 释放扫瞄过程中使用的临时信息。
可以看出这个过程还是很复杂的更重要的是在JFFS2
文件系统被挂载时需要对整个Flash储存区域进行扫瞄这就
耗费了大量的时间因此 JFFS2文件系统的开机速度非常缓慢。
与JFFS2相比YAFFS2减少了一些功能挂载时只需扫瞄Flash
内存的空闲区根据从OOB备份资 料区中读取的yaffs_tags
信息判读是文件头页面还是资料页面再根据相应信息在内存中
为每个文件建立一个对应的yaffs_object对 象。由于YAFFS2
在系统加载时只需扫瞄各个页面的OOB区即可建立起整个文
件系统的结构而不需要像JFFS2那样扫瞄整个Flash设备
因此大 大加快了文件系统的启动速度。但是YAFFS2仍然要
求对整个Flash设备所有页的空闲进行扫瞄这就导致当Flash
设备储存空间变大时系统扫瞄 时间会直线上升。
在文件系统运行时JFFS2需要维护几个链表来管理擦写
块。根据擦写块上的内容一个擦写块可能会在不同的链表上。
具体来说当一个擦写块上都是合法 valid的节点时它会
在clean_list上当一个擦写块包含至少一个过时obsolete
的节点时它会在dirty_list上当 一个擦写块被擦写完毕并被写入Cleanmarker节点后它会在free_list上。正是以这些
链表为基础 JFFS2文件系统才可以实现垃圾回收、损耗平衡
等性能。文件系统挂载时YAFFS2在内存中建立一个层次结构
的索引可以看作是一个文件树。树的最底 层指向实际存放文
件的页面高层则是一层层的索引目录。文件树是通过一个联合
结构的节点来实现的。联合结构是固定大小32字节当它
处于最底层时 由16个2字节入口来查找页面ID当处于其
它层时由8个4字节指针指向其它更低层的节点。每个文件对
应一个文件树便于检索。在以NAND Flash为储存介质的嵌入
式系统中YAFFS2的文件读写性能都优于JFFS2。
占用资源 在嵌入式系统中内存和外部内存资源匮乏需要节约使
用。因此占用的内存和外部内存资源量也是衡量嵌入式文件系统
的一个重要指针。
如果使用RAMDISK方式运行文件系统那么在系统运行
之后首先要把Flash上的映像文件解压到内存中才可以开始
运行程序。这样同样的程序代码 不仅在外部内存中占据了空
间而且由于解压缩还在内存中占用了更大的空间。Cramfs
虽然是一个压缩式的文件系统但前面已介绍过它并不需要一
次性地将所有内容解压到内存之中。由于其对文件内容的压缩因此无论是外部内存还是内存 Cramfs都比JFFS2和YAFFS2
占用更少的资源。
JFFS2将文件系统的数据和原数据以节点的形式储存在
Flash上其冗余数据只是节点头部的CRC校验码并且在储
存时对节点的数据进行了压缩。与之 相比YAFFS2不仅储存
了页数据的ECC校验码并且没有Flash设备OOB区储存数
据而是用来储存页节点信息。其映像也是由若干个页面组成
没 有对数据进行压缩因此YAFFS2文件系统映像大大超过了
JFFS2文件系统映像。实验表明普通YAFFS2映像的大小约
为同样JFFS2映像大小的 2倍。当文件系统在内存中运行时
JFFS2在内存中定义了若干链表YAFFS2在内存中为每个文
件创建一个文件树。尽管为每个文件建立一个文件 树需要消耗
掉不少的内存但是比起维护JFFS2所需的链表消耗的内存
还是少一些。在实际运行中YAFFS2占用的内存要小于JFFS2
文件系 统。
使用范围 要使用Cramfs或JFFS2文件系统离不开MTD驱动程
序层的支持。MTDMemory Technology Device是Linux中
的一个储存设备通用界面层。虽然也可以建立在RAM上但它
是专为基于Flash的设备而设计的。MTD包含特定Flash 芯片的驱动程序 Flash芯片驱动向上层提供读、写、擦除等基本
的Flash操作方法。MTD对这些操作进行封装后向用户层提供
MTD char和MTD block类型的设备。MTD char类型的设备包
括/dev/mtd0等可以对Flash的原始字符访问MTD block类
型的设备包括/dev/mtdblock0等将Flash模拟成块设备这样
就可以在这些块设备上创建Cramfs或JFFS2等格式的文 件系
统。在对用户层的界面上 Cramfs或JFFS2文件系统还需要
操作系统VFS虚拟文件系统的支持。
同样YAFFS2文件系统支持使用MTD驱动层和VFS层
这也是一般在嵌入式Linux或者μClinux操作系统中使用
YAFFS2文件系统的常用 方法。除此之外YAFFS2还带有
NAND Flash芯片驱动并为嵌入式系统提供了直接访问文件系
统的API用户可以不使用Linux中的MTD和VFS直接对文
件进行操作。图1 为嵌入式系统的文件系统结构。
YAFFS2中的YAFFS2 Direct提供了直接的文件系统界
面因此在那些没有VFS层的嵌入式系统中也可使用YAFFS2。
YAFFS2文件系统的使用范围要比Cramfs和 JFFS2文件系统
广泛但是需要注意的是YAFFS2只能用在NAND Flash储存
设备上。
结论 这3种嵌入式文件系统在嵌入式系统中的应用非常广泛
但是又具有各自的特点。表2 比较了3种文件系统的主要性能
并归纳出各自最适用的领域。
具体分析如下
1. Cramfs是最早的一种嵌入式文件系统它只储存了最少的信
息对文件内容进行了压缩运行速度比较
快。但是由于其不能写入不支持超过16 MB大小的文件因
此广泛地应用于储存空间小、文件系统内容
较少并且不需要用户写入的嵌入式系统中。
2. JFFS2是一种较早的Flash专用文件系统。目前已有很多
JFFS2应用于μClinux以及嵌入式Linux的例子。事
实上它已经成为新版Linux中的一种标准文件系统。
同时它对NOR Flash和NAND Flash提供支持针对两种Flash
设备共同的特性提供掉电保护和损耗平衡等
功能可供用户读写十分适合于同时用到这两种Flash设备的
嵌入式系统。
3. YAFFS2是专为NAND Flash设计的文件系统它充分考虑
了NAND Flash设备的特性支持ECC校验提 供掉电保护和损耗平衡功能运行和挂载速度都比JFFS2要快。
它支持操作系统广泛包括常见的嵌入
式Linux、WinCE、μClinux。由于它提供Direct界面因此稍
加修改也可使用在没有操作系统的嵌入式
系统中。目前被广泛应用于使用NAND Flash作为储存设备的
嵌入式系统中。
针对具体应用可以在考察各种文件系统特点的基础上
选择更适合自身系统的一种文件系统解决方案。比如在许多以
NAND Flash为储存介质的应用系统中都用到「Cramfs
YAFFS2」文件系统。以Cramfs作为根文件系统既提高了启
动速度也能保护根文件不 受破坏使用YAFFS2作为用户文
件系统在保证用户可以自由读写文件的基础上提高了文件系
统的安全性和运行速度不失为一种优良的嵌入式文件系统解
决方案。
由 于嵌入式系统自身存在一些特殊要求使得一些传
统的文件系统 (如FAT、EXT2等) 并不十分适合。专
用的嵌入式文件系统应有一些自身的特性如文件系统
面对的储存介质特殊性、文件系统应具有的跨平台的安
全性以及整个系统的实时性等。本 文介绍了3种源
码开放的嵌入式文件系统Cramfs、JFFS2、YAFFS2
详细分析比较了这3种文件系统的主要性能并根据分
析结果指出了各自的适 用领域
Cramfs、JFFS2、YAFFS2是3种性能优越专用于嵌入式系
统的文件系统。本文通过对这3种文件系统的设计原理和主要性
能进行分析与比较归 纳出各自的选型依据据和适用领域。
三种文件系统的介绍 Cramfs Cramfs是Linux的创始人Linus Torvalds开发的一种只读
文件系统采用了zlib压缩压缩比一般可以达到12但仍
可以做到高效的随机读取。在Linux系统中通常把不需 要经
常修改的目录压缩存放在系统引导时再将压缩文件解开。
Cramfs并不需要一次性地把文件系统的所有内容都解压到内存
中而只是在系统需要访问某 个位置的数据时马上计算出该数据在Cramfs中的位置将其解压缩到内存之中然后通过对
内存的访问来获取需要读取的数据。
JFFS2 JFFS意为「Journaling Flash File System」该文件系统
是瑞典Axis通信公司开发的一种基于Flash内存的日志文件系
统。该公司于1999年在GNU/Linux上发行了第一 版JFFS文
件系统后来经过Redhat公司的发展现在已经发行了第二个
版本的JFFS2其全部程序代码都是可供研究开发的。它在设
计时充分考虑了嵌 入式系统中Flash内存的读写特性确保在
系统掉电时正在读写的文件不受影响同时其储存策略以及
抗疲劳性等方面也在第一版的基础上进行了改进。 目前JFFS2
广泛应用于嵌入式系统中尤其是嵌入式μClinux操作系统中。
YAFFS2 YAFFS意为「Yet Another Flash File System」是目前
唯一一个专门为NAND Flash设计的文件系统。它采用了类日志
结构结合NAND Flash的特点提供了损耗平衡和掉电保护机
制可以有效地避免意外掉电对文件系统一致性和完整性的影
响。Aleph One公司于2002年5月发布了第一版YAFFS程序
代码用户可以很方便地在网站上下载到。第一版的YAFFS只
支持每页512字节的NAND Flash。 YAFFS2是YAFFS的升级版即支持每页512字节的NAND Flash内存也支持每页
2048字节的NAND Flash内存。
Flash内存 Flash设备特点
相对于传统储存介质Flash内存具有如下优点
˙ 可靠性高采用Flash为储存介质可以确保100万次以上的
可靠写入
˙ 储存速度快写入∕读取均可接近1Mb/s
˙ 使用方便具有很强的环境适应能力。
但是由于其制造制程的问题还存在以下缺点
˙ 读取和写入以页为单位擦除以块为单位
˙ 易出现随机坏块
˙ 块与块之间使用不均衡会导致寿命问题。
NOR Flash和NAND Flash
基于NOR技术的Flash内存是最早出现的Flash内存它
具有以下特点
˙ 程序和数据可存放在同一芯片上拥有独立的数据总线和地址
总线支持快速随机读取允许系统直接从Flash中读取程序代码并执行而无需先将程序代码下载至RAM中再执行
˙ 可以单字节或单字程序化但必须以块为单位进行擦除操作。
由于NOR Flash内存的擦除和程序化速度较慢而块尺寸
又比较大因此擦除和程序化操作所花费的时间很长。目前
NOR Flash内存大多只用于储存嵌入式系统的启动程序代码。
NAND Flash内存可以顺序读取储存单元的内容由于制
程上的进步其容量越来越大单位价格越来越便宜正逐步成
为Flash内存的主流。NAND Flash内存具有以下特点
˙ 以页为单位进行读写操作以块为单位进行擦除操作页大小
为512字节或2048字节每页不仅有
数据区还有几十字节的空闲区。
˙ 数据、地址采用同一总线接口串行读取。
˙ 芯片尺寸小接脚少单位成本低。
˙ 芯片内含有失效块并且在使用过程中可能会出现随机坏块。
表1 比较了这两种Flash内存的性能参数。
三种嵌入式文件系统主要性能分析与比较 数据安全、运行速度、占用资源、使用范围等是嵌入式文
件系统的主要性能指针。下面从这几个方面入手对这三种嵌入
式文件系统进行分析与比较。
数据安全 当前的嵌入式系统主要使用固态Flash芯片作为储存设备。
由于Flash设备自身的特点以及嵌入式系统工作环境的复杂多
样性如何保证数据的安全是嵌入 式文件系统首先要考虑的问
题。数据安全主要包括数据冗余和掉电保护等部分。
资料冗余
提高数据安全性的最有效措施是增加数据的冗余而数据的大量冗余又给维护资料一致性
带来困难。对此应进行合理取舍在尽量降低冗余的前提下确保数据的安全性和可靠性。
Cramfs文件系统是一种只读文件系统文件系统内容不可
更改设计思想遵循「只储存最少的信息」甚至没有时间戳之类的信息除了数据包的CRC校验 信息外几乎没有别的数据
冗余。
JFFS2文件系统是典型的日志结构的文件系统它储存的
数据是日志式数据信息。JFFS2在Flash上只有两种类型的数据
实 体j.ffs2_raw_inode和jffs2_raw dirent。前者包含文件的管
理信息后者用于描述文件在文件系统中的位置。真正的数据信
息就保持在jffs2_raw_inode节点的后面大部分 管理的信息都
是在系统挂载之后建立起来的。两种数据实体有着公共的文件头
结构jffs2 _ unknown_node。在这个结构里有个jint32 _t类型
的hdr_crc变量它代表文件头部中其它域的CRC校验值。这
说明JFFS2文件系统使用的是CRC循环冗余校验码。
YAFFS2文件系统是一种类日志文件系统专用于NAND
型Flash设备。其储存数据的基本单位是chunk相当于Flash
的页。Chunk中的 数据包括两部分一部分是数据区占用Flash
的一页另一部分是文件信息及冗余数据区占用Flash页的
OOB区。其冗余数据主要是ECC校验资 料对于小页每页
512字节的Flash每页有6字节的ECC数据对于大页每
页2048字节的Flash每页有24字节的ECC资 料。
掉电保护 掉电保护的目的是在系统意外失去供电的情况下保证
系统运行状态的确定性以及记录数据的完整性当系统供电恢复
后现场数据可以及时恢复避免系统产生 混乱。很多文件系
统出于运行速度考虑在程序运行过程中常将数据暂存在
SDRAM中一旦系统意外掉电往往会造成数据丢失。
Cramfs文件系统将文件系统内容解压到内存中由于其不
能写入文件系统的内容无法更改因此不存在掉电保护的问题。
JFFS2是一种日志结构文件系统因此不论电源以何种方
式在哪个时刻停止供电JFFS2都能保持数据完整性。当系统
遭受不正常断电后重新启动 时JFFS2自动将系统恢复到断电
前最后一个稳定状态。需要注意的是文件系统在最后一个稳定
状态之后发生的任何改变都无法进行恢复。
YAFFS2是一种类日志文件系统可以在意外掉电重启后
自动提供可靠的数据记录防止文件系统的崩溃。它使用独立的
日志文件跟踪文件系统内容的变化。举 例来说当应用程序需
要写Flash的某一页时它首先修改的是存放于文件日志中的一
块镜像只有当日志中的镜像复制到文件系统中后数据才真实
地写到该 页上。当发生意外掉电重启后YAFFS2没有像JFFS2
那样使用旧文件完全代替新写文件而是选择用新文件完全代替旧的文件或者已写部分使用新文 件未写部分使用旧文件。
这种方式增强了掉电时未完全写入文件的安全性能特别是当意
外掉电发生在数据区时意外掉电时的文件几乎被完好地保存下
来。
运行速度 运行速度可以从以下几个方面考察文件系统挂载速度
读文件速度写文件速度等。这里预设的储存介质是NAND
Flash。
一般而言压缩的、只读的文件系统在启动时需要将文件
系统解压到SDRAM中这在一定程度上会减缓文件系统挂载速
度。但是Cramfs文件系统在设计 时充分考虑了系统挂载的时
间并没有一次性地把文件系统的所有内容都解压到内存中而
只是在系统需要访问某个位置的数据时迅速计算出该数据在
Cramfs中的位置将其解压缩到内存之中再进行访问操作。
由于其读文件速度只是找出文件地址以及访问内存的操作所以
无论是挂载速度还是读文 件速度 Cramfs文件系统都比
JFFS2和YAFFS2文件系统要快。
JFFS2文件系统的挂载可以分为以下几个步骤进行
1. 检查每个节点CRC校验码的合法性在内存中为每个节点每个节点分配必需的相关的结构
2. 扫瞄每个i节点的物理节点链表建立链接
3. 释放扫瞄过程中使用的临时信息。
可以看出这个过程还是很复杂的更重要的是在JFFS2
文件系统被挂载时需要对整个Flash储存区域进行扫瞄这就
耗费了大量的时间因此 JFFS2文件系统的开机速度非常缓慢。
与JFFS2相比YAFFS2减少了一些功能挂载时只需扫瞄Flash
内存的空闲区根据从OOB备份资 料区中读取的yaffs_tags
信息判读是文件头页面还是资料页面再根据相应信息在内存中
为每个文件建立一个对应的yaffs_object对 象。由于YAFFS2
在系统加载时只需扫瞄各个页面的OOB区即可建立起整个文
件系统的结构而不需要像JFFS2那样扫瞄整个Flash设备
因此大 大加快了文件系统的启动速度。但是YAFFS2仍然要
求对整个Flash设备所有页的空闲进行扫瞄这就导致当Flash
设备储存空间变大时系统扫瞄 时间会直线上升。
在文件系统运行时JFFS2需要维护几个链表来管理擦写
块。根据擦写块上的内容一个擦写块可能会在不同的链表上。
具体来说当一个擦写块上都是合法 valid的节点时它会
在clean_list上当一个擦写块包含至少一个过时obsolete
的节点时它会在dirty_list上当 一个擦写块被擦写完毕并被写入Cleanmarker节点后它会在free_list上。正是以这些
链表为基础 JFFS2文件系统才可以实现垃圾回收、损耗平衡
等性能。文件系统挂载时YAFFS2在内存中建立一个层次结构
的索引可以看作是一个文件树。树的最底 层指向实际存放文
件的页面高层则是一层层的索引目录。文件树是通过一个联合
结构的节点来实现的。联合结构是固定大小32字节当它
处于最底层时 由16个2字节入口来查找页面ID当处于其
它层时由8个4字节指针指向其它更低层的节点。每个文件对
应一个文件树便于检索。在以NAND Flash为储存介质的嵌入
式系统中YAFFS2的文件读写性能都优于JFFS2。
占用资源 在嵌入式系统中内存和外部内存资源匮乏需要节约使
用。因此占用的内存和外部内存资源量也是衡量嵌入式文件系统
的一个重要指针。
如果使用RAMDISK方式运行文件系统那么在系统运行
之后首先要把Flash上的映像文件解压到内存中才可以开始
运行程序。这样同样的程序代码 不仅在外部内存中占据了空
间而且由于解压缩还在内存中占用了更大的空间。Cramfs
虽然是一个压缩式的文件系统但前面已介绍过它并不需要一
次性地将所有内容解压到内存之中。由于其对文件内容的压缩因此无论是外部内存还是内存 Cramfs都比JFFS2和YAFFS2
占用更少的资源。
JFFS2将文件系统的数据和原数据以节点的形式储存在
Flash上其冗余数据只是节点头部的CRC校验码并且在储
存时对节点的数据进行了压缩。与之 相比YAFFS2不仅储存
了页数据的ECC校验码并且没有Flash设备OOB区储存数
据而是用来储存页节点信息。其映像也是由若干个页面组成
没 有对数据进行压缩因此YAFFS2文件系统映像大大超过了
JFFS2文件系统映像。实验表明普通YAFFS2映像的大小约
为同样JFFS2映像大小的 2倍。当文件系统在内存中运行时
JFFS2在内存中定义了若干链表YAFFS2在内存中为每个文
件创建一个文件树。尽管为每个文件建立一个文件 树需要消耗
掉不少的内存但是比起维护JFFS2所需的链表消耗的内存
还是少一些。在实际运行中YAFFS2占用的内存要小于JFFS2
文件系 统。
使用范围 要使用Cramfs或JFFS2文件系统离不开MTD驱动程
序层的支持。MTDMemory Technology Device是Linux中
的一个储存设备通用界面层。虽然也可以建立在RAM上但它
是专为基于Flash的设备而设计的。MTD包含特定Flash 芯片的驱动程序 Flash芯片驱动向上层提供读、写、擦除等基本
的Flash操作方法。MTD对这些操作进行封装后向用户层提供
MTD char和MTD block类型的设备。MTD char类型的设备包
括/dev/mtd0等可以对Flash的原始字符访问MTD block类
型的设备包括/dev/mtdblock0等将Flash模拟成块设备这样
就可以在这些块设备上创建Cramfs或JFFS2等格式的文 件系
统。在对用户层的界面上 Cramfs或JFFS2文件系统还需要
操作系统VFS虚拟文件系统的支持。
同样YAFFS2文件系统支持使用MTD驱动层和VFS层
这也是一般在嵌入式Linux或者μClinux操作系统中使用
YAFFS2文件系统的常用 方法。除此之外YAFFS2还带有
NAND Flash芯片驱动并为嵌入式系统提供了直接访问文件系
统的API用户可以不使用Linux中的MTD和VFS直接对文
件进行操作。图1 为嵌入式系统的文件系统结构。
YAFFS2中的YAFFS2 Direct提供了直接的文件系统界
面因此在那些没有VFS层的嵌入式系统中也可使用YAFFS2。
YAFFS2文件系统的使用范围要比Cramfs和 JFFS2文件系统
广泛但是需要注意的是YAFFS2只能用在NAND Flash储存
设备上。
结论 这3种嵌入式文件系统在嵌入式系统中的应用非常广泛
但是又具有各自的特点。表2 比较了3种文件系统的主要性能
并归纳出各自最适用的领域。
具体分析如下
1. Cramfs是最早的一种嵌入式文件系统它只储存了最少的信
息对文件内容进行了压缩运行速度比较
快。但是由于其不能写入不支持超过16 MB大小的文件因
此广泛地应用于储存空间小、文件系统内容
较少并且不需要用户写入的嵌入式系统中。
2. JFFS2是一种较早的Flash专用文件系统。目前已有很多
JFFS2应用于μClinux以及嵌入式Linux的例子。事
实上它已经成为新版Linux中的一种标准文件系统。
同时它对NOR Flash和NAND Flash提供支持针对两种Flash
设备共同的特性提供掉电保护和损耗平衡等
功能可供用户读写十分适合于同时用到这两种Flash设备的
嵌入式系统。
3. YAFFS2是专为NAND Flash设计的文件系统它充分考虑
了NAND Flash设备的特性支持ECC校验提 供掉电保护和损耗平衡功能运行和挂载速度都比JFFS2要快。
它支持操作系统广泛包括常见的嵌入
式Linux、WinCE、μClinux。由于它提供Direct界面因此稍
加修改也可使用在没有操作系统的嵌入式
系统中。目前被广泛应用于使用NAND Flash作为储存设备的
嵌入式系统中。
针对具体应用可以在考察各种文件系统特点的基础上
选择更适合自身系统的一种文件系统解决方案。比如在许多以
NAND Flash为储存介质的应用系统中都用到「Cramfs
YAFFS2」文件系统。以Cramfs作为根文件系统既提高了启
动速度也能保护根文件不 受破坏使用YAFFS2作为用户文
件系统在保证用户可以自由读写文件的基础上提高了文件系
统的安全性和运行速度不失为一种优良的嵌入式文件系统解
决方案。
版权声明:本文为博主原创文章,未经博主允许不得转载。