yaffs2文件系统的工作流程和checkpoint机制

原创 2013年12月05日 16:17:16

      本文主要讲解一下一个具体的文件系统,yaffs2文件系统,当然针对需要深入研究的人或者说对文件系统完全不了解的读者可以先看一下以下两篇推荐文章。

http://www.ibm.com/developerworks/cn/linux/l-vfs/    解析 Linux 中的 VFS 文件系统机制

http://www.cnblogs.com/yuyijq/archive/2013/02/24/2923855.html       Linux虚拟文件系统(VFS)

      像所有的其它文件系统一样,yaffs2文件系统也会在mount的过程中挂载到VFS上并且初始化与设备相关的结构体变量,这样上可承VFS下可接MTD设备驱动程序。
      在yaffs2文件系统的mount过程中,主要完成了yaffs_internal_read_super_mtd函数中的功能,从函数名称我们可以看出函数完成了两个方面的功能,一个是读取了super的数据,另一个是读取了mtd的数据。现在具体介绍这个函数完成的功能,函数主要任务分为以下几个步骤:

  •       填充superblock和yaffs_param。
  •       yaffs_guts_initialise(dev);//扫描分区,检查是否需要checkpoint机制
  •       yaffs_bg_start(dev);//启动后台程序,完成垃圾回收

 1 填充superblock和yaffs_param  

         总体上来讲linux下的文件系统主要分为三大块:一是上层的文件系统调用,二是虚拟文件系统VFS,三是挂载到VFS中的各个实际文件系统。linux以一组通用对象的角度看待所有的文件系统。这些对象是superblock、inode、dentry和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件和目录)在linux中称为inode。dentry用来实现名称和inode之间的映射。dentry还维护目录和文件之间的关系,从而支持在文件系统中的移动。
      1)初始化与VFS的接口 
             sb->s_magic = YAFFS_MAGIC;
             sb->s_op = &yaffs_super_ops;   
             yaffs_dev_to_lc(dev)->super = sb;
             inode->i_op = &yaffs_dir_inode_operations;
             inode->i_fop = &yaffs_dir_operations;
       在yaffs2文件系统中魔数的值定义如下:
/* Give us a  Y=0x59,
 * Give us an A=0x41,
 * Give us an FF=0xff
 * Give us an S=0x53
 * And what have we got...
 */
#define YAFFS_MAGIC 0x5941ff53

      在函数中完成了以上的赋值过程,从而yaffs2文件系统能够成功的与VFS文件系统进行对接。

     2)初始化与MTD的接口

                param->total_bytes_per_chunk = mtd->writesize;
                param->chunks_per_block = mtd->erasesize / mtd->writesize;

                n_blocks = YCALCBLOCKS(mtd->size, mtd->erasesize);
                param->start_block = 0;
                param->end_block = n_blocks - 1;

                 yaffs_mtd_drv_install(dev);
                 param->sb_dirty_fn = yaffs_set_super_dirty;
                 param->gc_control_fn = yaffs_gc_control_callback;
                 param->skip_checkpt_rd = options.skip_checkpoint_read;
                 param->skip_checkpt_wr = options.skip_checkpoint_write;

2  yaffs_guts_initialise(dev);//扫描分区,检查是否需要checkpoint机制

yaffs_init_nand,初始化nand
yaffs_init_tmp_buffers,初始化临时buffer和cache
yaffs_init_blocks,初始化擦除block信息
yaffs_init_tnodes_and_objs初始化tnodes和objs
yaffs_create_initial_dir初始化跟目录
yaffs_summary_init初始化summary
yaffs2_checkpt_restore
         如果上面checkpoint的数据正确则直接进行load操作,调用
                {
                       yaffs_check_obj_details_loaded
基础设施搭建完毕,后面就是扫描flash在内存中建立完整的文件视图,YAFFS2首先尝试从checkpoint中恢复文件系统的信息, 
◇yaffs2_checkpt_open为读出checkpoint信息做一些初始化工作,首先创建一个checkpt_ buffer,初始化checkpt_block_list数组; 
◇yaffs2_rd_checkpt_validity_marker读取checkpoint头部信息,并判断是否正确; 
◇yaffs2_rd_checkpt_dev读取struct yaffs_checkpt_dev结构的信息,用来填充yaffs_dev结构相应的字段,以及flash上各个擦除块yaffs_block_info信息,还有chunk_bits表示flash上各个chunk位图; 
◇yaffs2_rd_checkpt_objs读取各个文件的信息,如果是目录就建立目录结构,如果是文件就建立Tnodes树; 
◇yaffs2_rd_checkpt_validity_marker读出checkpoint尾部信息,并判断是否正确; 
◇yaffs2_rd_checkpt_sum读出校验和,并和计算的比较是否一致。 

                   }
         否则,或者第一次启动则
         {
                     yaffs_deinit_blocks(dev);
                     yaffs_deinit_tnodes_and_objs(dev)
                      yaffs_init_blocks(dev))
                      yaffs_init_tnodes_and_objs(dev);
                      yaffs_create_initial_dir(dev)
                       yaffs2_scan_backwards(dev)
