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

深入解析Linux下YAFFS2文件系统源码 YAFFS2,即Yet Another Flash File System Version 2,是一种专门为NAND型闪存设计的文件系统。它是YAFFS的更新版本,相较于其前代,它在性能、稳定性和对NAND闪存的兼容性上都有了显著的提升。YAFFS2支持大容量存储,解决了早期NAND型存储设备由于块大小限制和寿命问题导致的数据管理上的难题。在 YAFFS2 文件系统中,链表结构是实现文件对象管理的基础。 阅读详情

      本文主要讲解一下一个具体的文件系统,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);//启动后台程序,完成垃圾回收


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文件系统在Linux中的实践应用 NAND闪存是一种非易失性存储技术,广泛用于固态硬盘(SSD)、USB闪存驱动器和其他存储设备。其以较高的存储密度和较快的读写速度在市场中占据重要地位。NAND的“NAND门”特性意味着同一芯片上可以同时存在存储和逻辑功能,为设计紧凑型存储解决方案提供了可能性。 阅读详情

相关推荐

STM32驱动四位共阳极数码管实现高精度秒表计时器

本文详细介绍了如何使用STM32驱动四位共阳极数码管实现高精度秒表计时器。项目基于STM32F103C8T6最小系统板,通过定时器中断和GPIO控制,实现0.1秒精度的计时功能,并解析了共阳极数码管的动态扫描原理及按键消抖等关键技术。

n8m7b6v5c4的博客 951

sylixos yaffs checkpoint机制

sylixos 下当创建好了nand 设备和mtd 设备以及 yaffs 设备后,使用yaffs_mount() 函数挂载yaffs 文件系统; 初始化时调用yaffs_guts_initialise()函数: yaffs2_checkpt_restore() 为checkpoint 机制,一般是系统第二次启动会为真,从相应的块中直接得到上次文件系统信息; 如果不为真,会扫描所有 挂载...

li5830的博客 798

别再手动调时间了!用Windows自带的tzutil命令,1分钟搞定时区错误

本文介绍了如何使用Windows自带的tzutil命令快速解决时区错误问题。通过简单的命令行操作,用户可以一键切换时区、查看全球时区代码库,并实现自动化时区同步。相比传统GUI设置,tzutil更可靠且高效,特别适合企业环境批量部署。

weixin_42531494的博客 315

YAFFS2文件系统的checkpoint检查点和Summary机制

Yaffs2文件系统采用checkpoint和summary机制优化性能。checkpoint机制通过yaffs_calc_checkpt_blocks_required函数动态计算所需存储块数,预留5个块作为保底,并在数据写入时更新需求。挂载后若有修改操作会作废旧检查点。summary机制将块中所有chunk标签集中存储,通过yaffs_summary_read函数快速读取,显著提升挂载速度(测试显示挂载时间从50.25s降至1.99s)。两种机制配合既保证数据完整性又提高系统效率。

Xilizai的博客 697

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 301

UE5新手必看:3种UI定位方法实战(含蓝图配置截图)

本文为UE5新手详细解析了三种核心UI定位方法:屏幕空间、场景空间和世界空间。通过实战蓝图配置与控件操作,指导开发者如何根据HUD、角色血条、3D物体标记等不同应用场景,正确选择并配置UI的定位方式,以实现清晰的信息传递与沉浸式体验。

weixin_29018815的博客 473

yaffs文件类型_Yaffs文件系统的重要数据结构 Yaffsfs.h

1. file_system_to_installfsinst是结构体file_system_to_install类型的指针,指向需要向内核注册(install)的文件系统相关信息。/* Stuff to handle installation of file systems */struct file_system_to_install {struct file_system_type *fst...

weixin_39688451的博客 688

红外小目标检测新思路:当DETR遇上Mamba状态空间模型,速度提升3倍

本文探讨了将Mamba状态空间模型与DETR框架结合,用于解决红外小目标检测的难题。该创新方案通过线性复杂度的Mamba模块替代传统Transformer的自注意力机制,在保持高检测精度的同时,显著提升了推理速度,实现了实时性能的突破,为无人机巡检、安防监控等场景提供了高效解决方案。

hhh00的博客 665

RTOS YAFFS

它指的就是YAFFS Summary 的创建过程(通常在umount或sync时触发)。加速后续的挂载 (mount) 过程,避免耗时漫长的全 Flash 扫描。需要正常卸载umount) 文件系统,Summary 才会被正确写入。异常掉电会导致上次的 Summary 失效或不完整,挂载时会回退到慢速全扫描模式。启用 Summary 是解决 YAFFS 挂载慢问题的最有效手段(配置选项通常是或类似宏)。可能指某些特定实现中用于增强崩溃恢复的更频繁的状态保存点,但这非常规。

我的博客 1174

RenderDoc实战:5分钟搞定安卓Vulkan应用抓帧(含常见连接失败排查)

本文详细介绍了如何使用RenderDoc工具对安卓Vulkan应用进行抓帧分析,包括环境配置、完整抓帧流程及常见连接问题的解决方案。通过实战案例和高级技巧,帮助开发者快速定位渲染问题和性能瓶颈,提升移动图形开发效率。

weixin_28318011的博客 282

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解

本文探讨了如何通过多智能体架构突破AI编码的瓶颈问题。文章首先分析了当前AI编码面临的两大核心挑战:上下文窗口限制导致的连贯性丧失,以及自我评估机制缺失引发的质量判断偏差。针对这些问题,作者提出了基于生成对抗网络(GAN)灵感的解决方案,设计了三智能体系统:规划器负责需求分析,生成器执行编码任务,评估器进行质量审查。 实验表明,在前端设计任务中,通过制定可量化的评分标准(设计质量、原创性、工艺、功能性)并建立生成-评估反馈循环,能显著提升输出质量。这种架构随后被扩展到全栈开发领域,采用类似敏捷开发的&quo

