文件系统实现方法、碎片整理方法、操作位置定位方法与流程

文档序号:11216433阅读:423来源:国知局
文件系统实现方法、碎片整理方法、操作位置定位方法与流程

本发明涉及嵌入式文件系统领域,具体涉及一种适用于ic卡的文件系统的实现方法,本发明的适用范围包括但不限于ic卡,同样适用于其它与ic卡类似的存储器的文件系统的实现。



背景技术:

随着电子技术、计算机技术的飞速发展,不管是pc系统还是嵌入式系统,存储和管理大量数据的应用需求愈加广泛。ic卡是专门为大容量存储设计的闪存卡,具有成本低、兼容性好等优点。在某些行业应用中,为了ic卡能够和pc系统、嵌入式系统按照特定的格式方便地进行数据交换,需要设计文件系统,以屏蔽物理存储器的技术细节,把所管理的信息组织成文件形式,从而增加应用的可移植性和可维护性,便于用户有效管理大量的数据,同时,某些特殊行业对文件内容和格式有一定保密性和私有定制需求,所以构建一种适用于ic卡的专用文件系统具有一定的实际意义。

目前在通用计算机上已有不少成熟的文件系统,如fat、ntfs文件系统及unix、linux文件系统,但上述文件系统不适合ic卡直接使用,主要问题有:首先,ic卡应用于pc系统时通过读写器操作,应用环境较为恶劣,存在电源电压不稳、突发断电、频繁插拔等问题,通用文件系统对于可靠性的设计考虑不足;其次,ic卡应用于嵌入式设备读写时,通用文件系统基于资源丰富的pc平台和慢速的磁盘驱动器,需要耗费大量资源,而嵌入式系统往往资源有限;再次,ic卡的flash存储器芯片固有属性决定了通用文件系统不适用,其通常由若干块组成,块由若干页/扇区组成,而页则包含一定数量字节的存储单元。flash存储器的读操作与磁盘一致,但写操作与磁盘不同,通用文件系统对此没有相应的专门设计。flash存储器文件所占用的存储空间基本单位是块,数据写操作必须在空白区块或者擦除后区块中进行,擦除要求以块block为单位进行(将oxff写入待擦除的存储器块),写操作按页/扇区page方式进行(一次必须写入一个page),且flash存储器的擦除次数是有限的,flash存储器上建立文件系统时必须考虑flash存储器这些固有特性,某些块过度擦除会导致大大降低flash存储器的使用寿命。鉴于通用fat文件系统在ic卡上应用的上述缺点,亟需提出一种适用于ic卡的文件系统实现方法。



技术实现要素:

本发明提供一种文件系统的实现方法,以解决现有技术存在的问题。

本发明采用以下技术方案:

文件系统实现方法,存储区中分配存储在块中的fst区、fdt区、fat区和数据簇区;

所述fst区表示文件系统信息区,用于存储文件系统基本信息;fdt区表示文件描述信息区,用于存储描述文件的基本信息,所述文件的基本信息至少包括文件名称、起始簇、大小、创建时间;fat区表示文件分配信息区,用于存储文件的分配信息,数据簇区存储文件内容;

fst区同时存储fdt区的起始地址和fat区的起始地址;

fdt区设置fdt表,fdt表中存储文件的文件描述信息;当对文件的操作造成文件描述信息发生改变时,fdt区生成新的fdt表并进行存储;

fat区设置fat表,fat表中存储文件在数据簇区的簇分配情况和簇连接关系;当对文件的操作造成文件分配信息的发生改变时,fat区生成新的fat表并进行存储;

当对文件的操作造成文件描述信息和/或文件分配信息发生改变时,fdt区生成新的fdt表并进行存储,fat区生成新的fat表并进行存储;

通过fst区的起始地址索引fdt区和fat区,同时通过fdt表索引文件起始簇,通过fat表索引文件各簇的链接关系,通过各簇的连接关系索引数据簇区存储的整个文件内容。

所述fst区固定存储在块i,fdt区和fat区存储在不同块,数据簇区存储在其余块;其中0≤i≤n-1,n表示存储区中块的数目,i表示存储区的第i块;

所述fdt区分为fdt表区和fdt表索引区,fdt表存储在fdt表区,通过fdt表索引区能够索引到fdt表;

fat区分为fat表区和fat表索引区,fat表存储在fat表区,通过fat表索引区能够索引到fat表;

