::: {#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会将文件的数据以一种更高效的方式组织起来 …