Cramfs、JFFS2、YAFFS2的全面对比

Cramfs、JFFS2、YAFFS2的全面对比http://blog.csdn.net/daofengdeba/article/details/7721340

  由于嵌入式系统自身存在一些特殊要求,使得一些传统的文件系统(如FAT、EXT2等) 并不十分适合。专用的嵌入式文件系统应有一些自身的特性,如文件系统面对的储存介质特殊性、文件系统应具有的跨平台的安全性,以及整个系统的即时性等。本文介绍了3种源码开放的嵌入式文件系统Cramfs、JFFS2、YAFFS2,详细分析比较了这3种文件系统的主要性能,并根据分析结果指出了各自的适用领域。

Cramfs、JFFS2、YAFFS2是3种性能优越,专用于嵌入式系统的文件系统。本文通过对这3种文件系统的设计原理和主要性能进行分析与比较,归纳出各自的选型依据据和适用领域。

三种嵌入式文件系统主要性能分析与比较

资料安全、运行速度、占用资源、使用范围等是嵌入式文件系统的主要性能指标。下面从这几个方面入手,对这三种嵌入式文件系统进行分析与比较。

资料安全

当前的嵌入式系统主要使用固态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资料。[专用于nand, 真正的资料放在flash页, 文件信息和冗余资料放在Flash页的OOB区]

掉电保护:

  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。[YAFFS2JFFS2启动速度快,读写性能也更优]

占用资源

在嵌入式系统中,记忆体和外部记忆体资源匮乏,需要节约使用。因此占用的记忆体和外部记忆体资源量也是衡量嵌入式文件系统的一个重要指标。

如果使用RAMDISK方式运行文件系统,那么在系统运行之后,首先要把Flash上??的映像文件解压到记忆体中,才可以开始运行程序。这样,同样的程式码不仅在外部记忆体中占据了空间,而且由于解压缩,还在记忆体中占用了更大的空间。Cramfs虽然是一个压缩式的文件系统,但前面已介绍过,它并不需要一次性地将所有内容解压到记忆体之中。由于其对文件内容的压缩,因此无论是外部记忆体还是记忆体, Cramfs都比JFFS2和YAFFS2占用更少的资源。

  JFFS2将文件系统的资料和原资料以节点的形式储存在Flash上??,其冗余资料只是节点头部的CRC校验码,并且在储存时对节点的资料进行了压缩。与之相比,YAFFS2不仅储存了页资料的ECC校验码,并且没有Flash设备OOB区储存资料,而是用来储存页节点信息。其映像也是由若干个页面组成,没有对资料进行压缩,因此YAFFS2文件系统映像大大超过了JFFS2文件系统映像。实验表明,普通YAFFS2映像的大小约为同样JFFS2映像大小的2倍。当文件系统在记忆体中运行时,JFFS2在记忆体中定义了若干链表,YAFFS2在记忆体中为每个文件创建一个文件树。尽管为每个文件建立一个文件树需要消耗掉不少的记忆体,但是比起维护JFFS2所需的链表消耗的记忆体,还是少一些。在实际运行中,YAFFS2占用的记忆体要小于JFFS2文件系统。[jffs2在储存时对节点的资料进行了压缩,系统映像会大于yaffs2的,但是运行时JFFS2维护的链表比yaffs的树更占内存]

使用范围

  要使用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,直接对文件进行操作。[cramfs和jffs要利用mtd和vfs的支持, 而yaffs2可用可不用, 但在linux中通常都要用]

  图1 为嵌入式系统的文件系统结构。

AFFS2中的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作为用户文件系统,在保证用户可以自由读写文件的基础上,提高了文件系统的安全性和运行速度,不失为一种优良的嵌入式文件系统解决方案。

时间: 2024-10-03 03:35:20

Cramfs、JFFS2、YAFFS2的全面对比的相关文章

嵌入式: jffs2,yaffs2,logfs,ubifs文件系统性能分析