当对文件的操作造成文件描述信息与文件分配信息发生改变时,对fdt区和fat区进行以下操作:

fdt区:重新生成新的fdt表,并递增追加到上一个fdt表的下一个位置,同时在fdt表索引区中递增新的有效索引号,该有效索引号能够索引到新的fdt表;当fdt表索引区写满,则分配新的块给fdt区,并擦除当前fdt区所在的块,同时将新的fdt区的起始地址更新至fst区中;

fat区:重新生成新的fat表,并递增追加到上一个fat表的下一个位置,同时在fat表索引区中递增新的有效索引号,该有效索引号能够索引到新的fat表;当fat表索引区写满,则分配新的块给fat区,并擦除当前fat区所在的块,同时将新的fat区的起始地址更新至fst区中;

fst区存储的fdt区的起始地址和fat区的起始地址随着fdt区所在块和fat区所在块的转移进行更新,该更新方式为递增追加写的方式;当fst区存储的块i追加满后,触发整个块i的擦除及重写。

所述fst区存储的文件系统基本信息包括系统扇区、簇、块信息,所述存储区为ic卡的flash存储器。

所述fdt表、fat表均在内存中设置映射副本,当对文件的操作造成文件描述信息与文件分配信息的发生改变时,首先对内存中的fdt表和fat表进行重新生成,生成完成后,将内存中的fdt表和fat表分别写入到存储区中的fdt区和fat区,将fdt区和fat区中的fdt表和fat表更新为当前有效的fdt表和fat表;

所述fdt表、fat表的映射副本分别设置脏标记,所述脏标记在内存中的fdt表、fat表发生变化时,设置该标记为真,当将fdt表、fat表回写入存储区后,该脏标记被清除;

将内存中的fdt表同步写入存储区的fdt区时:若fdt表的脏标记已清除并且当前内存中的fdt表与存储区fdt区中的当前有效fdt表内容一致,则不进行同步写入;当任一项不满足时,均将内存中的fdt表同步写入fdt区中的fdt表,作为存储区的当前有效fdt表,同时将内存中的fdt表的脏标记清除;

将内存中的fat表同步写入存储区的fat区时:若fat表的脏标记已清除并且当前内存中的fat表与存储区fat区中的当前有效fat表内容一致,则不进行同步写入;当任一项不满足时,均将内存中的fat表同步写入fat区中的fat表,作为存储区的当前有效fat表,同时将内存中的fat表的脏标记清除。

所述向数据簇区中指定文件写入数据时,首先在内存中建立写缓冲区,当写缓冲区写满之后,首先从fat表中检索当前指定文件的尾簇,同时计算该尾簇所在簇的剩余空间,如果剩余空间不小于写缓冲区的大小,则写入长度为写缓冲区大小的数据;否则写入尾簇剩余空间大小的数据,同时继续申请新簇写入剩余数据。

所述fat表由多个2字节的簇状态组成,所述簇状态包括未分配、已分配、脏、结束4种状态。

碎片整理方法:

对存储区以块为单位进行扫描,计算每个块中的脏簇所占的比例,当该比例超出设定的整理阈值时,对文件系统进行碎片整理;所述脏簇为:对文件的删除操作使该文件所占簇成为脏簇;

对文件系统进行碎片整理时,首先检查fat表,检索待整理块中的有效簇,找到有效簇后,立即申请空闲簇,将有效簇内容拷贝到新申请的空闲簇中;若该有效簇为文件尾簇,则仅拷贝簇内有效长度,否则拷贝整簇内容;

拷贝簇内容的同时,生成新的fat表,同时在新的fat表中写入新的簇链;当前簇转移完成后整簇置脏;

重复以上操作,直到整个块中全是脏簇,擦除整块,并释放对应fat表,完成一次碎片整理。

操作位置定位方法:

在内存中创建快速查找表,针对存储同一文件的多个簇,将一段连续簇称为一个簇片段,将所有的簇片段集中映射到快速查找表中,由文件操作位置算出对应的连续簇序号,通过快速查找表获得对应簇号;

快速查找的实现步骤为:

遍历fat表;定义操作位置连续簇个数=读位置/簇大小;遍历快速查找表所有簇片段,连续簇个数每次都减去当前片段中的连续簇数,直到连续簇个数小于当前片段中的连续簇数,返回此片段的起始簇号与剩余连续簇个数的和即为操作位置对应簇号。

