一种面向高清媒体的嵌入式文件存储结构及存储方法
技术领域
本发明涉及嵌入式文件***技术领域,特别涉及一种面向高清媒体文件的嵌入式文件存储结构及存储方法。
背景技术
随着媒体产业进入高清时代大环境的到来,加之高清化带来的数据存储技术的应用以及以嵌入式***为支撑的嵌入式平台的应用背景下,采用现有的嵌入式存储技术存储高清媒体文件暴露出诸多问题,如出现文件易丢失、***易崩溃、操作及数据不可恢复,以及I/O性能的有限所造成的播放卡顿等问题。
目前应用于嵌入式***的文件***有ext2、ext3和ReiserFS,这些文件***各有优势,但是由于嵌入式***的自身资源受限、易受外界因素影响,导致现有的文件***的可靠性、稳定性与数据一致性并没有很好的保障。
ext2文件***广泛应用于Linux操作***中,其性能受到很多用户的肯定。但是该文件***在读写操作发生异常情况时,ext2文件的丢失率及文件***损坏率都非常高。虽然,ext2文件***包含了***一致性检测模块与修复模块e2fsck,但e2fsck在出错时对要对文件***进行全面的扫描,时间复杂度与空间复杂度随数据量呈线性增长。因此对于资源有限、易受外界环境影响、需要高运行效率的嵌入式存储***是不合适的。
ext3文件***在兼容ext2的基础上添加了日志机制,但是经过其在嵌入式***上的测试发现,由于日志机制、分组处理方法、数据块回收等机制对易受外界环境影响的嵌入式***并不适用,因此其存储***的可靠性仍然无法保证。
ReiserFS相比ext2的性能有较大提高,也包含日志机制,但是ReiserFS有些目录操作并不同步,可能会导致一些重度依赖文件锁机制的应用程序的数据损毁。另外ReiserFS没有磁盘整理程序,每升级一个版本都要对磁盘进行格式化。
因此,针对上述问题,目前还没有完整、全面、适用的嵌入式媒体数据存储并可提高性能的存储解决方案,尤其是面向大数据量的高清媒体文件的数据存储组织解决方案。
发明内容
本发明的目的在于,为克服现有的嵌入式***的文件***存在的种种问题,本发明提供了一种面向大数据量的高清媒体文件的数据存储组织解决方案,即一种面向高清媒体文件的嵌入式***的文件存储结构及存储方法。
本发明为了达到用户数据与元数据、目录数据的彻底分离,则必须使用分区域存储结构将其彻底分离,同时需要保证能够通过元数据检索到用户数据,并实现文件***所包含的其它操作功能。本实施例中存储结构的整体设计采用分区域结构,使用数据片链表方式进行存储,保证了各个区域的独立、连续、可扩展的性质,可达到性能稳定、存储可靠的目的。
本发明提供的一种面向高清媒体的嵌入式文件存储结构,该文件存储结构采用分区域形式将元数据与目录数据分开存储,其特征在于,所述的文件存储结构包含:
卷标域,用于存储本文件存储结构的属性信息;
片单元索引域,用于对确定的本文件存储结构的最小存储单元进行管理,所述的片单元索引域内部为各个文件占用数据块的链表;
目录索引域,用于记录具体文件或目录的属性信息,并通过提供具体文件对应片单元在所述的片单元索引域中的首地址实现对文件占用片单元链表头的定位;
数据域,用于保存文件对应的实际数据,使用时通过片单元索引域进行索引管理与所述的片单元索引域建立映射关系;
临时交换域,用于存储为辅助内存查找而生成的一些临时数据,同时保存对***元数据的快照以及操作日志记录;
其中,
所述片单元索引域、目录索引域、数据域和临时交换域之间采用指针进行索引;
所述片单元索引域包含若干4字节地址指针,其中所述地址指针被不同存储文件分为若干组,且每组指向同一文件的地址指针依次存放指向该文件的下一个存储单元的地址;
所述目录索引域是目录索引部分,包含若干个目录索引项,每个目录索引项记录不同文件或目录的属性信息;
所述数据域由若干连续的数据片单元组成,每个数据片单元中均只存放文件的数据信息,即文件以数据片为单元进行存储;
所述临时交换域存储所述目录索引域中目录项的哈希表。
上述技术方案中,所述文件存储结构的属性信息包含:分区标示信息、分区的大小、片存储单元的大小、片存储单元的数量、以及片单元索引域的大小、目录索引域的大小、数据域的大小、临时交换域的大小和各区域的起始位置指针;
所述文件或目录的属性信息包括:文件类型、文件的修改状态、文件大小、文件名称、文件对应数据片单元索引的首地址和父目录项位置。
所述临时数据包括:文件属性、目录项位置信息和文件名称字节数。
基于上述文件存储结构本发明还提供一种面向高清媒体的嵌入式文件存储方法,所述的文件存储方法包含:
1)挂载文件存储结构的步骤;
2)文件存储结构的分区之间采用指针查找确定样本数据文件在数据域中存储位置的步骤。
上述技术方案中,所述挂载文件存储***的步骤进一步包含:
首先,嵌入式操作***首先读取卷标域中的信息,从而得到所述卷标域中存储的片单元相关属性信息、目录索引域相关属性信息、数据域相关属性信息及临时交换域属性信息;
然后,根据获得的片单元相关属性信息、目录索引域相关属性信息、数据域相关属性信息及临时交换域属性信息确定各区域的起始位置和大小,以及数据片单元容量。
上述技术方案中,所述查找确定样本数据文件在数据域中存储位置的步骤进一步包含:
2-1)给定一个文件的完整路径名称,由该文件路径名借助临时交换域找到该文件对应的目录项;
2-2)将目录索引项中的片单元索引首地址字段作为链表头;
2-3)在片单元索引域中从链表头开始,依次读取整个指针链,组成文件的片单元索引数组;
2-4)由文件读写位置偏移和文件的片单元索引数组,计算出读写位置在数据域中的存储位置,确定目标数据相对于数据域起始位置的偏移量。
其中,
所述步骤2-4)
采用下式确定目标数据相对数据域起始位置的偏移:
ESU[i]×SUsize+offset
其中,FSU[i]是给定文件的第i个逻辑片单元在数据域中的片单元号;SUsize为片单元大小;i是逻辑片单元号;ppos为读写的目标数据在相对于文件开头的逻辑位置,用片单元大小SUsize整除ppos,得到的商为i,余数为offset。
所述步骤2-3)的片单元索引域进一步包含如下步骤:
2-3-1)使用4字节表示一个指针地址;
2-3-2)初始化状态、删除状态均以一特定值A表示该索引单元为空闲域;
2-3-3)片单元索引域中的每个索引单元中均存放指向下一索引单元的指针;
2-3-4)文件结束片单元索引单元的指针域为另一特定值B;
2-3-5)以A与B判断文件是否在写入后正常关闭,其中B为正常关闭。
另外,所述的临时交换域根据文件路径名进行哈希查找。
本发明的优点在于:
1)嵌入式***,利用本发明的存储结构可以将文件元数据与实际数据分离,便于文件***的组织管理;
2)利用本发明的存储方法,降低了元数据数量,并能够利用独立的区域之间的指针索引关系,实现对文件目录项信息定位、文件索引链表建立以及文件实际数据读写操作,能够有效提高文件***的读写性能。
附图说明
图1为本发明提供的文件结构分区域的存储结构示意图;
图2为本发明提供的卷标域的具体存储结构图;
图3-a为本发明提供的片单元索引域包含的四字节指针初始状态的存储结构图;
图3-b为本发明提供的片单元索引域的四字节指针存放指向下一数据单元的索引指针的存储结构示意图;
图3-c为本发明提供的某两个文件名为File_1与File_2的文件在片单元索引域中的存储结构示意图;
图4为本发明提供的某两个文件名为File_1与File_2的文件在目录索引域的存储结构示意图;
图5为本发明提供的某两个文件名为File_1与File_2的文件在目录索引域的存储结构树形图;
图6为本发明提供的片单元索引域与数据域对应关系示意图;
图7为本发明提供的临时交换域结构图;
图8为本发明提供的文件***各个区域之间的关联示意图;
图9为本发明提供的文件存储***在发生读写操作时定位样本文件的步骤的流程图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步的说明。
如图1所示,该图为本发明提供的分区域文件存储结构包含五个不同功能区域的示意图,该五部分可参考本发明的申请人在申请号是“201010531503.3”的发明专利:“一种用于高清媒体的嵌入式文件***”,这五个不同功能区域分别为:卷标域、片单元索引域、目录索引域、数据域和临时交换域。
如图2所示,该图为本发明文件***存储结构的卷标域的具体结构图。
其中,卷标域占用一个片单元,片单元索引域从第二个片单元起始。其包含了该分区标示信息“MSFS_MST”、该分区的大小Partitionsize、片存储单元的大小SUsize、片存储单元的数量SUnum、以及片单元索引域的大小SUIsize、目录索引域的大小EIsize、数据域的大小DSUsize、临时交换域的大小TSUsize,以及各区域的起始位置指针*PSUI、*PEI、*PDSU、*PTSU,其余为Reserved字段,为便扩展。该区域信息不需要进行不断地更新,所以降低了因为更新卷标域而宕机的可能性。
如图3-a、3-b和3-c所示,该图为本发明提供的文件***存储结构的片单元索引域具体结构图。其中,片单元索引即通过索引指针对文件的最小数据单元进行索引能够迅速定位文件数据块所存储的位置从而加快文件的读写操作。
片单元索引由4字节指针组成的,每个指针均表示一个片单元。因此,片单元索引域容量SUIsize计算公式如下:
其中,Partitionsize为磁盘分区总容量,SUsize为片存储单元的大小;例如,如果分区容量与片单元容量为Partitionsize=120GB,SUsize=1MB,则只需用SUIsize=120×1024×4(B)=480KB即可管理整个分区。
如图3-a表示在初始化片单元索引表时使用“0xFFFFFFFF”进行初始化;如图3-b所示,片单元索引表中的指针采用4字节为单位进行存放,且存放的内容为指向下一数据单元的索引指针;如图3-c为列举的某两个文件名为File_1与File_2的文件在该片单元索引域中的存储实例,从图中可以看出File_1占用的片单元索引分别是1、3、4、7、9...39,File_2占用的片单元索引分别是2、5、6、8...38。综上片单元索引域的工作步骤如下:
(1)初始化状态、删除状态均以0xFFFFFFFF表示该索引单元为空闲域;
(2)文件结束索引单元的指针域为0;
(3)本索引单元中存放指向下一索引单元的指针;
(4)以0xFFFFFFFF与0判断文件是否在写入后正常关闭,其中0为正常关闭,0xFFFFFFFF为初始化状态、空闲状态或修改中间态;
(5)使用4字节表示一个指针地址,可表示2^32-2=4,294,967,294个1MB数据块(除去0与0xFFFFFFFF),约为4095TB空间。
如图4所示,该图为本发明提供某两个文件名为File_1与File_2的文件在目录索引域的存储结构示意图。
目录索引域是本文件***存储结构的目录索引部分,该目录索引部分共包含若干个目录索引项。每个目录索引项又包含文件与目录的名称、片单元索引首地址(FirstSU)或属性等信息。
其中,本实施例中目录索引域总大小为32MB,分为65536个目录项,每个目录项固定长度512字节。如图4所示,该目录项结构的主要字段包括有效符(Valid)、类型(Type)、在片单元索引域中的首地址(FirstSU)、父节点的目录项编号(Parent_loc)、文件大小(FileSize)、状态(State)、预留(Reserved)和文件名称(Name)。
其中“有效符”表示该目录项是否有效,如果为“Y”表示有效,如果为“N”表示无效。无效意味着该目录项将允许被回收利用,如当该目录项所包含的文件被删除时,只需将有效符置为“N”即可。“类型”表示该目录项中保存的类型:文件或目录,“D”表示文件,“F”表示目录。“首地址”表示该目录项中所存储文件的片单元索引首地址,结合图3-c图与图4,File_1的FirstSU为1,File_2的FirstSU为2。而对于目录本身没有数据体,因此目录的FirstSU位均为0。Parent_loc为该目录项的父目录项的编号位,目录项的编号为从1~65536,如果该目录项的父目录为根目录,则Parent_loc为0。从图中看出,File_1的父目录项编号为1,而编号为1的目录项中存放的父目录项编号为0(即根节点)的DIR_1。通过对图5中的文件、目录的遍历绘出存储结构树形图如图5所示。
如图5所示,该图表示了图4中目录与文件的关系,其中DIR_2与File_2均为DIR_1的子结点,因此其Parent_loc字段均为1。DIR_1与DIR_3的父节点均为Root,因此其Parent_loc字段均为0。另外File_2的Parent_loc字段为5,表示其是DIR_4的子节点,而DIR_4的Parent_loc字段为4,表示其是DIR_3的子节点。图5正是通过Parent_loc字段解析得到的上述关系。
另外的字段,如“状态”为该目录项的保护位。当文件需要进行修改时,该字段被置为“M”(Modified),当修改完成,该字段被置位“P”(Protect)。这一字段主要是用来区分文件是否被正常使用并被关闭,使用该字段的模块包括追加操作、文件***的检测与修复等。“文件名”字段为目录与文件名称字段,该字段固定使用目录项的后256字节,名称最长不得超过255字节。在目录项的512字节中,除去上述的字段,剩余为预留字段,以便于扩展。
因此,目录索引域是一个非常重要的元数据域,它的作用包含:(1)文件与目录的属性显示;(2)文件在片单元索引域中首索引(FirstSU)定位;(3)文件与目录的检索定位;(4)文件***的检测与修复。
如图6所示,该图表示本发明的片单元索引索引指针与数据域包含的数据片单元之间的索引关系示意图。
其中,数据域由若干连续的数据片单元组成。每个数据片单元中均只存放单个文件的数据信息,即文件以数据片为单元进行存储。另外本实施例中数据片单元大小为1MB(即使最后一块数据只有1KB,也采用1MB的数据片单元进行存储)而且该存储单元将不会再被用来存储其他数据。
如图7所示,该图为本发明提供的临时交换域结构示意图。临时交换域是用来存储为辅助内存查找而生成的一些临时数据。其中,本实施例中该区域用来存储目录索引域中目录项的哈希表。哈希函数为目录名称的字节和,如目录索引域所述的文件名的最大长度为255字节,因而哈希函数的取值范围为{0,1,2,...,65025},在临时交换域内分配65536个表项就可以满足需要。
此外不同的文件名可能具有相同的字节和,因而会造成哈希冲突。为克服该问题,本实施例中采用在冲突链表中存储文件名的字节趋势值,该字节趋势值的定义如下:
X为文件名中的字节列,X={x1x2x3...xn},其中n为文件名中包含的字节数,n≤256。则X对应的字节趋势值用256位二进制比特来表示:t1,t2,t3,…t256,
从上式能得到具有相同字节和的不同文件名必然具有不同字节趋势值,因而通过引入字节趋势值便能够解决哈希函数的冲突问题。本实施例采用链表法解决冲突问题,冲突链表由若干冲突表项组成,所有的冲突表项与哈希表项分开存储,如图7的结构。
如图8所示,本发明还提供一种针对该文件***的存储结构的存储方法。该方法与分层的存储结构相联系,用于组织并管理存储结构中的各区域的数据信息,以提供给用户完整的文件***功能。
其中该方法展示了各区域的关系具体工作步骤为:
首先,当嵌入式***中挂载文件***时,首先读取卷标域中的信息,从而得到存储结构中其他各区域的起始位置和大小,以及数据片单元容量等信息。其次,当发生文件读写操作时:
1)首先由文件名进行哈希查找,找到文件名对应的目录索引域中的目录项。
2)由目录项中片单元索引的首地址找到片单元索引域中的片单元索引,依链接关系读出文件对应的所有片单元索引。
由读写的目标数据在文件中的逻辑位置计算出文件中的逻辑片单元,再通过片单元索引即可确定目标数据在数据域中的确切位置。图8中的弧线箭头的方向展示了发生读写操作时四种区域之间的联系示意图。具体步骤为:当文件***对样本进行查找与读写操作时,其首先进入临时交换域,根据样本名称字节和哈希表查找其在目录索引域中的位置,同时定位到目录索引域,查找该样本在目录索引域中保留的片单元索引的首指针FirstSU;再以FirstSU指针为链表头读取所述的片单元索引域中的内容,将该样本的所有索引指针读入内存,这样根据索引块指针可以定位所存储的样本文件在所述数据域中的数据片。临时交换区的数据内容主要是为了加快索引速度而建立的内存临时访问数据,因此该区域中的数据属于临时数据与片单元索引域、目录索引域、用户数据域没有直接的相互关系。片单元索引域、目录索引域、数据域和临时交换域之间采用指针进行索引。
如图9所示,该图为本发明提供的文件读写步骤示意图。给定文件的完整路径名称,读写的目标数据在相对于文件开头的逻辑位置为ppos,片单元大小为SUsize。
首先,由文件路径名借由临时交换区查找到文件对应的目录项。
然后,以目录项中文件片单元索引的首地址为链表头;
其次,读取片单元索引域中的链表,得到给定文件的所有片单元索引列成的数组FSU[]。
最后,由文件读写位置偏移和文件的片单元索引数组,计算出读写位置在数据域中的存储位置,确定目标数据相对于数据域起始位置的偏移量。
FSU[i]是给定文件的第i个逻辑片单元在数据域中的片单元号;SUsize为片单元大小;i是逻辑片单元号;ppos为读写的目标数据在相对于文件开头的逻辑位置,用片单元大小SUsize整除ppos,得到的商为i,余数为offset。具体公式如下:
ppos=i×SUsize+offset(0≤offset<SUsize)
若把单个文件的数据按照它们在同一个文件中出现的先后顺序以片单元大小划分,每一块称为逻辑片单元。对这些逻辑片单元从0开始编号,得到逻辑片单元号。这样i就是逻辑片单元号,FSU[i]就是给定文件的第i个逻辑片单元在数据域中的片单元号。FSU[i]×SUsize+offset就是目标数据相对数据域起始位置的偏移。
本发明提供的文件***的四种区域之间采用指针进行索引。其优点在于使用哈希查找避免对目录索引域的遍历,使用目录项中的片单元索引首指针避免对片单元索引域的遍历。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。