jffs(the journalling flash file system),之所以称为日志文件系统,是因为当系统发生改变时,它会先将改变写到日志当中去,然后再来查看这个日志,相应的改变是否完全,写日志这个动作是原子的,不像修改文件系统一样是多步的,相对来说安全很多。
有一种情况,使得文件系统非常的不安全,那就是断电,比如在创建一个新的文件,首先会创建一个文件图标,然后再分配空间,假如这两步当中断点了,则创建了图标却没有分配空间。系统就会出现紊乱,如果使用日志功能,先将创建一个文件这个内容写入到日志(原子的)当中,然后再来处理这个动作。就会安全很多。
一.flash translation layer
由于jffs文件系统是运行在块设备之上的,而flash却是以按块为擦除单元的,这中间需要一层转换,即将以块为操作单元转换为以扇区为操作单元(512bytes),这层转换将整个一块flash全部映射到内存当中去,而上层操作的时候则按扇区的大小的操作内存,当一块的数据全部操作完成之后,将整个数据擦除重写到具体的物理块上去,mtdblock提供这层转换,但是没有在重写的安全机制和垃圾回收机制,但如果文件系统是只读的话,这中方式就比较好了。
二.ftl/nftl
mtdblock没有解决均衡问题,有一种方式可以解决这个问题,那就是将扇区和擦除的块的对应关系记录下来,这样就算改变了对应关系,即将数据写到另外的擦除当中去的时候,内存扇区就知道读写哪一块flash了,ftl和nftl解决了这个问题,但是ftl和nftl有专利问题,只能是特定的FLASH产商才能用,不能通用。
三.垃圾回收机制
由于log当中存在jffs_raw_inode节点,而这些节点对应的是flash当中的inode,一旦inode被分配快要接近flash末尾的时候,Garbage collection机制将要被triggered.它将重新从第一个node开始检测,知道检测到脏页,然后擦除,重新分配空间然后添加到当前node链表的末尾。
jffs文件系统实现的关键就在于node节点,在挂载文件系统扫描整个设备,建立node节点,一个新的动作产生一个新的node,jffs文件系统在挂载时会比较慢,这是因为挂载jffs文件系统,需要创建一个log,这个log保存了是jffs_raw_inode节点链表,即挂载的时候会遍历系统来生成这个node链表,所以会很慢。jffs文件系统以struct jffs_raw_inode来表示数据,新增一个数据块则创建一个struct jffs_raw_inode结构体,一旦修改了某个jffs_raw_inode,则创建一个node,同时把修改后的数据写入到新node当中,然后将前一个node标志为脏。
jffs2(journalling flash file system version 2)是jffs文件系统的发展,jffs文件系统有一下缺点:
*不支持压缩
*不支持硬链接
*过度均衡
jffs文件系统的均衡是绝对均衡的,他能保证每一块的使用率都是一样的,但是有些情况并不需要重新擦除块,导致了过度均衡。jffs2文件系统可以解决上面提到的三个问题。针对耗损均衡这个问题,jffs2文件系统提供了两个node链表,不像jffs文件系统用一个链表来管理所有的节点,这两个链表分别是free_list和dirty_list,free_list保存的是空闲的节点,而dirty_list保存的是已经使用过,但是已经过时的节点。新的节点来源就是这两个地方,虽然这样做看起来能够在一定程度上解决过度均衡的问题,但是实际上我并没有在实际的使用过程当中遇到过这样的问题,所以并不能感觉到其使用的妙处.
另外有一个感觉,要解决一个问题,就需要提供一种解决方法,而这种解决办法通常要在程序当中以标志,数据结构的方式来体现。
阅读(2859) | 评论(0) | 转发(0) |