本发明的有益效果:本发明在存储器的存储区中分配四类区域,分别为文件系统信息数据簇区(fst)区、文件描述信息(fdt)区、文件分配信息(fat)区、数据簇区。fst区固定存储在某个块中,fdt区、fat区能够随着文件更新轮转所在块位置,fdt区、fat区转移的同时追加更新fst中的对应区起始地址,从而实现了fdt区、fat区、数据簇区在整个存储空间的均衡轮转和擦写平衡。

附图说明

图1是ic卡文件系统管理分区示意图。

图2是fdt区在fdt表变化时的内存回写示意图。

图3是ic卡文件系统初始化示意图。

图4是文件操作位置所在簇的快速定位示意图。

具体实施方式

下面结合附图1~4和具体实施方式对本发明作进一步详细说明。

本发明提供一种文件系统的实现方法,尤其是适用于ic卡及其与ic卡类似的存储器的文件系统实现方法,该方法通过以下方式实现。

首先在存储器的存储区中分配存储在块中的fst区、fdt区、fat区和数据簇区;其中fst区表示文件系统信息区,该区用于存储文件系统基本信息,例如扇区、块、簇等信息;fdt区表示文件描述信息区,该区用于存储描述文件的基本信息,文件的基本信息至少包括文件名称、起始簇、大小、创建时间、文件的状态等;fat区表示文件分配信息区,用于存储文件的分配信息,数据簇区存储文件内容。fst区固定存储在块i,fdt区和fat区存储在不同块,数据簇区存储在其余块;其中0≤i≤n-1,n表示存储区中块的数目,i表示存储区的第i块;fdt区、fat区随着文件更新轮转所在块位置。

fst区同时存储fdt区的起始地址和fat区的起始地址,且这些地址随着fdt区和fat区所在块的转移更新,其地址更新可以采用递增追加写方式,从而使fst区中存在多组fdt区和fat区的起始地址,但仅有最新更新的一组是当前有效的,进而确保任何时候都能从fst区中索引到fdt区和fat区。

通过fst区的起始地址索引fdt区和fat区,同时通过fdt表索引文件起始簇,通过fat表索引文件各簇的链接关系,通过各簇的连接关系能够索引数据簇区存储的整个文件内容。

fdt区设置fdt表,fdt表中存储文件的文件描述信息;当对文件的操作造成文件描述信息发生改变时,fdt区生成新的fdt表并进行存储。

本发明优先采用递增追加写方式进行fdt表的更新,此时,fdt区分为fdt表区和fdt表索引区,fdt表存储在fdt表区,通过fdt表索引区能够索引到fdt表;fdt表区存储多个fdt表,且任意时刻仅有一个fdt表是有效的,该有效的表通常为最新更新的表。作为一种实施方式,fdt表中可以存储最多256个文件的描述信息,该描述信息包括文件的状态、起始簇、名称、大小、创建时间等信息。文件的读写、增删、重命名等操作通常会造成上述信息的变化,从而需要及时更新fdt表。

更新fdt表时,需要首先重新生成新的fdt表,并递增追加到fdt表区的上一个fdt表的下一个位置,同时在fdt表索引区中递增新的有效索引号,该有效索引号能够索引到新的fdt表;当fdt表索引区写满,表示fdt区所在的块已经写满,此时分配新的块给fdt区,并擦除当前fdt区所在的块,同时将新的fdt区的起始地址更新至fst区中。

fat区设置fat表,fat表中存储文件在数据簇区的簇分配情况和簇连接关系;当对文件的操作造成文件分配信息的发生改变时,fat区生成新的fat表并进行存储。

当采用递增追加写方式进行fat表的更新时,fat区分为fat表区和fat表索引区,fat表存储在fat表区,通过fat表索引区能够索引到fat表。fat表区存储多个fat表,且任意时刻仅有一个fat表是有效的,该有效的表通常为最新更新的表。fat表用来表征所有文件在整个数据簇区的簇分配情况和簇链接关系,其由多个2字节的簇状态组成,簇状态包括未分配、已分配、脏、结束4种状态,结束状态表示当前簇是文件结束簇。文件的读写、增删及碎片整理等操作通常会造成文件簇的新分配、置脏等状态变化,从而需要及时更新fat表。

