JFFS2 文件系统及新特性介绍
基本的思想就是用空间来换时间。具体来说,就是将每个擦写块每个节点的原数据信息写在这个擦写块的最后,当 JFFS2 挂载的时候,对每个擦写块只需要读一次来读取这个小结节点,因此大大减少了挂载时间。使用了磨损块小结补丁程序,一个擦写块的结构就像下面这样: 图六 根据我们的测试,使用磨损块小结补丁程序,挂载一个 12M 的闪存需要 2~3 秒,挂载一个 16M 的闪存需要 3~4 秒。 4.2 改进的磨损平衡补丁程序 这个补丁程序的基本思想是,记录每个擦写块的擦写次数,当闪存上各个擦写块的擦写次数的差距超过某个预定的阀值,开始进行磨损平衡的调整。调整的策略是,在垃圾回收时将擦写次数小的擦写块上的数据迁移到擦写次数大的擦写块上。这样一来我们提高了磨损平衡的确定性,我们可以知道什么时候开始磨损平衡的调整,也可以知道选取哪些擦写块进行磨损平衡的调整。 4.3 擦写块头部补丁程序 在写改进的磨损平衡补丁程序的过程之中,我们需要记录每个擦写块的擦写次数,这个信息需要记录在各自的擦写块上。可是我们发现 JFFS2 中缺少一种灵活的对每个擦写块的信息进行扩展的机制。于是我们为每个擦写块引入了擦写块头部(header),这个头部负责纪录每个擦写块的信息(比如说擦写次数),并且它提供了灵活的扩展机制,将来如果有新的信息需要记录,可以很容易的加入到头部之中。 5. JFFS3 简介 虽然不断有新的补丁程序来提高 JFFS2 的性能,但是不可扩展性是它最大的问题,但是这是它自身设计的先天缺陷,是没有办法靠后天来弥补的。因此我们需要一个全新的文件系统,而 JFFS3 就是这样的一个文件系统,JFFS3 的设计目标是支持大容量闪存(>1TB)的文件系统。JFFS3 与 JFFS2 在设计上根本的区别在于,JFFS3 将索引信息存放在闪存上,而 JFFS2将索引信息保存在内存中。比如说,由给定的文件内的偏移定位到存储介质上的物理偏移地址所需的信息,查找某个目录下所有的目录项所需的信息都是索引信息的一种。 JFFS3 现在还处于设计阶段,文件系统的基本结构借鉴了 Reiser4 的设计思想,整个文件系统就是一个 B+ 树。JFFS3 的发起者正工作于垃圾回收机制的设计,这是 JFFS3 中最复杂,也是最富有挑战性的部分。JFFS3 的设计文档可以在http://www.linux-mtd.infradead.org/doc/jffs3.html 得到,有兴趣的读者可以积极参与到 JFFS3 的设计中,发表自己的见解,参与讨论。 致谢 在这里要特别感谢David Woodhouse, Artem B. Bityutskiy,Joern 和 Thomas Gleixner,在参与到JFFS2的开发过程中,这几位主要的项目维护者(maintainer)不断地给我帮助,耐心的回答我的问题,在与他们的讨论过程中碰撞出很多智慧的火花和富有启发性的思想,尤其是他们对我的补丁程序提出的"尖刻"的问题,让我不断的努力思考(thinking hard),不断的完善它们。我想这种开放,无私,客观的精神正是开源社区的精髓所在,吸引着越来越多的开发者参与进来,并使开源社区不断的壮大。
- Flash文件系统剖析(05-07)
- YAFFS2在嵌入式系统中的实现(07-19)
- 在nand flash上实现JFFS2根文件文件系统(08-27)
- VxWorks中怎么从Flash BOOT(11-15)
- DSP和Flash接口技术的实现(08-15)
- 基于JTAG的DSP外部FLASH在线编程与引导技术(01-22)