Chinaunix首页 | 论坛 | 博客
  • 博客访问: 852069
  • 博文数量: 90
  • 博客积分: 766
  • 博客等级: 军士长
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-18 08:42
个人简介

linux

文章分类

全部博文(90)

文章存档

2021年(2)

2020年(2)

2017年(1)

2015年(11)

2014年(1)

2013年(53)

2012年(16)

2011年(4)

分类: 系统运维

2013-01-25 16:02:36

    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) |
给主人留下些什么吧!~~