更新fat表时,首先重新生成新的fat表,并递增追加到fat表区的上一个fat表的下一个位置,同时在fat表索引区中递增新的有效索引号,该有效索引号能够索引到新的fat表;当fat表索引区写满,表示fat区所在的块已经写满,则分配新的块给fat区,并擦除当前fat区所在的块,同时将新的fat区的起始地址更新至fst区中。

在上述过程中,fst区存储的fdt区的起始地址和fat区的起始地址随着fdt区所在块和fat区所在块的转移进行更新,该更新方式也地址递增追加写的方式,即在fst区存储的上一个fdt区的起始地址和上一个fat区的起始地址的下一个位置增加新的起始地址,该起始地址能够索引到当前有效的fdt区和fat区;当fst区存储的块i追加满后,由于fst区固定存储在某一块中,因此,不再进行轮转更新所在快的位置,而是直接触发整个块i的擦除及在块i中的重写。基于前述,实现了fdt区、fat区、数据簇区在整个存储空间的均衡轮转和擦写平衡。

由于每个对文件的操作均需要更新fat表和/或fdt表,因此为了避免存储区中的fdt表和fat表的频繁改写,造成存储区中某些块的读写寿命缩短。本发明将存储区中的fdt表、fat表均在内存中设置格式完全相同的映射副本,当对文件的操作造成文件描述信息与文件分配信息的发生改变时,首先对内存中的fdt表和fat表进行重新生成,生成完成后,将内存中的fdt表和fat表分别写入到存储区中的fdt区和fat区,将fdt区和fat区中的fdt表和fat表更新为当前有效的fdt表和fat表。

fdt表、fat表的映射副本中需要分别设置脏标记,该脏标记在内存中的fdt表、fat表发生变化时,设置该标记为真,当将fdt表、fat表回写入存储区后,该脏标记被清除。

将内存中的fdt表同步写入存储区的fdt区时:若fdt表的脏标记已清除并且当前内存中的fdt表与存储区fdt区中的当前有效fdt表内容一致,则不进行同步写入;当上述任一项不满足时,均将内存中的fdt表同步写入fdt区中的fdt表,作为存储区的当前有效fdt表,同时将内存中的fdt表的脏标记清除。

将内存中的fat表同步写入存储区的fat区时:若fat表的脏标记已清除并且当前内存中的fat表与存储区fat区中的当前有效fat表内容一致,则不进行同步写入;当任一项不满足时,均将内存中的fat表同步写入fat区中的fat表,作为存储区的当前有效fat表,同时将内存中的fat表的脏标记清除。

向文件系统数据簇区中指定文件写入数据时,为了避免过度频繁写入,同时限于当前flash存储器的最小写入单元,本发明采取了预先写入缓冲区的方式。首先在内存中建立写缓冲区,当写缓冲区写满之后,首先从fat表中检索当前指定文件的尾簇,同时计算该尾簇所在簇的剩余空间,如果剩余空间不小于写缓冲区的大小,则写入长度为写缓冲区大小的数据;否则写入尾簇剩余空间大小的数据,同时继续申请新簇写入剩余数据。

从文件系统中读取指定文件时,首先需要在fdt区中找到文件的首簇内容,然后根据传入的读取偏移沿着fat表中的簇链检索读取起始位置所在簇,然后读取此簇从簇内偏移到簇尾的数据,比较读取长度若仍不够时,则继续跨簇读取簇链上其他簇的数据直至读够所需长度。

由于对文件进行删除操作导致该文件所占簇成为脏簇,因此文件系统需要提供碎片整理功能,以重新整理文件,尽量将文件存储在连续的簇块,同时释放脏簇空间。

进行碎片整理时,首先对存储区以块为单位进行扫描,计算每个块中的脏簇所占的比例,当该比例超出设定的整理阈值时,进行碎片整理。整理时,首先检查fat表,检索待整理块中的有效簇,找到有效簇后,立即在非待整理的块中申请空闲簇,将有效簇内容拷贝到新申请的空闲簇中;若该有效簇为文件尾簇,则仅拷贝有效簇内的有效长度,否则拷贝整簇内容;拷贝簇内容的同时,生成新的fat表,同时在新的fat表中写入新的簇链;当前簇转移完成后整簇置脏;重复以上操作,直到整个块中全是脏簇,擦除整块,并释放对应fat表,完成一次碎片整理。待整理块指的是脏簇所占的比例超出设定的整理阈值的块。

