F2FS源码分析-1.6 [F2FS 元数据布局部分] Segment Summary Area-SSA结构
F2FS源码分析系列文章
主目录
一、文件系统布局以及元数据结构
- 总体结构
- Superblock区域
- Checkpoint区域
- Segment Infomation Table区域(SIT)
- Node Address Table区域(NAT)
- 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_footer
。ENTRIES_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结构进行表示,但是核心信息是nid
、version
以及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结构相关推荐
- F2FS源码分析-1.4 [F2FS 元数据布局部分] Segment Infomation Table-SIT结构
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node ...
- F2FS源码分析-1.3 [F2FS 元数据布局部分] Checkpoint结构
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node ...
- F2FS源码分析-1.2 [F2FS 元数据布局部分] Superblock结构
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node ...
- F2FS源码分析-2.2 [F2FS 读写部分] F2FS的一般文件写流程分析
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...
- F2FS源码分析-2.3 [F2FS 读写部分] F2FS的一般文件读流程分析
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...
- F2FS源码分析-2.1 [F2FS 读写部分] F2FS文件数据组织方式以及物理地址的映射
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...
- F2FS源码分析-6.6 [其他重要数据结构以及函数] F2FS的重命名过程-f2fs_rename函数
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 三.文件与目录的创建以及删除(未完成) 四.垃圾回收机制 五.数据恢复机制 六.重要数据结构或者函数的分析 ...
- F2FS源码分析-5.2 [数据恢复流程] 后滚恢复和Checkpoint的作用与实现
F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 三.文件与目录的创建以及删除(未完成) 四.垃圾回收机制 五.数据恢复机制 数据恢复的原理以及方式 后滚恢 ...
- F2FS源码分析系列文章目录
一.文件系统布局以及元数据结构 总体结构 Superblock区域 Checkpoint区域 Segment Infomation Table区域(SIT) Node Address Table区域( ...
最新文章
- 网络安全工具:Nmap
- oracle语句mysql数据库名称_查询oracle数据库中当前数据库所有表的名称
- Allegro16.6软件布局设计技巧:模块复用
- Java过滤掉map集合中key或value为空的值
- 合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)
- 使用Settings Bundle为程序添加设置项
- 2022年中国开源软件产业研究报告
- 操作系统内核的一些事
- Android Studio在Ubuntu下离线安装Gradle
- 百度飞桨 如何撑起了AI产业生态?
- Linux 下获取 IP 和 MAC Adr 的方法
- windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本
- 三坐标检测之报告查看T值
- android页面监听扫描枪,Android监听扫描枪内容(二)
- Vitalik 系统设计中的封装复杂性和系统复杂性
- Android和iOS人才招聘出现拐点 低能人才泛滥
- 毕业季--写给未来的自己
- tensorflow2系类知识-4 :RNN
- vue-cli 项目打包后 代理接口报404错误 解决办法!
- 华为方舟编译器官网正式上线,写一篇你应该知道的科普文章