Linux的YAFFS文件系统实现机制分析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于Linux的YAFFS文件系统实现机制分析内容提要•YAFFS的基本特征•YAFFS的核心数据结构•YAFFS的实现机制YAFFS的基本特征•YAFFS(YetAnotherFlashFileSystem)专门为NANDFlash存储器开发的日志结构文件系统。•NANDFlash:基于浮闸晶体管技术组成非易失性固态存储器•NANDFlash特点及YAFFS的实现策略:1)NANDFlash的读、写操作以页为单位,而擦除操作则是以块为单位进行;YAFFS文件是以固定大小的chunk进行存储的(chunk的大小一般等于NANDFlash页的大小)YAFFS的基本特征2)NANDFlash只能从1写为0,不能从0写为1;3)每个擦除块的可擦除次数有限,一般为100万次;YAFFS采用了日志结构文件系统的“异域更新”策略。每次按Flash页写入操作的时候,将新的元数据和用户数据作为日志记录追加到日志。YAFFS对NANDFlash的废旧数据块回收的条件:1)分配使用最早2)存在的无效数据页最多3)条件类似的情况下,进行随机选择。YAFFS的基本特征YAFFS的基本特征4)出厂时或使用过程都可能存在坏块,且随机分布;通过日志标识坏块或通过驱动层查询坏块,在mount时在内存中生成一个块状态表,记录块的状态5)使用过程中可能会出现位反转(bit-flipping)的情况。YAFFS提供了ECC校验算法或通过硬件提供YAFFS采用模块化设计的,分成以下几个部分:YAFFS的基本特征YAFFS文件系统核心YAFFS的VFS层的接口YAFFSMTD接口VFSMTD层设备驱动yaffs_fs.cyaffs_guts.c等yaffs_nand.cyaffs_mtdif2.c•YAFFS的核心数据结构•YAFFS的核心数据结构YAFFS2的主要的结构体在yaffs_guts.h文件中定义。存储空间中的主要数据结构如下:goto•YAFFS的核心数据结构yaffs_PackedTags2的数据成员:gotoYAFFS在NandFlash上的组织方式Chunk0File1datePackedTagsFile1datePackedTagsFile1ObjectHeaderPackedTagsFile2datePackedTagsChunk1Chunk2File2ObjectHeaderPackedTags………File1的物理空间组织File2的物理空间组织ObjectHeaderPackedTags一个目录或链接………Chunkn•YAFFS的核心数据结构YAFFS在内存中的主要数据结构:back•YAFFS的核心数据结构YAFFS在内存中的主要数据结构2:•生成LinuxVFS数据结构所要用的YAFFS数据结构inode-i_ino=objectID;inode-i_size=objectlength();inode-i_private=obj;obj-myinode=inode;从上面可以看出,实际上object结构替代了inode结构,只是在面向VFS进行了一个封装。backYAFFS通过多级树节点结构(Tnode)提供了对文件操作时的LogicalAddress到PhysicalAddress的转换。Level0Level1Level2InternalTnodeLevel0Tnode16位x16个,每个单位存的是16位的物理Chunk的地址。32位X8个数组,每个单位存的是32位的下一个Tnode地址。……backTree的增高和增宽:小于16*2K的文件,chunkID16,Tnode结构只有一级;即internallevel=0;32Kfilesize256K,chunkID128,Tnode结构有两级;即internallevel=1;类推,Tnode结构不超过六级。Tnode的始地址及高度:保存在yaffs_FileStructure结构中,结构成员的值是在文件系统Mount过程中获得的。文件结构指针地址最终会提供给yaffs_object结构。•YAFFS的实现机制核心结构在内存中的建立—Mount过程Linux下YAFFS文件系统的读写操作1.取得SuperBlockYAFFS文件系统本身在NANDFlash上并不存在(没有存储)所谓的SuperBlock块,完全是在文件系统mount的过程中由yaffs_read_super()函数填充的。其核心是:•核心结构在内存中的建立—Mount过程sb-s_fs_info=dev;//完成文件系统设备与底层驱动接口MTD层封装mtd=get_mtd_device(NULL,MINOR(sb-s_dev));2.建立一些虚拟对象(FAKEObject)在建立文件系统目录结构之前,YAFFS会建立四个虚拟目录(FAKEDirectory):rootDir,unlinkedDir,deleteDir,lostNfoundDir分别用作根目录,unlinked对象挂接的目录,delete对象挂接的目录,无效或零时数据块挂接的目录。核心结构在内存中的建立—Mount过程3.在内存中建立文件系统的目录结构。基于“异域更新”的日志结构文件系统的特点,YAFFS文件系统需要通过扫描YAFFS分区,将文件系统的目录结构在内存中建立起来。核心结构在内存中的建立—Mount过程Mount设备过程:通过倒序扫瞄Flash中的所有Block和Pages,扫描过程分为三个步骤:第一步:逐块扫描所有块状态,取得“needscanning”状态的块的tag中的sequenceNumber,按sequenceNumber值的从大到小给块排序放入blockIndex[]表中。第二步:开始倒序扫描,把所有的yaffs_Object及其之间的关联架构在RAM中建立起来。同时建立文件的地址映射关系Tnode结构。第三步:建立页、块状态信息表块分配状态信息:structyaffs_BlockInfo;页状态信息:yaffs_Device提供一个32位的位图chunkBits[],每一位都代表着Flash上的一个chunk的状态核心结构在内存中的建立—Mount过程目录结构的建立:1)chunkID=0:该FlashPage存放的数据为ObjectHeader,查找此tags中的ObjectID,在RAM中寻找该Object是否已在RAM中已建立,若建立则将该Page加入至所属的Object中,若未建立则根据ObjectID去建立一个对应的Object。完后再根据ObjectHeader中的ParentObjectID到RAM中寻找对应的ParentObject,并将子Object中的Parent指针指向ParentObject。2)chunkID0:表示该Page存放的数据为某个Object的Data,查找该Tag中的ObjectID,然后过程同上,到建立或加入对应的Object为止。倒序扫描过程:从NANDFlash每页的spare区读取yaffs_tags中的chunkID,经解包后判断是文件头页面还是数据页面。在扫描完所有的Block后,YAFFS会把文件系统对象对应的yaffs_Object结构建立其之间的关系,在RAM中形成一种阶层式结构核心结构在内存中的建立—Mount过程核心结构在内存中的建立—Mount过程文件Tnode结构的建立:chunkID0的同时,根据逻辑地址chunkID的值,将此当前页的物理地址填充到此文件的对应Tnode结构的level0中(没有的话就申请一个)。同时计算出需要internallevel的层数,如果层数大于现有的层数,则补足中间的level,向中间level的节点内添加下级level的首地址指针。最后将fStruct-top指向Tnode的始地址。这样,当一个文件的所有chunk都被扫描完毕后,也完成了此文件的Tnode结构的填充,fStruct-top指向最高层的Tnode始地址。Level0Level1Level2InternalTnodeLevel0TnodeFileStructure—top……back•Linux下YAFFS文件系统的读写操作Linux下YAFFS向VFS提供了相应接口的操作方法,在readsuper时向VFS注册,包括:YAFFS超级块操作:structyaffs_super_opsYAFFS索引节点操作:structyaffs_dir_inode_operationsstructyaffs_symlink_inode_operationstructyaffs_file_inode_operationsYAFFS文件操作:structyaffs_dir_operationsYAFFS的方法:YAFFS的存储空间管理写分配:YAFFS的写入方式宏观上是按序向下分配,YAFFS的mount完成时,在dev结构中记录了当前可提供分配的块号及chunk地址。首先更新内存中的对象结构,然后将数据及日志,从当前分配chunk按序写入,并更新当前可分配地址。如果一个block内的所有chunk全部分配完毕,再查找下一个可分配block。最后,关闭该文件,回写此对象的Object_Header。Linux下YAFFS文件系统的读写操作写更新:对于文件来说就是将内存中原Tnode的物理页映射关系删除和插入新的映射关系,再更新物理空间相应的ObjectHeader数据。对于目录来说,就是更新相应Object的目录指针,然后更新相应的ObjectHeader。yaffs通过一个shrink日志标识该Object为更新过的对象。如果在没有关闭文件之前,电脑就断电,则要通过Scan来重新建立Object。这个时候,上面所讲sequenceNumber及ishrink日志的作用就是还原到最新的状态。存储空间的回收,即YAFFS的垃圾回收策略:YAFFS的垃圾回收策略为了兼顾损耗平均和减小系统开销的目的,结合贪心算法的高效性和随机选择的平均性,保留2到3个块用于垃圾块收集。当没有足够的干净块的时候,脏块(只包含丢弃数据)将会按分配顺序最早(sequenceNumber最小)的,将被擦除成干净块。如果没有脏块,那些特别脏的块(含有丢弃数据特别多的块)也会被垃圾块回收算法选中。Linux下YAFFS文件系统的读写操作Thankyou!

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功