如图4所示,文件的链式分散存储造成了文件操作位置定位时需要遍历簇链,而很多时候,同一文件的一些簇是相邻的,将一段连续簇称为一个簇片段,此时在内存中设置一个快速查找表,将同一文件的所有簇片段集中映射到一个快速查找表中,由文件操作位置算出对应的连续簇序号,通过快速查找表即可获得对应簇号。快速查找步骤:遍历fat,创建快速查找表;操作位置连续簇个数=读位置/簇大小;遍历快速查找表所有片段,连续簇个数每次都减去当前片段中的连续簇数,直到连续簇个数小于当前片段中的连续簇数,返回此片段的起始簇号与剩余连续簇个数的和即为操作位置对应簇号。

如图1~3所示的,是将块0作为fst的固定存储块,对使用flash的ic卡使用文件系统的方法。

在ic卡的flash存储器中使用文件系统之前,需要对文件系统进行新建即格式化。文件系统的格式化包括硬格式化和软格式化两个步骤,首先是对ic芯片进行硬格式化,使得所有字节置0xff,随后按照文件系统设计格式需要进行软格式化。

文件系统的软格式化包括:

如图1、3所示,按照flash存储器块、簇、扇区信息填充相应文件系统整体信息,赋给fst区的对应信息,随后,将块1地址赋给fst区的fdt区起始地址信息,将块2地址赋给fst区的fat区起始地址信息,并将fst区写入块0。至此,完成fst区的初始化。

根据fst区中的fdt区起始地址信息,索引到fdt表,将其表内容全部置0xff并将索引字节置为0x55550000,至此,完成fdt的初始化。

据上所述,系统fst占用块0,fdt占用块1,同时,设计fat占用块2。故而,fat表的前3块fat字节分别置为特殊值0xfff1、0xfff2、0xfff3,以表征其被特殊占用,其余fat表的字节置全0,以表征其为尚未分配的簇。随后,将索引字节置为0xaaaa0000,至此,完成fat的初始化。

文件系统操作之前需要进行挂载。文件系统的挂载过程中,需要将当前有效的fdt表、fat表从flash搬移到内存中以便适应可能的频繁修改,同时,为确保内存与flash内容的一致性,设计各自表的脏标记,内存中fdt、fat表的变化会导致脏标记为真,而向flash的回写会清除脏标记。

文件写入操作会导致文件长度的变化、簇链的变化等,往往需要更新fdt表、fat表。由于fdt表、fat表都已在内存中有映射副本,则相应更新操作在直接在内存进行,内存fdt表、fat表变化之后,通过两种机制回写入flash以进行同步,一种是固定的、关键性的操作节点,比如写入数据前要强制回写fat以防止数据写入失败后fat不同步,另一种是某些操作,例如文件关闭操作。

向flash中同步写fdt表:查看脏标记已清除,以及比较内存fdt表内容与读取flash当前有效fdt表内容是否一致,若同时满足则不必进行同步写入。否则,将fdt区的有效表索引号加1,在索引区顺序递增写最新索引号,同时,顺序地址写更新表区,将当前内存fdt表内容拷贝到flash中的最新索引指向位置,并清脏标记。在递增写索引号时,若当前索引区已经写满,则表征当前fdt区所在块已写满,需要搬移,即分配新块给fdt区,同时要更新fdt区在fst中的起始地址信息,以及由于新块分配造成的fat表变化,随后将原有块擦除。

向flash中同步写fat表:查看脏标记已清除,以及比较内存fat表内容与读取flash当前有效fat表内容是否一致,若同时满足则不必进行同步写入。否则,将fat管理区的有效表索引号加1,在索引区顺序递增写最新索引号,同时,顺序地址写更新表区,将当前内存fat表内容拷贝到flash中的最新索引指向位置,并清脏标记。在递增写索引号时,若当前索引区已经写满,则表征当前fat管理区所在块已写满,需要搬移,即分配新块给fat管理区,同时要更新fat管理区在fst中的起始地址信息,以及由于新块分配造成的fat表变化,随后将原有块擦除。

以上所述的仅是本发明的优选实施方式,应当指出,对于本领域的技术人员来说,在不脱离本发明整体构思前提下,还可以作出若干改变和改进,这些也应该视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1