好记性不如铅笔头

编程

嵌入式常用文件系统笔记

参考链接
《 https://blog.csdn.net/daofengdeba/article/details/7721340 》
《 http://blog.chinaunix.net/uid-23381466-id-3411483.html 》

Cramfs、JFFS2、YAFFS2是3种性能优越,专用于嵌入式系统的文件系统。本文通过对这3种文件系统的设计原理和主要性能进行分析与比较,归纳出各自的选型依据据和适用领域。
 
三种文件系统的介绍
Cramfs
Cramfs是Linux的创始人Linus Torvalds开发的一种只读文件系统,采用了zlib压缩,压缩比一般可以达到1:2,但仍可以做到高效的随机读取。在Linux系统中,通常把不需要经常修改的目录压缩存放,在系统引导时再将压缩文件解开。Cramfs并不需要一次性地把文件系统的所有内容都解压到记忆体中,而只是在系统需要访问某个位置的资料时,马上计算出该资料在Cramfs中的位置,将其解压缩到记忆体之中,然后通过对记忆体的访问来获取需要读取的资料。
Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并 不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目 前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时 解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
 
JFFS2
JFFS意为「Journaling Flash File System」,该文件系统是瑞典Axis通信公司开发的一种基于Flash记忆体的日志文件系统。该公司于1999年在GNU/Linux上发行了第一版JFFS文件系统,后来经过Redhat公司的发展,现在已经发行了第二个版本的JFFS2,其全部程式码都是可供研究开发的。它在设计时充分考虑了嵌入式系统中Flash记忆体的读写特性,确保在系统掉电时,正在读写的文件不受影响;同时,其储存策略以及抗疲劳性等方面也在第一版的基础上进行了改进。目前,JFFS2广泛应用于嵌入式系统中,尤其是嵌入式μClinux作业系统中。

JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系 统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。
Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另 外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

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记忆体。

yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数 据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

Romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。

三种嵌入式文件系统主要性能分析与比较
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资料。
 
Cramfs文件系统将文件系统内容解压到记忆体中,由于其不能写入,文件系统的内容无法更改,因此不存在掉电保护的问题。
JFFS2是一种日志结构文件系统,因此不论电源以何种方式在哪个时刻停止供电,JFFS2都能保持资料完整性。当系统遭受不正常断电后重新启动时,JFFS2自动将系统恢复到断电前最后一个稳定状态。需要注意的是,文件系统在最后一个稳定状态之后发生的任何改变,都无法进行恢复。
YAFFS2是一种类日志文件系统,可以在意外掉电重启后自动提供可靠的资料记录,防止文件系统的崩溃。它使用独立的日志文件跟踪文件系统内容的变化。举例来说:当应用程式需要写Flash的某一页时,它首先修改的是存放于文件日志中的一块镜像;只有当日志中的镜像复制到文件系统中后,资料才真实地写到该页上。当发生意外掉电重启后,YAFFS2没有像JFFS2那样,使用旧文件完全代替新写文件,而是选择用新文件完全代替旧的文件,或者已写部分使用新文件,未写部分使用旧文件。这种方式增强了掉电时未完全写入文件的安全性能,特别是当意外掉电发生在资料区时,意外掉电时的文件几乎被完好地保存下来。
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作为储存设备的嵌入式系统中。

发表评论

11 + 20 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据