嵌入式文件系统的制作方法

文档序号:6561176阅读:186来源:国知局
专利名称:嵌入式文件系统的制作方法
技术领域
本发明涉及一种,特别涉及一种嵌入式文件系统。 技术背景电脑文件系统的可靠性是指在非正常断电等特殊情况下,文件系统的健 壮性。在特殊情况出现后,--个可靠的文件系统可以保证自己仍然处于一个正确的状态,而不影响在其上面的继续操作(可能会丢失部分数据)。PC机在使用中特殊情况出现后,即使文件系统不保证其可靠性,用户也可以通过运行类似fsck程序或者第三方工具来对文件系统进行修复。然而在嵌入式 系统中,这个方法则行不通,因为相当的嵌入式系统是没有软件管理员的, 他们可能被大量安装在无人值守环境下,如果一旦出现断电就要把他们取回 进行文件系统修复操作,这是不可想象的。所以可靠性对于嵌入式文件系统 来说,尤为重要。 发明内容本发明的目的是针对已有技术中存在的缺陷,本发明提供了一种嵌入式 文件系统。整个文件系统被设置成树形的数据结构,采用Phase Tree算法, 并有一个根节点指向文件系统,系统中细分为三个树形的子数据结构,分别 为Recorded Tree、 Branching Tree和Recording Tree, Recorded Tree记录了 当前位于磁盘上的文件系统镜像,Recording Tree记录了最新的文件系统镜 像,Branching Tree记录了距离目前为止最近的文件系统位于一致性状态的镜 像,三个树形数据结构会不断进行转换,并修改文件系统的根结点,整个文 件系统操作具有原子性,每个树形数据结在转换中仅修改差异的部分,系统包含以下步骤A文件系统的原子化;B 确定根节点(metaroot);C开辟一个工作区域;D转换操作,所有对FAT的操作在FAT2上进行,所有的操作都不影 响当前位于磁盘上文件系统的一致性,修改完成后,再修改根节点 (BPB),将FAT2作为新的有效的FAT表,将根目录工作区作为新的根目录;E建立FAT Phase Tree数据结构,原子文件系统采用Fat Phase Tree算法;F系统初始化,纪录该目^/文件在meta子树中的位置;G写文件操作,采用copy-on-write的方式来进行写入操作,对于所有 涉及到修改的数据,都必须在原有系统得空闲空间上复制一块然后 在上面修改,最后再将修改后的数据替换原有数据;H新建节点Cluster操作;].删除节点Cluster操作;J读操作。由于修改根结点操作是原子性的(要么做完,要么没有做,不会产生一 个做了--半的情况),听以使得整个文件系统操作也具有原子性,从而不再
会产生不一致的状态。为了提高效率,每颗树在转换的时候仅仅修改差异的 部分,这样就避免了大数据的修改工作,此外,对关键数据在内存中进行缓 冲也可以加快关键数据的访问速度,也将大幅度提升该文件系统的效率。该文件系统采用Phase Tree算法,当系统非正常断电的时候,整个文件 系统仍可以保持一致性而不被损坏,并且再次开机的时候无需做任何文件系 统扫描和修复操作,使得系统可以像正常情况一样快速启动起来。利用优化改进的Phase Tree算法,成功的将Linux原有的ext2文件系统 转换成了一个可靠的文件系统。树形数据中的节点为文件系统元数据MetaData,而非目录树,每当有 写操作的时候,就在空闲空间内创建这棵树形数据结构的分支,再执行原子 化的更新,将旧的树形数据结构更新为分支,操作一步完成,中间不可被打 断,保证文件系统的一致性。三个树形的子数据结构Phase Treee同时存在,每一个树形的子数据结构 都有着自己独立的meta root。其中一棵记录了磁盘上当前已经完整写入的一 致状态,称为Recorded Tree,该树形的全部数据都位于磁盘。另一个树形的 子数据结构也记录了—个一致状态,不过它的meta root位于系统内存中, 而且其中可能有一些数据还没有被写入到磁盘中(即为Dirty Buffer),称为 Recording Treee第三个树形的子数据结构全部位于系统内存中,不处于一致 状态,我们把它叫做Branching Treec三个树形的子数据结构分别代表不同的状态,并且不断循环转换着, Recorded Tree准确的记录了当前磁盘的状态;Recording Tree记录了下.-次
要被写入的数据,而Branching Tree则记录了操作系统看来最新的文件系统 数据,它还包含了一个释放列表,记录了被释放的inode和block。每一次作 原子更新的时候,三个文件系统就做一次切换,Recording Tree被写入到磁 盘并转换为Recorded Tree, Branching Tree被修正到一个最新的一致性状态 转换为Reconied Tree,而Recorded Tree则更新写入操作后变成Branching Tree。所有操作进行的时候都采用copy-on-write方式,不仅保证文件系统元数 据的一致性,还保证文件数据的一致性。本发明的优点是大幅度提升性能,并实现文件系统的可靠性,当系统非正常 断电的时候,整个文件系统仍可以保持一致性而不被损坏,并且再次开机的 时候无需做任何文件系统扫描和修复操作,使得系统可以像正常情况一样快 速启动起来,具有实现简单、效率高、不过多消耗系统资源和不会额外占有 文件系统空间的优点,非常适合用于嵌入式系统。


