以开源的YAFFS2为切入点,深入剖析地址映射、坏块管理算法源码,掌握其算法设计思想。
- 通过分析相关函数,理解从文件系统初始化到真正写入Nand的整个过程;
- 通过分析相关函数接口,认识文件系统层和Nand层次基本关系点是地址映射,除此之外,文件系统和Nand的操作都是按照各种的逻辑,各自处理各自的;
- 重复写数据到Nand,理解从写入Nand第一页到再次写入Nand第一页的整个过程;
- 重复写数据到Nand,理解垃圾回收的整个过程;
- 分析地址映射和坏块管理;
- 分析上电时读取Nand的哪些信息,并且怎么样使用这些信息;
- 借用文件系统变量及程序架构,实现简单程序来读写用户数据(传入参数:逻辑地址+数据+长度);
- RAM资源的使用情况分析。
详细,如下:
1)yaffs_StartUp
2)yaffs_mount
3)yaffs_Scan
4)YAFF_Open: 建立文件,就是在RAM和Nand里面建立文件的头
5)YAFF_Write: 写文件,就是把数据写入Nand
6)YAFF的软件层次较分明,文件结构\数据等只是在文件层操作,底层Nand操作读写擦和上层的接口就是地址映射
7)地址映射的方法是:数据是属于该文件里面的哪个数据段,映射到实际的物理页面
8)垃圾回收和坏块管理与文件系统没有关系,底层根据Nand的状态自动进行
yaffs_StartUp
1)配置Nand的基本信息,Nand的驱动
2)yaffs_initialise:Handles数组–>与Nand无关
yaffs_mount
1)yaffs_InitialiseBlocks:因为RAM模拟Nand,所以是建立Nand–>与文件无关
2)yaffs_InitialiseTnodes: Tnodes数组–>与Nand无关
yaffs_Scan
1)读取Nand信息
2)使用Nand信息初始化文件系统相关:Handles,Tnodes–>与Nand无关(除了地址映射)
3)使用Nand信息初始化Nand信息相关:Dev-,块、页等使用状态、标志->与文件无关
yaffs_open
1)创建文件相关信息:Handles,Tnodes–>与Nand无关(除了地址映射)
2)将文件头写入Nand:Dev-,垃圾回收–寻找可用的页–写入Nand–反馈真实页面地址给文件系统–>与文件系统无关(除了地址映射)
3)写入Nand:数据+OOB区的Tag–>与文件系统有关的是文件ID
垃圾回收与磨损均衡
1)在真正有写Nand需求时:写文件头和写文件数据,才做垃圾回收
2)按照一定规律先检查是否需要回收,是则迁移老块的数据到新块,然后擦掉老块(回收)–>与文件无关
3)不存在因为数据不需要更新,而数据页或者块一直不被更新的情况,即冷热块比较均衡–>与文件无关
寻找新页
1)在真正写Nand时:上层传来的只有数据,具体写哪页,底层根据各块、页状态,自行查找–>与文件无关
实例分析写Nand和垃圾回收过程
2)Nand:4页/16块
3)依次写入Nand的每一页,所有页写完后,回到第一页开始写–>与文件无关
4)垃圾回收的速度超过写入Nand的速度,在所有页还没有被写完时,垃圾回收已经多次(写完所有页时,所有块已经被检查了6次,所有垃圾已经被回收)–>与文件无关
上述部分,后续分为几个专题,详细讲解。