前言 根据NandFlash的一些特性,读写速度快,生产工艺问题或多或少存在坏块,最小擦除单位为块,最小读取单位为字节,并且不能频繁对其进行擦写操作,最先对NandFlash支持最好的就是Yaffs文件系统,但Yaffs文件系统最大支持的页大小为512Byte,Yaffs2支持页大小可以达到2048Byte 但针对那些像linux的大型操作系统不管是Rom和Ram的开销确实不算什么,但如果只是把它应用在ram只有几十Kbyte的单片机上也是经过裁剪再裁剪才能放进去,这就需要诞生一种集Yaffs优点于一身,而且对硬件要求很低的文件系统,这是TQFS文件系统的初衷。
TQFS文件系统的优点
需要的Rom少:大概一千五百多行代码
需要的Ram少:平均需要建立的全局变量不大于基本都是用来存储一些使用Tab表的偏移位置及内容存储区的偏移位置等信息,其他局部变量的最大开销不会超过80Byte。
文件系统稳定性好:就算文件系统局部出现灾难性的故障,依然可以读取文件系统中完整的个别文件,这点是在其他类型文件系统中不具备的。
对硬件伤害小:在一块格式化完整的NandFlash上进行写入文件,在NandFlash没有写满的情况下,TQFS是不会对其进行擦出块操作。
文件大小没有限制:文件最大可以在一个存储设备上存储一个文件,最小可以存储的文件个数,理论上是,一个存储设备上除去Tab占据的一个块外,剩余块上每页都可以存放一个文件,不足占据一页的算作一页,以K9f2g08为例最多可以存放文件为2048*64-64个文件,每个文件大小为2Kbyte。
高效率性:存储一个文件不需要整块空间,当需要对很久以前的文件进行内容追加时,系统会寻找空白页写新的内容并且与之前的文件通过地址关联链接成一个文件,删除文件也可以只删除文件头,文件中间页可以在块回收的时候进行整理,
文件类型多样性:可以存放的文件类型除了文件夹文件类型还增加了一些特殊类型,如链接类型和和根目录类型,可以在文件系统中建立多个根目录,相当于硬盘中的多个分区一样。
如下是每个存储页的首字节标志,用来标识该页的内容。利用NandFlash的擦除过程是从非1擦除到1的过程,为了避免再次擦除,文件类型确定了是不能进行修改,但该页属于整个文件的的组成部分位置可以从文件头,改为文件按中或文件尾,但一旦改为文件尾,该文件的大小就确定了,不能对其进行追加操作。
enumFileType{
FT_NotUsed=0xff,//页未被使用
FT_ReadyRoom=0x7f,//未定义长度的泛型文件存储区
FT_File=0x1f,//文件类型的未定义长度存储区
FT_FileHead=0x1e,//文件首
FT_FileCenter=0x1c,//文件中
FT_FileEnd=0x18,//文件尾部
FT_Folde=0x2f,//文件夹类型的未定义长度存储区
FT_FolderHead=0x2e,//文件夹头标志
FT_FolderCenter=0x2c,//文件夹中间标志
FT_FolderEnd=0x28,//文件夹尾标志
FT_Link=0x3f,//链接类型的未定义长度存储区
FT_LinkHead=0x3e,//链接文件头标志
FT_LinkCenter=0x3c,//链接文件中间标志
FT_LinkEnd=0x38,//链接文件尾标志
FT_RootDir=0x4f,//路径文件标志
FT_RootDirHead=0x4e,//根文件头标志
FT_RootDirCenter=0x4c,//根文件中间标志
FT_RootDirEnd=0x48,//根文件尾标志
FT_Delete=0x08,//文件被删除标志
FT_Tab=0x6f,//文件页被用来存放Tab表标志
FT_Bad=0x00 //页损坏标志
};
文件系统的可扩展性:该套文件系统架构是在k9f2g08上测试的,理论上可以兼容所有规模的NandFlash,且如果文件TAB表损坏或丢失,都可以花一些时间去搜索文件存储区来重构文件TAB表。
文件的坏块管理:文件的坏块管理通过写页的标志位为0x00来却别该页是否是不可用页,这比传统的坏块管理好在,如果一个存储设备的某个块并不是全部算坏,而只是某个页上局部位置损坏,(NandFlash坏区的定义为,擦除不为全1的为损坏),那么该块的其他页照常可以使用。
文件的擦除平衡:往文件系统里写入文件是从前往后找可用页一次向后写,当写到不能再写入内容的时候,系统会自动启用删除块回收,回收是也是从前往后的顺序找出所有可擦除块对其进行擦写,保证了系统不会频繁的对某个特定块进行反复擦写。从而实现了均衡擦除。
TQFS文件系统底层架构包含对NandFlash的整体规划使用区域划分,文件Tab位置的确定是在格式化NandFlash的过程中决定的,通常,Tab的位置被定在首个非坏块上,Tab占用一个存储块,文件其余块为文件内容存储区,文件内容存储区的位置都是使用的相对偏移位置,即认为紧跟Tab所在块后面一个非坏块的位置为基地址,Tab中每页的Data区域(存放数据内容的区域)的每个字节对应内容存储区的每页,且与内容存储区每页的Spare的首字节的内容是保持一致的,Tab实际上是为加快文件搜索和统计的速度而设定的。
泛型文件管理层该层定义了文件内容存储区的每页数据结构,每页的Spare区域左对齐存放File_Infor结构类型数据,描述该页的详细信息,每页的数据内容存储区域存放文件内容数据,该文件内容由File_Infor数据结构中的FileType决定,如果是普通文件类型,那么在该区域存放的是文件内容数据,这跟其他文件系统一样,如果是文件夹类型,那么该页存放的是链接,链接的长度通常是8字节对齐,每8字节描述一个链接文件,首字节存的是链接指向文件的文件类型,紧接着存放的是链接指向的文件地址,链接指向的类型也可以是全部类型,文件夹里存放的链接与链接文件里存放的链接基本是相同的,但是链接文件中的存放的链接地址指向的可以是文件的非头部分,但文件夹里的链接就只能指向文件的首部。
TQFS文件系统架构说明(又一个最适合Nandflash的轻量级嵌入式文件系统)