嵌入式文件系统——Cramfs、JFFS2和YAFFS2概述

文件系统概述

所谓文件系统,实际上就是在一个具体的存储设备上任何文件的组织和目录。这个设备可能是各种RAM、NAND FLASH、NOR FLASH等DOC设备,还有以NAND FLASH为基础的各种存储卡等。目前,针对不同的设备和应用有很多文件系统可供选择,例如EXT2、TEMPFS、RAMDISK、CRAMFS、JFFS1/2、YAFFS1/2、XFS等。除此之外,还有很多供应商提供的商用文件系统。
随着32位CPU价格不断下跌,片上存储设备的容量相比越来越大,越来越多的嵌入式系统开始应用各种嵌入式操作系统。一般在嵌入式领域,只要应用到操作系统的必然会需要一个,甚至是多个文件系统。

由于嵌入式系统自身存在一些特殊要求,使得一些传统的文件系统 (如FAT、EXT2 等) 并不十分适合。专用的嵌入式文件系统应有一些自身的特性,如文件系统面对的储存介质特殊性、文件系统应具有的跨平台的安全性,以及整个系统的实时性等。Cramfs、 JFFS2、YAFFS2是3种性能优越,专用于嵌入式系统的文件系统。

CRAMFS文件系统

CRAMFS意为「compressed ROM file system,压缩只读闪存盘档案系统」,是一种开放式的 Linux 档案系统,是Linux的创始人Linus Torvalds开发的一种只读文件系统,采用了zlib压缩, 压缩比一般可以达到1:2,但仍可以做到高效的随机读取。

CRAMFS文件系统是专门针对闪存设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩,文件系统类型可以是EXT2或EXT3。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先得把flash上的映像文件全部解压到ram中,构造ramdisk环境,才可以运行程序,但有一个致命的弱点,在正常情下,同样的代码不仅在flash占用了空间,而且还在ram中占用极大的空间,这违背了嵌入式中节省资源的原则。cramfs文件系统并不需要一次性地将文件系统中的所有内容解压到ram中,而只是当系统需要访问某个位置的数据时,马上计算出该数据在cramfs中的位置,将其解压到ram中,然后通过内存访问来获取数据,cramfs中的解压缩之后的内存中的数据存放位置都是由cramfs文件系统本身来管理,用户并不需要实现过程,因此增加了透明度,给开发人员节约了时间。

在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先要把外存(Flash)上的映像文件解压缩到内存中,构造起RAMDISK环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在外存中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。

使用 cramfs就是一种解决这个问题的方式。cramfs是一个压缩式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在cramfs中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。cramfs中的解压缩以及解压缩之后的内存中数据存放位置都是由cramfs文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。

cramfs拥有以下一些特性:

  • 采用实时解压缩方式,但解压缩的时侯有延迟。
  • cramfs的数据都是经过处理、打包的,对其进先写操作有一定困难。所以cramfs不支持写操作,这个特性刚好适合嵌入式应用中使用Flash存储文件系统的场合。
  • 在cramfs中,文件最大不能超过16MB。
  • 支持组标识(gid),但是mkcramfs只将gid的低8位保存下来,因此只有这8位是有效的。
  • 支持硬链接。但是cramfs并没有完全处理好,硬链接的文件属性中,链接数仍然为1.
  • cramfs的目录中,没有“.”和“..”这两项。因此,cramfs中的目录的链接数通常也仅有一个。
  • cramfs中,不会保存文件的时间戳(timestamps)信息。当然,正在使用的文件由于inode保存在内存中,因此其时间可以暂时地变更为最新时间,但是不会保存到cramfs文件系统中去。
  • 当前版本的cramfs只支持PAGE_CACHE_SIZE为4096的内核。

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内存。

三种文件系统特点

Cramfs

Cramfs文件系统是一种只读文件系统,文件系统内容不可更改,设计思想遵循「只储存最少的信息」;甚至没有时间戳之类的信息,除了数据包的CRC校验信息外,几乎没有别的数据冗余。

JFFS2

JFFS2文件系统是典型的日志结构的文件系统,它储存的数据是日志式数据信息。JFFS2在Flash上只有两种类型的数据实体:j.ffs2_raw_inode和jffs2_raw dirent。前者包含文件的管理信息,后者用于描述文件在文件系统中的位置。真正的数据信息就保持在jffs2_raw_inode节点的后面,大部分管理的信息都是在系统挂载之后建立起来的。两种数据实体有着公共的文件头结构jffs2 _ unknown_node。在这个结构里,有个jint32 _t类型的hdr_crc变量,它代表文件头部中其它域的CRC校验值。这说明JFFS2文件系统使用的是CRC循环冗余校验码。

YAFFS2

YAFFS2文件系统是一种类日志文件系统,专用于NAND型Flash设备。其储存数据 的基本单位是chunk,相当于Flash的页。Chunk中的数据包括两部分:一部分是数据区,占用Flash的一页;另一部分是文件信息及冗余数据区,占用Flash页的OOB区。其冗余数据主要是ECC校验资料,对于小页(每页512字节)的Flash,每页有6字节的ECC数据;对于大页(每页2048字节)的Flash,每页有24字节的ECC资料。

你可能感兴趣的:(嵌入式开发)