首页> 中国专利> 在嵌入式系统中实现文件系统的方法

在嵌入式系统中实现文件系统的方法

摘要

一种在嵌入式系统中实现文件系统的方法,其包括步骤:建立由若干个用于分别描述每个文件信息的文件信息结构构成文件信息区和用于存储文件的文件数据区组成的文件系统;初始化文件系统;通过日志的方法来建立和维护文件信息区,每次对文件进行写操作时,在将文件写入到文件数据区后,再将文件信息的记录更新至文件信息区信息。本发明实现了一个可根据需要配置修改需存储文件个数和总容量;具备断电保护功能,对操作系统依赖性小便于移植,对文件读写操作效率高,并且代码小占用资源少的文件系统。

著录项

  • 公开/公告号CN102103596A

    专利类型发明专利

  • 公开/公告日2011-06-22

    原文格式PDF

  • 申请/专利权人 康佳集团股份有限公司;

    申请/专利号CN200910188992.4

  • 发明设计人 彭文剑;

    申请日2009-12-18

  • 分类号G06F17/30(20060101);

  • 代理机构44247 深圳市康弘知识产权代理有限公司;

  • 代理人胡朝阳;孙洁敏

  • 地址 518055 广东省深圳市南山区深南大道9008号

  • 入库时间 2023-12-18 02:47:37

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-07-17

    专利权的转移 IPC(主分类):G06F17/30 登记生效日:20200630 变更前: 变更后: 申请日:20091218

    专利申请权、专利权的转移

  • 2014-10-29

    授权

    授权

  • 2012-12-26

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20091218

    实质审查的生效

  • 2011-06-22

    公开

    公开

说明书

技术领域

本发明涉及文件操作方法,尤其是涉及一种在嵌入式系统中实现文件系统的方法。

背景技术

在已有的嵌入式文件系统技术中,大部分是FAT或Ext2fs文件系统,由于FAT和Ext2fs等文件系统是以IDE只支持像IDE那样的块设备,不但代码比较庞大,而且没有考虑设备擦写时序和时间要求,没有掉电保护。

而对于专用于嵌入式系统的JFFS2文件系统。除了本身比较复杂外,它主要设计应用于Linux操作系统,对Linux操作系统的运行机制依赖性比较大,因而难以移植;它是一种基于日志型的文件系统,导致了启动速度比较慢。另外JFFS2对损耗平衡是用概率的方法来解决的,这很难保证损耗平衡的确定性,在一定程度上造成了对擦写块不必要的擦写操作。

因此,目前嵌入式系统的这些文件系统过于强调通用性,而忽略了嵌入式系统对文件系统的特殊要求。在嵌入式系统中,一般要存储的文件个数不多;数据总容量不大;安全性要求比较高,要能断电保护;代码对操作系统依赖性要小,以便于移值;文件系统本身代码要简单,以节省系统资源。

发明内容

本发明提出一种在嵌入式系统中实现文件系统的方法,实现了一个可根据需要配置修改需存储文件个数和总容量,具备断电保护功能,对操作系统依赖性小便于移植,而且本身代码简单的文件系统。

本发明采用了如下技术方案来实现:一种在嵌入式系统中实现文件系统的方法,其包括步骤:

建立由若干个用于分别描述每个文件信息的文件信息结构构成文件信息区和用于存储文件的文件数据区组成的文件系统;

初始化文件系统;

通过日志的方法来建立和维护文件信息区,每次对文件进行写操作时,在将文件写入到文件数据区后,再将文件信息的记录更新至文件信息区信息。

其中,文件信息结构包括:文件长度信息、文件所占用的基本存储单位的个数、文件所占用的基本存储单元的位置信息数组。

其中,文件信息区的结构包括:日志版本号、文件信息结构数组、文件信息结构数组的校验信息、更新标识。

其中,文件系统初始化包括步骤:

获得并记录用于文件系统中文件数据区及存储器中各个区块的序号和存储容量大小的信息;

以基本存储单元获得各个区块中存储单元的状态信息建立存储单元状态数组;

获得并记录用于文件系统中文件信息区总容量、以及各个区块的序号和大小,把文件信息区按文件信息区结构为基本单位构成文件系统数据库单元数组;

遍历文件系统数据库单元数组,搜索日志版本号最大的数据库单元索引,维护该文件系统数据库单元数组中序号等于前述日志版本号最大的数据库单元索引值的数组元素所指向的文件信息区信息。

另外,对文件进行写操作的步骤包括:

判断进行写操作的数据存储单元的总容量是否大于待写入的数据长度,若是,则转入下一步骤,否则,擦除所有无效的基本数据存储单元使进行写操作的数据存储单元的总容量大于待写入的数据长度;

找到可进行写操作的数据存储单元对应的位置信息,顺序写入数据到存储单元;

在文件信息区更新文件信息。

与现有技术相比,本发明具有如下有益效果:

本发明提出了一种简单易于操作的文件系统实现方法,实现了一个可根据需要配置修改需存储文件个数和总容量;具备断电保护功能,对操作系统依赖性小便于移植,对文件读写操作效率高,并且代码小占用资源少的文件系统。

附图说明

图1是初始化文件系统的流程示意图;

图2是对文件系统写操作的流程示意图。

具体实施方式

本发明提出了一种简单易于操作的文件系统实现方法,实现了一个可根据需要配置修改需存储文件个数和总容量;具备断电保护功能,对操作系统依赖性小便于移植,对文件读写操作效率高,并且代码小占用资源少的文件系统。

本发明提出的文件系统配置如下:

1、根据具体需求确定文件系统能存储的最多文件个数FILE_NUM,及文件系统能存储的数据总容量大小MAX_SIZE。

2、根据具体需求确定文件系统的基本存储单元的容量UNIT_SIZE,一般可以为2K、4K等。如果MAX_SIZE大而FILE_NUM小,那么UNIT_SIZE可以设大点如为8K,16K等;如果MAX_SIZE小而FILE_NUM大,那么UNIT_SIZE可以设小些,如设为1K等。

3、本发明提出的文件系统由两部分组成:文件信息区和文件数据区。由个数是FILE_NUM的描述文件信息的结构构成了文件信息区,其中文件信息的结构及各成员含义如下表1所示:

  成员名  含义和作用  status  该文件结构信息是否使用标识

  File_len  文件长度  Unit_num  文件所占用的基本存储单位的个数,等于File_len/UNIT_SIZE  Unit_mask[]  文件所占用的基本存储单元的位置信息数组;其数组长度为文件最大长度/(UNIT_SIZE*8)。每一比特位置1,表示该比特所在序号的基本存储单元中存有该文件内容片段。

表1:文件信息结构(file_unit)成员表

说明:假使unit_mask[2]=0x050x07,二进制表示为0000010100000111,在第6、8、14、15和16比特位为1,则说明在第6、8、14、15和16序号的基本存储单元上有该文件数据片段,片段的先后顺序和比特位顺序一致。

用FilesysDB来描述文件信息区结构,其成员及含义如下表2:

 成员名  含义和作用 status  文件信息区的使用标识 act_ver  日志版本号 crc  文件信息结构数组的校验信息 File_unit[]  文件信息结构数组,数组大小按需要设定 wstatus  更新成功标识

表2:文件信息区(FilesysDB)成员表

从上可以看出,N个基本存储单元构成了文件数据区;显然N=MAX_SIZE/UNIT_SIZE。用比特来充分表示数据片段的有无和序号信息,如果UNIT_SIZE=4K,那么用256个字节就可以表示8M(256*8*4K)长度文件的全部存储位置信息,使得一个文件信息的结构很小(只有256+12)。这样可以存储8个文件的文件信息区只占用了8*268+24个字节。

4、确定用于文件系统的存储器(一般为FLASH)各个区块(Block)的序号。这些Block可以不连续。假定每个Block的容量都为FB_SIZE,那么文件信息区需要1个或2个Block(使用2个可以更好地实现断电保护),文件数据区需要不少于MAX_SIZE/FB_SIZE个Block。

通过日志的方法来建立和维护文件信息区,每次写文件时在正确写入到文件数据区后,再记录更新最后的文件信息区信息。

如图1所示,文件系统初始化包括如下步骤:

步骤S11:获得并记录用于文件系统中文件数据区及各个Block的序号和存储容量大小的信息。

步骤S12:以基本存储单元容量UNIT_SIZE为单位获得各个Block中存储单元的状态信息建立存储单元状态数组UNIT_MAP[]。

步骤S13:获得并记录用于文件系统中文件信息区总容量FINFO_SIZE,以及各个Blcok序号和大小,把文件信息区按FilesysDB为基本单位构成文件系统数据库单元数组FSDB[M]。

步骤S14:遍历数组FSDB[M],找到status和wstatus都正确且act_ver最大的数据库单元索引FDBIndex。

步骤S15:若步骤S14操作失败,则擦除文件信息区所用Block和文件数据区所用Block,设置FDBIndex=0,初始化文件信息区FSDB[FDBIndex]存储FSDB[0]到FLASH中。

步骤S16:若步骤S14操作成功,则将获得的FSDB[FDBIndex]设为当前使用的文件信息区FilesysDB。

如图2所示,对文件系统进行写操作包括如下步骤:

步骤S210:获得些文件传入参数文件序号、数据指针data和数据长度d_len;根据需要对数据进行压缩,并获得新的数据指针data和数据长度d_len。

步骤S220:根据UNIT_MAP[]获得可直接写操作的数据存储单元个数以及总容量Wsize,判断Wsize是否大于数据长度d_len。若是,则转入步骤S270,否则转入步骤S230。

步骤S230:根据UNIT_MAP[]和当前FilesysDB信息,擦除所有无效的基本数据存储单元,并更新UNIT_MAP[]。

步骤S240:根据UNIT_MAP[]获得可直接写操作的数据存储单元个数以及总容量Wsize,判断Wsize是否大于数据长度d_len。若是,则转入步骤S270,否则转入步骤S250。

步骤S250:获得该序号文件已经占用的存储空间wed_size,判断wed_size+Wsize是否大于d_len,若是,转入步骤S260,否则提示存储空间不够的错误。

步骤S260:擦除该文件已经使用的数据存储单元,并更新UNIT_MAP[]。

步骤S270:按先后顺序从头到尾遍历UNIT_MAP[],找到可用的存储单元对应的位置信息,顺序写入数据到存储单元。

步骤S280:记录信息到FilersysDB中相应序号文件的文件信息结构中,并对FilesysDB的act_ver加1。

步骤S290:找到FilersysDB下一个存储单元位置FSDB[index],并更新写入文件信息区。

另外,读文件操作时,在当前FilesysDB中找到所需读文件的文件索引号进而获得该文件信息结构,然后根据File_len和Unit_mask[]等成员信息,找到在哪些索引的基本存储单元有该文件数据,结合unit_map信息按先后顺序读出各片段数据,再按实际需要进行解密获得该文件的原始数据返回给读函数调用者。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号