yaffs2_scan_backwards流程: 
如果上述5个步骤都没有错误,则从checkpoint挂载成功。否则就扫描整个flash,  ◇扫描整个flash OOB信息,按照bi->seq_number顺序对block进行排序; 
◇其次从seq_number最大的block开始往seq_number减小的方向扫描; 
◇最后从physical chunk index大的chunk开始,并向减小的方向扫描; 扫描的功能主要由yaffs2_scan_chunk函数完成: 
◇读取chunk的tags信息,根据tags.chunk_used判断该chunk是空闲的还是被使用的;根据tags.chunk_id判断是data chunk,还是object header 
◇如果是data chunk,分几种情况: a)根据tags.obj_id查找散列表,找到object对象,则把tags.chunk_id转换成文件内的偏移,拿这个偏移和文件对象的shrink_size比较,如果在文件的大小范围内则调用yaffs_put _chunk_in_file把该chunk加入到对应的tnodes tree中,否则删除该chunk;这一般发生在正常关闭文件的情况下,也即先扫描到object header,后扫描到文件的data chunk,这种情况文件的实际大小应该由扫描碰到的第一个object header所记录的大小决定; b)根据tags.obj_id查找散列表,不存在则创建新的object对象,并插入到散列表中,则把tags.chunk_id转换成文件内的偏移,拿这个偏移和文件对象的shrink_size比较,如果在文件的大小范围内则调用yaffs_put_chunk_in_file把该chunk加入到对应的tnodes tree中,否则删除该chunk;这一般发生在非正常关闭文件的情况下,也即先扫描到data chunk,后扫描到文件的object header,这种情况文件大小由扫描到的第一个data chunk决定。 ◇如果是object header,分几种情况: 
a)object header被扫描到,obiect散列表中并无对应的文件,那么根据tags.obj_id、tags. extra_obj_type或者tags.obj_id、oh->type创建新的object对象,并使用object header的信息初始化object对象,并根据oh->parent_obj_id创建父亲的object对象,把两者联系起来; b)object header被扫描到,obiect散列表中已经存在对应的object对象,且对象已经有关联的object header,说明这个object header是过时的,所以就直接删除该chunk;
          }

3  yaffs_bg_start(dev);//启动后台程序,完成垃圾回收

        此处不赘述,详见http://blog.csdn.net/codectq/article/details/17057833YAFFS2文件系统的垃圾回收机制

4 全局变量yaffs_auto_checkpoint

至于在文件系统的yaffs_auto_checkpoint,需要特别说明:
If 0 only checkpoint on unmount.
If 1 checkpoint on sync.
If 2 checkpoint on write_super and sync.
Default is 1.
也就是在默认值的情况下,只有在使用sync命令或者umount命令之后,文件系统才会将checkpoint信息写回。否则在每一次的启动过程中,设备都会重新扫描整个partition信息。
yaffs_sync_fs和yaffs_write_super函数都会调用到yaffs_do_sync_fs(sb, request_checkpoint)函数,而函数的第二个参数的值就是根据yaffs_auto_checkpoint是1还是 2决定。
在VFS机制中,yaffs_sync_fs函数是在fs/super.c文件中调用的,这个文件中的系统调用只有在sync和umount的过程中才会被调用到。而yaffs_write_super函数是在/mm/backing-dev.c文件中通过创建一个内核的守护线程完成的,当超级块中有脏数据时则进行sync_super的操作,最终将checkpoint信息进行restore。

yaffs2文件系统介绍

YAFFS意义为‘yet another flash file system’,是一个开源的文件系统。是专门为NAND闪存设计的,它的出现使得价格低廉的NAND闪存芯片具有了高效性和健壮性。  YA...
  • xgbing
  • xgbing
  • 2014年03月01日 21:05
  • 9527

YAFFS2移植指南

YAFFS2移植指南 版本V2.0 翻译自YAFFS官方版文档,译者做了少许修改。 原文地址: http://www.yaffs.net/yaffs-porting-guide ...
  • harhy
  • harhy
  • 2015年10月30日 15:53
  • 3537

yaffs2文件系统移植

1、Linux2.6.37下移植yaffs文件系统 原始的linux内核是不支持Yaffs2文件系统的,我们首先需要下载yaffs2的内核补丁,给内核打上yaff2补丁才能使内核支持该文...
  • hpwzd
  • hpwzd
  • 2012年03月18日 09:53
  • 6920

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

内核添加对yaffs2文件系统的支持

CSDN GitHub 内核添加对yaffs2文件系统的支持 AderXCoding/system/tools/yaffs2 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国...
  • gatieme
  • gatieme
  • 2016年11月14日 12:38
  • 1767

yaffs2文件系统结构及应用

文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区中的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为...
  • dlijun
  • dlijun
  • 2016年06月04日 10:49
  • 3720

Yaffs 文件系统分析

1 Yaffs文件系统结构1.1 简介1.1.1 应用场合        Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目...
  • colorant
  • colorant
  • 2007年04月12日 11:42
  • 23023

YAFFS2文件系统的垃圾回收机制

yaffs2文件系统提供了一种garbage collection机制,在文件系统内部空间不足时,通过GC机制将一些系统认为的脏数据进行回收,以获得新的使用空间。 那么yaffs2文件系统对NAND ...
  • codectq
  • codectq
  • 2013年12月01日 18:38
  • 2929

yaffs2 启动挂载流程

1.概述 yaffs2是yaffs的改进,主要是为了支持2KB pagesize的Nand Flash。本文主要探究yaffs2在linux中的初始化以及挂载过程。 2.初始化过程 linux要使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:yaffs2文件系统的工作流程和checkpoint机制
举报原因:
原因补充:

(最多只允许输入30个字)