也谈谈JFFS2

作者:Hily 原始链接:http://hily.me/blog/2006/10/jffs2/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处作者信息版权声明

上周大致看了些关于Flash上日志型文件系统的资料,了解到传统的基于闪存转换层(FLT)的文件系统存在的主要问题:
1. 效率低。因为每次都要把要修改的数据所在擦写块放入内存,产生了许多不必要的读操作;写入时,要将原来的擦写块擦除,然后再将内存中修改的数据写入该擦写块。这样就造成了数据带宽的严重浪费。
2. 降低了Flash的寿命。因为有大量无用的擦写动作,使得许多不需要擦除的块被擦除重写,这导致了整个Flash使用寿命的降低。
3. 没有提供磨损平衡,也会降低Flash的寿命。因为只要一个擦写块坏了,整块Flash也就不能用了,而那些频繁修改的块将会比其它块更快地成为坏块。
4. 不安全。如果在擦写过程中突然掉电,那么整个擦写块的数据将可能丢失。

日志型文件系统(LogFS)就是为解决以上问题而产生的,它将对文件的修改描述成日志,从而减少对Flash的擦写。只有当擦写请求超过一个擦写块的边界时,文件系统才会对Flash进行擦写。这种更新方式也叫out-of-place。
JFFS2就是Flash上应用最广的一个日志结构的文件系统。它提供的垃圾回收机制,使得我们不需要马上对擦写越界的块进行擦写,而只需要将其设置一个标志,标明为脏块。当可用的块数不足时,垃圾回收机制才开始回收这些节点。同时,由于JFFS2基于日志结构,在意外掉电后仍然可以保持数据的完整性,而不会丢失数据。

然而,JFFS2仍然有其缺点,这也是人们提出JFFS3的原因。
因为挂载时需要扫描整块Flash,来确定节点的合法性以及建立必要的数据结构,这使得JFFS2挂载时间比较长。
又由于JFFS2是将节点信息保存在内在中的,使得它所占用的内存量和节点数目成正比。
另外,由于JFFS2是通过随机方式来实现磨损平衡的,它不能保证磨损平衡的确定性。

JFFS3就是为解决JFFS2的这些缺陷而设计的,目前仍处于设计阶段。
但是,我们可以通过修改JFFS2来克服一些问题。比如通过打上EBS(erase block summary,磨损块小结)来提高JFFS2文件系统的挂载速度,并改进磨损平衡。
在官方CVS上fs/jffs3目录下的代码并不是真正的JFFS3,它就是在JFFS2基础上打上Fernc Havasi写的EBS补丁实现的。

上周五为了找这个EBS补丁花了好长时间,在补丁的官方网站上也没有找到可用的链接:
http://www.inf.u-szeged.hu/jffs2/mount.php
只是提示在新版本的JFFS2中已经包含该补丁:“Erase Block Summary is the part of JFFS2 from 2005-09-07”。
郁闷的是redhat那边那个JFFS2的CVS似乎连不上 :(
只好继续寻找……可惜找到之后发现它并不适合我的uClinux版本(linux-2.4.20),它是为某个版本的linux-2.6.x写的,而新版本的2.6内核中已经带有EBS补丁。
没有办法,只好舍弃……
把EBS补丁的下载地址贴出来,也许有人需要:
http://www.inf.u-szeged.hu/jffs2/jffs2-summary-20050823.patch
链接失效的话,可以点这边下载:
jffs2-summary-20050823.patch

如果想要深入研究JFFS2文件系统,可以看看linuxforum上shrek2写的《JFFS2文件系统源代码情景分析》(点击下载)

延伸阅读:

-- EOF --

发表一下您的高见

If you have any question, or for the language problem, please fell free to leave a comment or just contact me with email: hilyjiang [At] Gmail.