关于jffs文件系统


关于jffs文件系统
 
  jffs(the journalling flash file system),之所以称为日志文件系统,是因为当系统发生改变时,它会先将改变写到日志当中去,然后再来查看这个日志,相应的改变是否完全,写日志这个动作是原子的,不像修改文件系统一样是多步的,相对来说安全很多。
    有一种情况,使得文件系统非常的不安全,那就是断电,比如在创建一个新的文件,首先会创建一个文件图标,然后再分配空间,假如这两步当中断点了,则创建了图标却没有分配空间。系统就会出现紊乱,如果使用日志功能,先将创建一个文件这个内容写入到日志(原子的)当中,然后再来处理这个动作。就会安全很多。
  www.2cto.com  
一.flash translation layer
    由于jffs文件系统是运行在块设备之上的,而flash却是以按块为擦除单元的,这中间需要一层转换,即将以块为操作单元转换为以扇区为操作单元(512bytes),这层转换将整个一块flash全部映射到内存当中去,而上层操作的时候则按扇区的大小的操作内存,当一块的数据全部操作完成之后,将整个数据擦除重写到具体的物理块上去,mtdblock提供这层转换,但是没有在重写的安全机制和垃圾回收机制,但如果文件系统是只读的话,这中方式就比较好了。
  www.2cto.com  
二.ftl/nftl
    mtdblock没有解决均衡问题,有一种方式可以解决这个问题,那就是将扇区和擦除的块的对应关系记录下来,这样就算改变了对应关系,即将数据写到另外的擦除当中去的时候,内存扇区就知道读写哪一块flash了,ftl和nftl解决了这个问题,但是ftl和nftl有专利问题,只能是特定的FLASH产商才能用,不能通用。
 
三.垃圾回收机制
    由于log当中存在jffs_raw_inode节点,而这些节点对应的是flash当中的inode,一旦inode被分配快要接近flash末尾的时候,Garbage collection机制将要被triggered.它将重新从第一个node开始检测,知道检测到脏页,然后擦除,重新分配空间然后添加到当前node链表的末尾。
  www.2cto.com  
    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标志为脏。
 

相关内容

    暂无相关文章