图l本发明的树形的子数据结构示意图; 图2本发明的三个树形数据结构示意图; 图3本发明的节点结构示意图1块位图Block biti胎ps、 2结点位图Inode bitmaps、 3组描述块Gro叩 Descriptors, 4組.元文件Group metafile、 5根结点Meraroot、 6结点 元文件Inode metafil.e、 7结点表Inode Table具体实施方式
下面结合附图进--步说明
具体实施例方式参见图l, FAT32文件系统的原子化与FAT32兼容意味着该文件系统在磁盘上的存储完全符合微软的FAT32 规范,原子化意味着在文件系统部分对数据的组织和操作要完全按照原子文 4牛系统的方式来进行。 根节点(metaroot)原子化文件系统要求文件系统一定要有一个根节点(metaroot),该根节 点指向了当前文件系统数据。在FAT32文件系统中,BPB就可以当作根节 点来看待,因为在这个扇区中存储了所有其他文件系统的位置FAT表位置 和根目录位置。 工作区原子文件系统要求在存储介质上除了有当前文件系统数据区外,还要另 外开辟一个工作区。我们可以利用FAT32BPB中的双FAT表结构来实现这一 点。首先看一下FAT32扩展部分的描述 —u32 fat32 length; /* sectors/FAT */ 》—u16 flags; /* bit S: fat mirroring, low 4: active fet */ >> 一u8 version[2]; /* major, minor filesystem version */ —u32 root—duster: /* first cluster in root directory */ 》ui6 info—sector; /* filesystem info sector */ FAT32文件系统中一共存在着两个FAT表, 一般情况下只有第一个是有 效的,第二个FAT表仅仅起着备份的作用但是flags对如何使用这两个FAT
表也作出了规定如果flags的最高位被设置上的时候,系统只会使用这两 个FAT表中的一个,而flags的低四位则标记系统使用哪一个FAT表。这样 我们可以把flags的最高位设置上,当FAT1为当前有效FAT表的时候,我 们可以使用FAT2作为工作区,反之,当FAT2为当前有效FAT表的时候, 我们可以使用FAT1作为工作区。文件系统数据除了FAT表外,还有目录,当需要修改目录数据的时候我 们可以在磁盘上找一块空闲空间作为目录的工作区。 转换操作假设当前有效FAT表为FAT1,当进行文件操作的时候,如果要修改目录 信息,我们可以在磁盘空间上再找一块空闲区域作为目录的工作区,所有目 录修改在目录工作区上面进行,而所有对FAT的操作在FAT2上进行。这样 所有的操作都不影响当前位于磁盘上文件系统的一致性。修改完成后,再修 改根节点(BPB),将FAT2作为新的有效的FAT表,将根目录工作区作为新 的根目录。算法和数据结构,参见图2,原子文件系统采用Fat Phase Tree算法,将文件系统组织成一棵树的形式 (metadata树,而不是目录树),当进行文件系统操作的时候,在原文ft^系 统空闲空间上(.工作区)创建一棵新的树,然后通过修改metaroot来切换。 为了方便转换操作,在系统中同时使用3棵树,分别叫做Recorded Tree, Recording Tree, Branching Tree。 Recorded Tree纪录着磁盘上当前文件系统,
Recording Tree纪录着目前的文件系统,Branching Tree纪录着距离目前文件 系统最近的那个一致文件系统镜像。文件系统的操作在Branching Tree上进 行,当Branching Tree达到一个一致状态的时候,就立刻将其复制到Reeoding Tree。系统后台有一个进程负责定期触发转换操作,转换的时候Recording Tree的内容被复制到磁盘上取代Recorded Tree。FAT PHASE TREE算法由于phase tree算法是在ext2文件系统基础上提出的,而ext2属于典型 的UNIX INODE类型文件系统,每个文件或者目录都有一个对应的inode节 点,在该inode节点中顺序储存了所有其占用的block的号,这样通过查询 inode节点中的block表就可以定位文件/目录数据在磁盘上的位置。但是FAT 文件系统采用的却是链表方式。文件系统得可靠性有宽松的定义和严格的定义,在系统遭遇非正常掉电 的情况下,宽松的定义仅要求文件系统的元数据保持一致性,而严格的定义 还要保证文件内部数据的一致性。如果直接在FAT上面应用phase tree算法, 则无法保证文件数据的一致性(因为它无法做到copy on write)-所以phase tree不能直接用于FAT文件系统,必须对其做出修改,创建一种全新的算法 和数据结构——FAT Phase Tree:FAT Phase Tree数据结构,参见图3,闬一棵二叉树来描述FAT32的文件系统,树的根节点代表MetaRoot,它 的左子树代表MetaData,右子树代表FAT表。MetaData子树中有两类节点, 一种是Cluster节点(用圆形表示),代表 一个已经使用的簇,另一种是文件/目录节点(用方形表示),代表一个文件/ 目录。对于Cluster节点来说,它的左子树代表其所在FAT表中所处链表中 的下一 Cluster。如果该Cluster是属于一个文件的,则其没有右子树,如果 Cluster是属于一个目录的,则其右子树代表该目录Cluster数据中的文件/子 目录。对于文件/目录节点来说,其左子树代表该文件/目录的FAT链表,右子树 代表该文件/目录所处目录中的其他文件/子目录。右子树代表FAT表,它也是一颗二叉树,右节点代表其所在链表上的下 一个Cluster,左节点代表下一条链表。为方便査找,空闲Cluster也被组织 成一条空闲Cluster链表(在磁盘上没有这么作)。算法系统初始化系统启动的时候检查BPB的校验值,如果校验失败,则恢复备份的BPB。 系统从磁盘中读入当前FAT表入缓冲区,然后建立Recording Tree和 Branching Tree。 打开目录/文件操作因为在FAT32文件系统中目录也是一个文件,所以打开目录操作也是打 开文件操作。这个操作相对是比较简单的,同传统FAT32文件系统中打开目录/文件
操作没有太大区别,只是打开的过程中,需要纪录下该目^/文件在meta子树中的位置,以方便后续操作。写文件操作因为在FAT32文件系统中目录也是一个文件,所以写目录操作也是写文 件操作。该操作是所有操作中最关键也是最复杂的一个,因为我们除了要保证文 件系统metadata (FAT表)的一致性,还要保证其数据的一致性(目录内容的 一致性和写入数据的一致性),所以我们必须釆用一种copy-on-write的方式 来进行写入操作,也就是对于所有涉及到修改的数据,我们都必须在原有系 统得空闲空间上复制--块然后在上面修改,最后再将修改后的数据替换原有 数据,而不能直接在原有数据上面修改,因为如果直接在原有数据上面修改, 当修改操作到一半的时候发生断电,则会造成文件系统得不一致性。 具体操作步骤可以如下进行-1) 根据该文件的cluster链表(可以在meta子树中获取)确定所要写入 的cluster号(称为Cluster A);2) 通过査找Branching Tree的FAT子树,找一块空闲的Cluster (称为 Cluster B)。并且将Cluster A的内容拷贝到Cluster B;3.)新建一个Cluster类型节点,其内容为ClusterB,在ClusterB上面进 行写入操作,然后将其替换原meta子树上的Cluster A节点,再释放 Cluster A节点,并且在FAT子树中将Cluster A移入空闲Cluster链表
4) 检査Cluster B在meta子树中的位置,取得其父节点NodeP。如果它 的父节点是Clu欲er类型节点,则转到步骤8;如果它的父节点是文 件/目录类型节点,则转到步骤5;如果它的父节点是metaroot,则转 到步骤7;5) NodeP为文件/目录类型节点,且ClusterB为该文件的第一个簇。对 Node P不断进行査找父节点操作,直到找到其第一个Cluster类型的 父节点(Cluster C),这个就是Node P所处的Cluster。通过査找 Branching Tree的FAT子树,找一块空闲的Cluster (称为Cluster D); 并且将ClusterC的内容拷贝到ClusterD,然后释放ClusterC节点, 并且在FAT子树中将Cluster C移入空闲Cluster链表中;6) 把ClusterD看作ClusterB,转入步骤4;7) NodeP为metaroot节点,且ClusterB为该文件的第一个簇,也就是 说Cluster B成为新的根目录起始簇,纪录下这个变化和根目录的新 起始簇;8) 将树上的修改写入磁盘(Chister的内容和FAT表内容)。特别重要的 是对于后来被标记为空闲的Cluster,如果它的内容有修改,则也不 应该将修改的内容写回,而应在磁盘上保持其数据不变。新建Cluster操作新建Cluster操作同写操作基本类似,具体操作步骤可以如下进行1)通过査找Branching Tree的FAT子树,找一块空闲的Cluster (称为 Cluster A); 2) 新建一个Cluster类型节点,其内容为ClusterA,将该节点插入到meta 子树中的正确位置;3) 检査Cluster A在meta子树中的位置,取得其父节点NodeP。如果它 的父节点是Cluster类型节点,则转到步骤6;如果它的父节点是文 件/目录类型节点,则转到步骤4;4) Node P为文件/目录类型节点,且Cluster A为该文件的第一个簇。 对Node P不断进行査找父节点操作,直到我到其第一个Cluster类型 的父节点(Chister B),这个就是Node P所处的Cluster。通过查找 Branching Tree的FAT子树,找一块空闲的Cluster (称为ClusterC); 并且将ClusterB的内容拷贝到ClusterC,然后释放ClusterB节点, 并且在FAT子树中将Cluster B移入空闲Cluster链表中;5) 把Cluster C看作Cluster A,转入步骤4; 将树上的修改写入磁盘(Cluster的内容和FAT表内容)。特别重要的 是对于后来被标记为空闲的Cluster,如果它的内容有修改,则也不 应该将修改的内容写回,而应在磁盘上保持其数据不变;删除Cluster操作删除Cluster操作同新建Cluster操作基本类似,具体操作步骤可以如下进行:1) 将Cluster A从meta子树中释放,并在FAT子树中将其标记为空闲;2) 检査Cluster A删除前在meta子树中的位置,取得其父节点Node P; 如果它的父节点是Cluster类型节点,则转到步骤5;如果它的父节 点是文件/目录类型节点,则转到步骤3;
3) NodeP为文件/目录类型节点,且删除前Cluster A为该文件的第一个 簇。对NodeP不断进行査找父节点操作,直到找到其第一个Cluster 类型的父节点(Cluster B),这个就是NodeP所处的Cluster。通过査找 BranchingTree的FAT子树,找一块空闲的Cluster (称为Cluster C); 并且将ClusterB的内容拷贝到ClusterC,然后释放ClusterB节点, 并且在FAT子树中将ClusterB移入空闲Cluster链表中;4) 把Cluster C看作Cluster A,转入步骤4;5) 将树上的修改写入磁盘(Cluster的内容和FAT表内容)。特别重要的 是对于后来被标记为空闲的Cluster,如果它的内容有修改,则也不 应该将修改的内容写回,而应在磁盘上保持其数据不变。读操作读操作比较简单,我们不应当使用Recorded Tree和Recording Tree来定 位读取的内容位于哪一个Cluster,而应该通过Branching Tree来完成定位操 作,然后调用文件系统底部驱动层提供的接口,读出该Cluster即可。
权利要求
1.一种嵌入式文件系统,整个文件系统被设置成树形的数据结构,采用Phase Tree(相位树)算法,并有一个根节点指向文件系统,系统中细分为三个树形的子数据结构,分别为完成树Recorded Tree、分支树Branching Tree和进行树Recording Tree,Recorded Tree记录了当前位于磁盘上的文件系统镜像,Recording Tree记录了最新的文件系统镜像,Branching Tree记录了距离目前为止最近的文件系统位于一致性状态的镜像,三个树形数据结构会不断进行转换,并修改文件系统的根结点,整个文件系统操作具有原子性,每个树形数据结在转换中仅修改差异的部分,系统包含以下步骤A文件系统的原子化;B确定根节点(metaroot);C开辟一个工作区域;D转换操作,所有对FAT的操作在FAT2上进行,所有的操作都不影响当前位于磁盘上文件系统的一致性,修改完成后,再修改根节点(BPB),将FAT2作为新的有效的FAT表,将根目录工作区作为新的根目录;E建立FAT Phase Tree数据结构,原子文件系统采用Fat Phase Tree算法;F系统初始化,纪录该目录/文件在meta子树中的位置;G写文件操作,采用copy-on-write(即时拷贝)的方式来进行写入操作,对于所有涉及到修改的数据,都必须在原有系统得空闲空间上复制一块然后在上面修改,最后再将修改后的数据替换原有数据;H新建节点Cluster操作;I删除节点Cluster操作;J读操作。
2. 根据权利要求1所述的--种嵌入式文件系统,树形数据中的节点为文件 系统元数据Meta Data,而非目录树,每当有写操作的时候,就在空闲 空间内创建这棵树形数据结构的分支,再执行原子化的更新,将旧的树 形数据结构更新为分支,操作一步完成,中间不可被打断,保证文件系 统的一致性。
3. 根据权利要求1所述的一种嵌入式文件系统,Recorded Tree准确的记录 了当前磁盘的状态;Recording Tree记录了下一次要被写入的数据,而 Branching Tree则记录了操作系统看来最新的文件系统数据,它还包含 了--个释放列表,记录了被释放的inode和block,每一次作原子更新的 时候,三个文件系统的树形数据结构就做一次切换,Recording Tree被 写入到磁盘并转换为Recorded Tree, Branching Tree被修正到--个最新 的- 致性状态转换为Recorded Tree,而Recorded Tree则更新写入操作 后变成Branching Treec
4. 根据权利要求1所述的 -种嵌入式文件系统,所有操作进行的时候都采用 c叩y-on-write方式,保证文件系统元数据的一致性,保证文件数据的一致 性。
全文摘要
一种嵌入式文件系统,整个文件系统被设置成树形的数据结构,采用Phase Tree算法,并有一个根节点指向文件系统,系统中细分为三个树形的子数据结构,分别为完成树、分支树和进行树,三个树形数据结构会不断进行转换,并修改文件系统的根结点,整个文件系统操作具有原子性,每个树形数据结在转换中仅修改差异的部分。本发明的优点是大幅度提升性能,并实现文件系统的可靠性,当系统非正常断电的时候,整个文件系统仍可以保持一致性而不被损坏,并且再次开机的时候无需做任何文件系统扫描和修复操作,使得系统可以像正常情况一样快速启动起来,具有实现简单、效率高、不过多消耗系统资源和不会额外占有文件系统空间的优点,非常适合用于嵌入式系统。
文档编号G06F17/30GK101162459SQ20061011711
公开日2008年4月16日 申请日期2006年10月13日 优先权日2006年10月13日
发明者涛 于, 李禹雄, 范树春 申请人:上海万安电子科技有限公司;范树春
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1