• 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压缩�压缩比一般可以达到1�2�但仍
    可以做到高效的随机读取。在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驱动程
    序层的支持。MTD�Memory 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压缩�压缩比一般可以达到1�2�但仍
    可以做到高效的随机读取。在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驱动程
    序层的支持。MTD�Memory 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压缩�压缩比一般可以达到1�2�但仍

    可以做到高效的随机读取。在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驱动程

    序层的支持。MTD�Memory 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作为用户文

    件系统�在保证用户可以自由读写文件的基础上�提高了文件系

    统的安全性和运行速度�不失为一种优良的嵌入式文件系统解

    决方案。 

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    前端开发中一些好用的软件包。
    LeetCode 26 删除排序数组中的重复项
    算法 主定理
    算法学习计划继续三四个月
    Web Api
    DOM viewport
    CSS OM
    DOM Range Api
    DOM 操作 2
    DOM Event
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706835.html
Copyright © 2020-2023  润新知