jffs2概述

Sun 28 September 2008
By lewix

::: {#msgcns!BAC70107D054E892!359 .bvMsg} 看了一阵子JFFS2的代码,粗略写了下自己的认识,记录于下。可能有些不是很准确,仅作参考吧。

jffs2是一种日志型文件系统,设计时,考虑到flash特性,尽量减少对flash的擦写。jffs2的数据块在flash上孤立存在的。这样就没有提供一种物理上的索引机制,无法通过某一个数据块找到同一文件的另外数据块,除非通过遍历整个flash。
这样的好处就是数据块可以存放在flash的任意位置,能进行方便的垃圾回收;写数据块时也不需要对原数据块进行擦写,可以在任意位置写新块,然后将原数据块标为过时。缺点是1、在mount时,必须通过遍历,在内存中建立文件的索引;2、需提供一定的机制,将文件的所有数据高效率地组织在一起;3、需提供机制使数据在flash上相对集中,以留出足够的可写空间。

jffs2中就通过相应的方式完成上述的要求。jffs2会在内存中建立物理数据的描述符和文件的描述符。jffs2在flash上有两种有效的文件数据块:用以描述文件数据的raw inode和描述文件所属目录的raw dirent。mount时,jffs2通过对整个flash分区扫描,对每一个有效数据建立一个物理描述符,并将同一文件和同一擦写块的描述符分别建立链表。jffs2会在内存中建立物理数据的描述符和文件的描述符;同时对每一个文件建立文件的描述符,把同一文件的物理描述符加入到文件的链表中,提供了初步的文件数据的组织。每个文件的描述符都将加入到一个哈希表中提供给上层的VFS,实现了文件的快速索引。

打开文件时,jffs2会将文件的数据以一种更高效的方式组织起来,并提供给上层VFS以接口。对于目录文件,所有同一目录的所有文件的dirent类型建立一个完整描述符full_dirent并组织成链表;对于含多个数据inode的正规文件,所有的inode建立完整的描述full_dnode,并将其加入到一个红黑树。jffs2也提供了数据块的version机制,用来保证在链表、红黑树中的结点的数据为最新,并把version低的数据标为过时。通过这样的机制,上层VFS就能高效地访问文件系统。

另外jffs2提供了垃圾回收机制,因为数据孤立存在,所以需要使数据块能搬动到相对集中,将搬离的块能为系统回收,提供给其他文件写。如果提供一种较好的搬运算法,精心挑选要移动的块,就能使每个擦写块能够基本擦写平衡。

由上就可以看出jffs2的主要特点,与闪存转换层的机制相比,jffs2的方式避免了它的缺点,较好的与flash的物理特性相匹配。但jffs2也有缺点:mount时需要较长的时间。这是由于mount时,jffs2需要扫描对整个flash分区进行扫描,扫描时还需要在内存中建立相应的数据结构;另外,每个raw数据都在内存中建立了描述符,占用了较大的内存,在实际应用中,JFFS2 最大能用在 128M 的闪存上。 :::