oe1019的专栏 867

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

yaffs2文件系统提供了一种garbage collection机制,在文件系统内部空间不足时,通过GC机制将一些系统认为的脏数据进行回收,以获得新的使用空间。 那么yaffs2文件系统对NAND Flash的废旧数据块的回收条件是怎样的? 回收时数据是如何进行处理的? 回收条件: 分配最早 存在的无效数据chunk多于阈值 在条件类似的时候,进行随机选择 总之,会选择最脏

曹太强的专栏 5959

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

YOLOv11结合OpenCV技术,精准识别和计数鸡蛋与鸡,广泛应用于养殖场、市场监控和自动化包装。通过深度学习与计算机视觉,提升农业生产效率,让智能化管理更简单高效。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 1206

YAFFS2 的页缓存机制原理及配置优化方法详解

YAFFS2(Yet Another Flash File System 2)通过其独特的 **页缓存机制** 和 **日志结构设计** 优化了 NAND 闪存的读写性能与寿命

bifudoph的博客 678

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

YAFFS2文件系统`yaffs_format`函数解析

yaffs_format函数用于初始化YAFFS2文件系统,创建基础结构,使其可被正常挂载。该函数会擦除有效数据、写入超级块、构建根目录,并标记坏块。

bifudoph的博客 615

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Yaffs文件系统学习

底层则通过Linux提供的MTD接口实现,该层由驱动工程师开发,不同的驱动和设备对应不同的MTD控制块,MTD1、MTD2、MTD3...此函数返回了这个chunk的ECC状态(无ECC纠错/有ECC纠错/ECC无法纠正),将状态反馈给上层,Yaffs文件系统对此chunk做针对性处理。即此函数为驱动MTD的上一层。Linux驱动中有字符设备、块设备、网络设备三大设备,其中开发难度也是递增的,网络设备>块设备>字符设备。垃圾回收机制:通过淘汰低质量块(如频繁出错的老化块),降低未来ECC错误的概率。

qq_39645539的博客 381

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

yaffs2 image逆向工具

yaffs2 image逆向工具

jggyff的博客 596

72 yaffs文件系统挂载慢 sync不起作用

最近在开发过程中遇到了一个问题:Linux在启动时挂载根文件系统时很慢很慢!每次开机都是这样,项目中使用的是yaffs文件系统,理论上第一次启动时,会扫描完整的rootfs的flash区域建立索引,第二次启动就不会再扫描一次。但是实际情况是系统启动每次都扫描一遍,着实让人费解。经过排查探究,最后发现是自己的一个知识缺漏点,由于疏忽才导致每次启动都要扫描一遍flash,因此特此记录。

Chasing_Chasing的博客 1199

linux 文件系统构建之初步了解yaffs

http://blog.sina.com.cn/s/blog_a20257d80101ku70.html 第一,yaffs简介     yaffs也是一个flash文件系统,它于2001年由CharlesManning命名,当时CharlesManning创建的。现存的的flash文件系统杂乱还不能丢弃,但可以提出另一种flash文件系统,这个系统就是yaffs文件系统,yaffs文件系统

leonan的专栏 1415

使用linux4.15启动卡启动到文件系统 读写 emmc中linux 3.14的文件系统出现文件缺失

linux4.1.15内核将坏块表备份到了NAND中,而3.14没有。当yaffs读到最后几块被当作坏块表的块的oob区域时就会出现识别成坏块,而我们使用3.14内核的后几块并没有预留坏块表,那四块被写入了数据,当yaffs识别成坏块后会将坏块中的数据清除,所以造成了数据丢失。

weixin_52627168的博客 1245

yaffs文件系统

1. 概述yaffs文件系统专为Nandflash设计的日志文件系统,占用page中oob区域。目前有两个版本的yaffs文件系统。nandflash不可靠,存在坏块,存在数据错误,需要软件弥补纠正此错误。在yaffs中分配单元为CHUNK(chunk),一般情况,典型情况下其值与一页(page)大小相同(同时可灵活配置)。yaffs中文件数据的存储以chunk为单位。YAFFS是专为为NandF...

weixin_33854644的博客 548

YAFFS 文件系统实际 NAND 占用估算

所以哪怕写个 1 字节的空文件,也占 1 chunk(header) + 1 chunk(data) = 2 chunk。spare(OOB)大小不是固定的,由 NAND 芯片硬件决定,通常与 page 大小绑定。经验值约 4% 数据量。YAFFS 的"文件 chunk 映射树",树形数据结构,记录"文件的第 N 个 chunk 在哪个物理页"。(1:1 对应,一个 chunk 放一页),日常语境下 chunk 与 page 等价。:chunk 是货物,tag 是货物的运单,tnode 是货物的总索引本。

我的博客 211

yaffs2物理存储

了解一个文件系统,除了了解运行机制(RAM结构)外,还需了解文件系统怎样物理存储的。RAM数据结构是为文件系统更好运行,而物理存储是文件系统载体。文件系统出问题后,最终要从物理存储寻找数据。参考“How Yaffs Works”,文件数据都以顺序日志形式写到flash中,日志的每个entry都是一个chunk大小,所存的数据类型有两种:>>Data chunk: A chunk hol...

weixin_33963594的博客 260
上一篇: CMDLINE的解析
下一篇: C语言变量声明内存分配
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值