在嵌入式领域,FLASH是一种常用的存储介质,由于其特殊的硬件结构,所以普通的文件系统如ext2,ext3等都不适合在其上使用,于是就出现了专门针对FLASH的文件系统,比较常用的有jffs2,yaffs2,logfs,ubifs.那么对于这几个文件系统,如何选择一个针对自己的硬件最合适的呢?他们各自的特点是什么?性能优劣如何? 下面一个PDF为我找到的一篇专门针对这几个文件系统做的性能分析的文档,就这些文件系统的挂载时间,I/O性能,内存使用,掉电恢复,FLASH寿命等方面进行了详细的对比分析

嵌入式学习课程表

序号       课程  内容   课 时       完成日期         学习笔记           总结与收获               1 前言 课程目标介绍 ; 1 2017/09/11 搭建环境 沉下心一步步学 2 嵌入式Linux 入门 1.Linux基础知识入门 2.Bootloader .交叉编译环境等的基本概念 3.嵌入式系统概述 4.嵌入式处理器介绍 5.嵌入式操作系统介绍 6.嵌入式Linux开发流程介绍 7.CentOS 以及ubuntu安装及使用 8.Linu

系统移植总结

menu 简述嵌入式linux系统移植的主要内容有哪些? 1> 搭建交叉开发环境 2> 移植bootloader 3> 移植linux内核 4> 制作根文件系统 一.搭建交叉开发环境 1.交叉编译工具链的制作(GCC交叉编译器的生成) (1)       下载Binutils.GCC.Glibc源码 (2)       配置并编译Binutils取得所需的汇编和链接程序(连接程序ld,汇编程序as,主要为GNU系统提供汇编和连接工具) (3)       配置并编译GCC源码生成G

linux系统构建学习笔记

嵌入式系统构架:(硬件+软件)应用软件层: Application GNU C Library(glibc)文件系统: 系统层: API(Systern Call Interface) OS Core + Power Mannager+ File Manager + GUI Mannager TCP/IP HTTP WAP DataBase Browser DDI(Device Drver Interface) 板级支持:BSP:Board Support Package       OEM A

阅读根文件系统论文笔记

uClinux下JFFS2文件系统的实现.pdf 2004 JFFS文件系统是瑞典Axis通信公司开发的一种基于Flash的日志文件系统,JFFS2是它的第2版,由Redhat公司开发.JFFS2以其优异的性能在嵌入式系统中被越来越广泛地使用. 嵌入式Linux文件系统研究与应用.pdf 2010 在嵌入式系统中,文件系统的类型和文件的存储介质密切相关.通常,嵌入式系统外围存储器使用FLASH存储器,针对FLASH存储器的文件系统类型有 CRAMFS. ROMFS. JFFS/ JFFS2和 Y

Linux 根文件系统的制作

一.建立根文件系统目录与文件 1. 创建目录 #mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin sys usr mnt tmp var #mkdir usr/bin usr/lib usr/sbin lib/modules 2. 创建设备文件 #cd rootfs/dev #mknod -m 666 console c 5 1 #mknod -m 666 null c 1 3 3. 加入配置文件 #tar etc.tar.gz #

宿主机挂载和使用嵌入式文件系统

一般的文件系统都是可以在宿主机上先挂载看看文件系统是否有错误,但是一些特殊的文件系统如:为flash而生的jffs2,yaffs2文件系统没法进行挂载,只能进行烧录测试. 使用loseup命令用来设置循环设备.循环设备可把文件虚拟成块设备,籍此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用. 使用格式: losetup [ -e encryption ] [ -o offset ] loop_device file losetup [ -d ] loop

linux 内核配置参考

对于每一个配置选项,用户可以回答"y"."m"或"n".其中"y"表示将相应特性的支持或设备驱动程序编译进内核:"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去:"n"表示内核不提供相应特性或驱动程序的支持.只有<>才能选择M 1. General setup(通用选项) [*]Prompt for development 

NFS文件系统制作

内核:              linux-3.0 u-boot:          2010.08 开发板:         fl2440(s3c2440主芯片) 交叉编译器:   2011.11 我们在上面移植了initramfs文件系统,并且已经成功运行了.下面我们开始移植nfs,之前开启PC上的nfs服务功能 确认并安装NFS服务依赖软件包 一般NFS服务器要提供服务,必须启动inet,nfs, mount,portmap或rpcbind这些守护进程并保持在后台状态运行. 这里需要提示