【2018-09-24】嵌入式常用文件系统笔记
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-09-24 标题嵌入式常用文件系统笔记分类编程 标签linux·IOTLinux文件系统简单笔记参考链接《 https://blog.csdn.net/daofengdeba/article/details/7721340 》《 http://blog.chinaunix.net/uid-23381466-id-3411483.html 》Cramfs、JFFS2、YAFFS2是3种性能优越专用于嵌入式系统的文件系统。本文通过对这3种文件系统的设计原理和主要性能进行分析与比较归纳出各自的选型依据据和适用领域。三种文件系统的介绍CramfsCramfs是Linux的创始人Linus Torvalds开发的一种只读文件系统采用了zlib压缩压缩比一般可以达到12但仍可以做到高效的随机读取。在Linux系统中通常把不需要经常修改的目录压缩存放在系统引导时再将压缩文件解开。Cramfs并不需要一次性地把文件系统的所有内容都解压到记忆体中而只是在系统需要访问某个位置的资料时马上计算出该资料在Cramfs中的位置将其解压缩到记忆体之中然后通过对记忆体的访问来获取需要读取的资料。Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。在cramfs文件系统中每一页(4KB)被单独压缩可以随机页访问其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间使系统可通过更低容量的FLASH存储相同的文件从而降低系统成本。Cramfs文件系统以压缩方式存储在运行时解压缩所以不支持应用程序以XIP方式运行所有的应用程序要求被拷到RAM里去运行但这并 不代表比Ramfs需求的RAM空间要大一点因为Cramfs是采用分页压缩的方式存放档案在读取档案时不会一下子就耗用过多的内存空间只针对目 前实际读取的部分分配内存尚没有读取的部分不分配内存空间当我们读取的档案不在内存时Cramfs文件系统自动计算压缩后的资料所存的位置再即时 解压缩到RAM中。另外它的速度快效率高其只读的特点有利于保护文件系统免受破坏提高了系统的可靠性。JFFS2JFFS意为「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闪存会耗费大量时间。YAFFS2YAFFS意为「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种文件系统性能分析与对比具体分析如下Cramfs是最早的一种嵌入式文件系统它只储存了最少的信息对文件内容进行了压缩运行速度比较快。但是由于其不能写入不支援超过16 MB大小的文件因此广泛地应用于储存空间小、文件系统内容较少并且不需要用户写入的嵌入式系统中。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作为储存设备的嵌入式系统中。