F2FS源码分析系列文章

主目录
一、文件系统布局以及元数据结构
  1. 总体结构
  2. Superblock区域
  3. Checkpoint区域
  4. Segment Infomation Table区域(SIT)
  5. Node Address Table区域(NAT)
  6. Segment Summary Area区域(SSA)
二、文件数据的存储以及读写
三、文件与目录的创建以及删除(未完成)
四、垃圾回收机制
五、数据恢复机制
六、重要数据结构或者函数的分析

Segment Summary Area区域-SSA结构

Segment Summary Area,简称SSA,是F2FS用于集中管理物理地址到逻辑地址的映射关系的结构,同时它也具有通过journal缓存sit或者nat的操作用于数据恢复的作用。映射关系的主要作用是当给出一个物理地址的时候,可以通过SSA索引得到对应的逻辑地址,主要应用在GC流程中; SSA所包含的journal可以缓存一些sit或者nat的操作,用于避免频繁的元数据更新,以及宕机时候的数据恢复。

SSA在元数据区域的物理结构

从结构图可以知道,SSA区域由N个struct f2fs_summary_block组成,每一个struct f2fs_summary_block包含了512个struct f2fs_summary_entry,刚好对应一个segment。segment里面的每一个block(物理地址)对应一个的struct f2fs_summary_entry,它记录了物理地址到逻辑地址的映射信息。它包含了三个变量: nid(该物理地址是属于哪一个node的),version(用于数据恢复),ofs_in_node(该物理地址属于该nid对应的node的第ofs_in_node个block)。

f2fs_journal属于journal的信息,它的作用是减少频繁地对NAT区域以及SIT区域的更新。例如,当系统写压力很大的时候,segment bitmap更新就会很频繁,就会对到SIT章节所提到的struct f2fs_sit_entry结构进行频繁地改动。如果这个时候频繁将新的映射关系写入SIT,就会加重写压力。此时可以将数据先写入到journal中,因此journal的作用就是维护这些经常修改的数据,等待CP被触发的时候才写入磁盘,从而减少写压力。也许这里会有疑问,为什么将journal放在SSA区域而不是NAT区域以及SIT区域呢?这是因为这种存放方式可以减少元数据区域空间的占用。关于journal的描述以及作用可以参考第六章的journal章节以及以及第一章Checkpoint章节,本节不做描述。

SSA物理存放区域结构

从上图所示,SSA的基本存放单元是struct f2fs_summary_block,它结构如下:

struct f2fs_summary_block {struct f2fs_summary entries[ENTRIES_IN_SUM]; // ENTRIES_IN_SUM = 512struct f2fs_journal journal;struct summary_footer footer;
} __packed;

与summary直接相关的是struct f2fs_summary以及struct summary_footerENTRIES_IN_SUM的值512,因此每一个entry对应一个block,记录了从物理地址到逻辑地址的映射关系,entry的结构如下:

struct f2fs_summary {__le32 nid;     /* parent node id */union {__u8 reserved[3];struct {__u8 version;       /* node version number */__le16 ofs_in_node;    /* block index in parent node */} __packed;};
} __packed;

用了一个union结构进行表示,但是核心信息是nidversion以及ofs_in_node。根据第二章的第一节文件数据的保存以及物理地址的映射可以知道,数据的索引是通过node来进行。文件访问某一个页的数据时,需要首先根据页的索引,找到对应的nid以及offset(两者构成逻辑地址),从而根据nid得到node page,再根据offset得到了该页的物理地址,然后从磁盘中读取出来。f2fs_summary则是记录物理地址到逻辑地址的映射,即根据物理地址找到对应的nid以及offset。例如,现在需要根据物理地址为624的block,找到对应的nid以及offset。那么物理地址为624,可以得到该地址位于第二个segment,然后属于第二个segment的第113个block(block的编址从0开始)。因此根据属于第二个segment的信息,找到第二个struct f2fs_summary_block,然后根据偏移量为113的信息,找到对应的struct f2fs_summary结构,从而得到nid以及ofs_in_node

struct summary_footer结构记录了校验信息,以及这个summary对应的segment是属于保存data数据的segment还是node数据的segment。

SSA内存管理结构

SSA在内存没有单独的管理结构,summary以及journal在内存中主要存在于CURSEG中,可以从Checkpoint结构这一章节找到相关的描述。

F2FS源码分析-1.6 [F2FS 元数据布局部分] Segment Summary Area-SSA结构相关推荐

  1. F2FS源码分析-1.4 [F2FS 元数据布局部分] Segment Infomation Table-SIT结构

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node ...

  2. F2FS源码分析-1.3 [F2FS 元数据布局部分] Checkpoint结构

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node ...

  3. F2FS源码分析-1.2 [F2FS 元数据布局部分] Superblock结构

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node ...

  4. F2FS源码分析-2.2 [F2FS 读写部分] F2FS的一般文件写流程分析

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...

  5. F2FS源码分析-2.3 [F2FS 读写部分] F2FS的一般文件读流程分析

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...

  6. F2FS源码分析-2.1 [F2FS 读写部分] F2FS文件数据组织方式以及物理地址的映射

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...

  7. F2FS源码分析-6.6 [其他重要数据结构以及函数] F2FS的重命名过程-f2fs_rename函数

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 三.文件与目录的创建以及删除(未完成) 四.垃圾回收机制 五.数据恢复机制 六.重要数据结构或者函数的分析 ...

  8. F2FS源码分析-5.2 [数据恢复流程] 后滚恢复和Checkpoint的作用与实现

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 三.文件与目录的创建以及删除(未完成) 四.垃圾回收机制 五.数据恢复机制 数据恢复的原理以及方式 后滚恢 ...

  9. F2FS源码分析系列文章目录

    一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node Address Table区域( ...

最新文章

  1. 网络安全工具:Nmap
  2. oracle语句mysql数据库名称_查询oracle数据库中当前数据库所有表的名称
  3. Allegro16.6软件布局设计技巧:模块复用
  4. Java过滤掉map集合中key或value为空的值
  5. 合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)
  6. 使用Settings Bundle为程序添加设置项
  7. 2022年中国开源软件产业研究报告
  8. 操作系统内核的一些事
  9. Android Studio在Ubuntu下离线安装Gradle
  10. 百度飞桨 如何撑起了AI产业生态?
  11. Linux 下获取 IP 和 MAC Adr 的方法
  12. windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本
  13. 三坐标检测之报告查看T值
  14. android页面监听扫描枪,Android监听扫描枪内容(二)
  15. Vitalik 系统设计中的封装复杂性和系统复杂性
  16. Android和iOS人才招聘出现拐点 低能人才泛滥
  17. 毕业季--写给未来的自己
  18. tensorflow2系类知识-4 :RNN
  19. vue-cli 项目打包后 代理接口报404错误 解决办法!
  20. 华为方舟编译器官网正式上线,写一篇你应该知道的科普文章

热门文章

  1. TAPA认证辅导,TAPA全球委员会正式发布了《运输供应商最低安全要求》
  2. RTSP,RTP,RTCP协议
  3. linux的安卓源码编译提示版本不匹配,编译Android源码致命错误解决方案
  4. 验证集到底有什么作用
  5. 神经网络中验证集起了什么作用?
  6. 说极路由牛逼的人们,你们用过Tomato DualWAN吗?(二)
  7. 无线路由传输速率的秘密
  8. Jieba分词词性标注以及词性说明
  9. 「订单」业务的设计与实现
  10. 雨林木风 Ghost XP SP2 纯净版 Y3.0