一种基于NANDFLASH的高可靠线性文件系统.pdf

上传人:b*** 文档编号:6190213 上传时间:2019-05-18 格式:PDF 页数:24 大小:3.02MB
返回 下载 相关 举报
摘要
申请专利号:

CN201310541079.4

申请日:

2013.11.05

公开号:

CN103577574A

公开日:

2014.02.12

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 17/30申请日:20131105|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

中船重工(武汉)凌久电子有限责任公司

发明人:

袁松; 何冲; 毛先俊

地址:

430074 湖北省武汉市洪山区珞喻路718号

优先权:

专利代理机构:

湖北武汉永嘉专利代理有限公司 42102

代理人:

唐万荣

PDF下载: PDF下载
内容摘要

本发明公开了一种基于nand flash的高可靠线性文件系统,nand flash包括sdram存储器,nvram非易失存储器和nand flash存储阵列;该文件系统包括硬件抽象层和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接口实现对文件的操作,所述软件层包括分区表初始化模块、文件管理模块和文件存取模块。本发明实现了对基于nand flash的设备的文件管理,具有可移植性高、效率高、以文件方式实现数据存取、自动循环记录、断电保护文件等特点。

权利要求书

权利要求书
1.  一种基于nand flash的高可靠线性文件系统,其特征在于,所述文件系统包括硬件抽象层和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接口实现对文件的操作,所述软件层包括:
分区表初始化模块,用于对分区表进行初始化;
文件信息初始化模块,用于初始化文件的始末地址、打开方式、文件名和文件大小信息;
文件管理模块,用于对文件进行管理;
所述文件管理模块包括:
文件创建子模块,用于完成创建新文件;
文件存取模块,用于控制文件的读取与写入操作;
所述文件存取模块包括:
文件写入子模块,用于按采用顺序地址方式将数据从sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域;
文件循环写入子模块,用于分区空间满时,自动删除最旧文件并写入新文件;
文件实时写入子模块,用于将数据写入分区前先缓冲至nvram非易失存储器中;
文件读取子模块,用于将数据从分区读取到sdram存储器中,然后从sdram存储器中取走。

2.  根据权利要求1所述的文件系统,其特征在于,所述文件创建子模块包括:
文件名非法纠正模块,用于进行文件名非法自处纠正;
同名文件判断模块,用于判断是否存在同名文件;
“自动追加”模式判断模块,用于判断是否“自动追加”模式,如果是则对文件名自动追加后缀序号;
文件个数判断模块,用于判断是否文件个数已满;
循环模式判断模块,用于需要判断是否是循环模式,如果是循环模式,则删除最老的文件;
文件信息创建模块,用于在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表。

3.  根据权利要求1所述的文件系统,其特征在于,所述分区表初始化模块包括:
芯片硬件初始化子模块,用于通过初始化获得芯片的属性信息,并防止对芯片进行 异常访问;
坏块信息扫描子模块,用于识别nand芯片的所有坏块;
好块/坏块替换表,用于建立坏块到好块的物理位置的映射关系;
文件分区划分子模块,用于按照分区时的参数进行分区大小划分。

4.  根据权利要求1所述的文件系统,其特征在于,所述文件管理模块还包括:
掉电文件处理子模块,用于恢复由于异常掉电丢失的文件:在写入文件时,同时将文件的日志记录到nand flash的一片nvram存储器中在写入文件时若掉电,当重新上电时,读取nvram存储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地址,查询到最后写入的数据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand的某分区中。

5.  根据权利要求1所述的文件系统,其特征在于,所述文件管理模块还包括:
文件删除子模块,用于将文件从分区表中删除,释放存储空间;
坏块替换子模块,用于在文件写入时根据好块/坏块替换表替换无效数据块。

6.  根据权利要求1所述的文件系统,其特征在于,所述文件系统还包括文件远程操控模块和人机界面;所述文件远程操控模块用于与远程PC机进行通讯,实现远程PC机对文件系统的控制。

7.  根据权利要求3所述的文件系统,其特征在于,所述分区表初始化模块还包括分区备份子模块,用于文件系统分区表同时存储在从nand flash存储阵列开始的128block中查找的3个好块中作为3个备份。

说明书

说明书一种基于nand flash的高可靠线性文件系统
技术领域
本发明涉及计算机存储领域,尤其涉及一种基于nand flash的高可靠线性文件系统。
背景技术
nand flash是一种大容量的存储芯片,其特点是容量密度大,制造成本低,访问速度快,通常作为U盘、固态盘、存储卡等设备上的存储芯片,但其也存在一些不足:它属于地址、数据共用类型访问方式,访问相对麻烦,它由于本身出厂是就存在坏块,需要“跳过”坏块进行访问,需要专门的管理方法进行块的管理。目前对数据的管理主要分以下两种方式:
(1)无文件系统方式访问,使用者需调用函数对存储单元进行直接操作,实现难度低,但使用难度高;
(2)文件系统方式访问,使用者以文件的方式对存储系统进行访问,实现难度高,但使用难度低。
文件系统的优点在于不需要使用者关注数据的存放位置,文件系统来管理数据,屏蔽了物理介质的不同。由于文件系统对使用者实现数据管理的透明,完全接管数据的存储,一旦文件系统崩溃会导致数据丢失,所以对文件系统的可靠性要求较高,能经受长时间的考验。
本发明涉及一种基于nand flash的高可靠线性文件系统的软件。用于由nand flash组成的存储阵列中实现以文件的方式进行访问管理。本文件系统与windows上使用的文件系统不同,windows等操作系统上使用的文件系统属于“基于页表结构”形式,而本文件系统属于线性文件系统。所谓“线性文件系统”是指数据记录在顺序的地址单元中,而常见的文件系统都是“基于页表结构”形式,即数据记录在不连续的地址单元中,各地址单元通过一个链表相连接。线性文件系统的特点是管理简单,记录效率高,而常见页表形式的文件系统管理页表较复杂,无掉电保护特性,效率稍低。本发明非常适合于需要一种高可靠性、高效率、方便使用的记录设备的环境下。
发明内容
本发明要解决的技术问题在于针对上述现有技术中的缺陷,提供一种基于nand flash的高可靠线性文件系统及线性文件存取方法。
本发明解决其技术问题所采用的技术方案是:
本发明提供了一种基于nand flash的高可靠线性文件系统,所述文件系统包括硬件抽象层 和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接口实现对文件的操作,所述软件层包括:
分区表初始化模块,用于对分区表进行初始化;
文件信息初始化模块,用于初始化文件的始末地址、打开方式、文件名和文件大小信息;
文件管理模块,用于对文件进行管理;
所述文件管理模块包括:
文件创建子模块,用于完成创建新文件;
文件存取模块,用于控制文件的读取与写入操作;
所述文件存取模块包括:
文件写入子模块,用于按采用顺序地址方式将数据从sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域;
文件循环写入子模块,用于分区空间满时,自动删除最旧文件并写入新文件;
文件实时写入子模块,用于将数据写入分区前先缓冲至nvram非易失存储器中;
文件读取子模块,用于将数据从分区读取到sdram存储器中,然后从sdram存储器中取走。
按上述方案,所述文件创建子模块包括:
文件名非法纠正模块,用于进行文件名非法自处纠正;
同名文件判断模块,用于判断是否存在同名文件;
“自动追加”模式判断模块,用于判断是否“自动追加”模式,如果是则对文件名自动追加后缀序号;
文件个数判断模块,用于判断是否文件个数已满;
循环模式判断模块,用于需要判断是否是循环模式,如果是循环模式,则删除最老的文件;
文件信息创建模块,用于在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表。
按上述方案,所述分区表初始化模块包括:
芯片硬件初始化子模块,用于通过初始化获得芯片的属性信息,并防止对芯片进行异常访问;
坏块信息扫描子模块,用于识别nand芯片的所有坏块;
好块/坏块替换表,用于建立坏块到好块的物理位置的映射关系;
文件分区划分子模块,用于按照分区时的参数进行分区大小划分。
按上述方案,所述文件管理模块还包括:
掉电文件处理子模块,用于恢复由于异常掉电丢失的文件:在写入文件时,同时将文件的日志记录到nand flash的一片nvram存储器中在写入文件时若掉电,当重新上电时,读取nvram存储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地址,查询到最后写入的数据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand的某分区中。
按上述方案,所述文件管理模块还包括:
文件删除子模块,用于将文件从分区表中删除,释放存储空间;
坏块替换子模块,用于在文件写入时根据好块/坏块替换表替换无效数据块。
按上述方案,所述文件系统还包括文件远程操控模块和人机界面;所述文件远程操控模块用于与远程PC机进行通讯,实现远程PC机对文件系统的控制。
按上述方案,所述分区表初始化模块还包括分区备份子模块,用于文件系统分区表同时存储在从nand flash存储阵列开始的128block中查找的3个好块中作为3个备份。
本发明产生的有益效果是:
1、传统文件系统基本都是运行在操作系统上调用相应的驱动实现,而在某些嵌入式应用领域,没有操作系统的支持,对大容量nand flash阵列的数据访问还停留在对底层芯片IO方式;本发明对大容量nand flash阵列提供一种无需操作系统的文件形式访问,适用于需要一种高可靠性、高效率、方便使用的嵌入式系统中;
2、文件在nand flash中的记录采用顺序地址方式记录,以并行流水方式操作,提升数据访问速度;
3、文件分区表记录在nand flash中,并且分区表多备份,防止文件分区表损坏时无法修复;
4、对重名文件有自动添加后缀功能、可连续读取自动添加后缀的文件;
5、分区数据满后,实现循环记录功能;
6、实现实时记录功能;
7、具有断电保护功能,任意时刻掉电保证文件不丢失,文件系统不崩溃。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1是本发明实施例的文件系统工作的原理框图;
图2是本发明实施例的文件系统的功能模块图;
图3是本发明实施例的文件循环写入子模块的工作流程图;
图4是本发明实施例的文件系统的分层结构图;
图5是本发明实施例的典型多片并行的硬件设计结构图;
图6是本发明实施例的软件层结构组成图;
图7是本发明实施例的文件创建子模块的工作流程图;
图8是本发明实施例的异常掉电文件处理子模块的工作流程图;
图9是本发明实施例的分区表与文件关系图;
图10是本发明实施例的分区表框图;
图11是本发明实施例的某分区的详细描述;
图12是本发明实施例的坏块记录表;
图13是本发明实施例的文件系统整体描述信息表;
图14是本发明实施例的文件分区表多备份方法;
图15是本发明实施例的分区表更新方法。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
图1为本发明的nand flash文件系统工作的原理框图。图1中,CPU处理器1连接数据总线6与数据接口7,CPU处理器1在FS(file-system)文件系统2的调度下,负责将数据从数据接口7搬移至nand flash存储阵列5或将数据从nand flash存储阵列5搬移至数据接口7。SDRAM存储器3用于CPU处理器1的数据缓冲,NVRAM非易失存储器4用于记录CPU处理器1搬移数据至nand flash存储阵列5过程中的“步骤记录”,“步骤记录”是指数据被搬移至哪里、是否记录完成、以及部分缓冲数据等信息,以便保证数据记录的“线索”不丢失。系统掉电重新上电后,CPU处理器1根据NVRAM非易失存储器4中记录的“线索”获取掉电之前的记录状态,根据“线索”将缓冲数据写入文件、关闭未正常关闭的文件等操作。
如图4所示:本文件系统分为硬件抽象层和软件层两层。硬件抽象层主要实现对硬件IO的访问,包括基本的写保护、复位、单元读写、页读写、块擦除等基本函数。软件层访问硬件抽象层的接口,实现对文件系统的创建、文件的管理、文件的存取、自动循环记录、断电保护文件、分区信息多备份、自动坏块替换等功能。
具体如下:
一种基于nand flash的高可靠线性文件系统,本实施例采用的nand flash包括sdram存储器,nvram非易失存储器和nand flash存储阵列;该文件系统包括硬件抽象层和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接口实现对文件的操作;软件层结构组成如图6所示,所述软件层包括分区表初始化模块、文件管理模块和文件存取模块;
分区表初始化模块,用于对分区表进行初始化;所述分区表初始化模块包括:芯片硬件初始化子模块,用于通过初始化获得芯片的属性信息,并防止对芯片进行异常访问;
芯片硬件初始化子模块的工作步骤为:向nand flash发出读ID的命令,将读取到的nand flashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯片的特性信息:包括有多少个block,每block的page数等,否则停止后续操作,防止对芯片进行异常访问。
坏块信息扫描子模块,用于识别nand芯片的所有坏块;
坏块信息扫描子模块的工作步骤为:读取nand芯片的每个block的前2个page的spare区,若该spare区的信息不为0xff,则该block为坏块;扫描nand芯片的每一个block,直至识别出所有的坏块,即完成坏块信息的扫描。
好块/坏块替换表,用于建立坏块到好块的物理位置的映射关系;具体如下:建立一张坏块,即无效块到保留区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置。保留区设置在nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换。在运行中发现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器加1。
文件分区划分子模块,用于按照分区时的参数进行分区划分;
分区大小是分区时的参数指定的,与硬盘重分区时对硬盘的划分方法一致:找到一段连续的空间,标记其起始地址、大小等信息。每个分区的数据都只能在该分区中存在,不能进入其他分区。
文件信息初始化模块,用于初始化文件的始末地址、打开方式、文件名和文件大小信息;
初始化每个文件的始末地址、打开方式、文件名、文件大小等信息为默认值。本文件系统的文件个数是有限的,每分区为100个文件,都存于分区表中。文件信息包括始末地址、打开方式、文件名、文件大小等信息。文件信息的结构如下所示。

缓冲初始化:初始化文件的读写所用到的sdram指针,每个分区都有一段sdram作为该分区的数据缓冲。当写入数据时,首先将数据写入至sdram中,当数据达到一个page时,将数据写入nand中,效率达到最高。当读取数据时,首先将数据读取到sdram中,然后从sdram中取走,当数据不在当前缓冲中时,则重新从分区中读取数据至sdram中。
文件管理模块,用于对文件进行管理;所述文件管理模块包括
文件创建子模块,用于创建新文件;本发明实现的文件的创建指以fopen函数为接口的 函数调用,实现在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针。
文件创建子模块包括:
文件名非法纠正模块,用于进行文件名非法自处纠正;
同名文件判断模块,用于判断是否存在同名文件;
“自动追加”模式判断模块,用于判断是否“自动追加”模式,如果是则对文件名自动追加后缀序号;
文件个数判断模块,用于判断是否文件个数已满;
循环模式判断模块,用于需要判断是否是循环模式,如果是循环模式,则删除最老的文件;
文件信息创建模块,用于在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表。
文件创建流程图如图7所示。文件创建子模块的工作步骤是:
1.进行文件名非法自处纠正;
因为本系统中文件名只能是字符或数字,不允许超过20字符,故需要对文件名进行合法性检测,去除非法字符;
2.判断是否存在同名文件,如果不存在同名文件,转入步骤6,否则转入步骤3;
3.判断是否“自动追加”模式,如果是转入步骤4,否则创建失败;
4.判断是否文件个数已满,如果已满,则转入步骤6,否则转入步骤5;
5.创建添加“后缀序号”的文件;
6.需要判断是否是循环模式(可删除文件),如果是循环模式,则删除最老的文件;
7.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表;
8.创建完成。
文件删除子模块,用于将文件从分区表中删除,释放存储空间;
文件的删除实际上只是将文件从分区表中删除,释放出所占用的空间,而不对用过的空间进行擦出。由于nand芯片的特性是在编程前需要对存储单元进行擦除,使所有的存储单元都变为1,存储过程只能把1变成0,无法把0编程1。在嵌入式系统中,对系统的实时性要求较高,需要随时相应读写指令。而擦除1个block动作需要若干毫秒,擦除某个文件所占用的区域需要更多的时间,这在实时系统中是不允许的。本发明针对这种状况采取的方法分 两种,第一种是在写入数据前,需要对nand芯片组成的阵列进行格式化(擦除)操作;第二种是在循环写入方式下,即需要删除并覆盖以前的文件,采取的测量是“擦一块、写一块”的方法,破整为零,以提供系统的实时性。
掉电文件处理子模块,用于恢复由于异常掉电丢失的文件;
本文件系统的高可靠性主要表现在系统的防掉电设计,即任意时刻掉电保证文件不丢失,数据损失最少,文件系统不崩溃。完成异常掉电文件的处理需要在写入文件时,同时记录文件的日志到一片nvram存储器中。nvram存储器掉电后数据能保存,下次再上电后仍可读取日志数据,通过读取该部分数据即可追朔至掉电前数据记录至何处,从而保证数据丢失最少(保证只要数据被记录到物理存储器中即可被找到)。在本发明的实时记录模式下,数据缓冲为非易失的nvram存储器,掉电后该部分缓冲的数据也不会丢失,重新上电后该部分数据可以被识别,并记录到nand阵列的文件中,可以保证数据不会发生任何字节丢失。
如图8所示,若写入文件时掉电,重新上电后,本文件系统进入以下处理流程:
从nvram存储器读取日志数据,判断日志是否正常(校验码是否正确),若正常则进入步骤2,否则进入灾难恢复流程(通过扫描文件系统的特殊区域实现恢复),如果恢复成功,则进入步骤2,否则重新生成一个日志记录(可能造成部分数据丢失);
删除被标记需要删除的文件,删除完成进入步骤3。为了保证文件访问的实时性,文件的删除工作在文件记录阶段是不运行的,否则会造成一定时间(2ms)内文件系统不响应命令,影响系统的实时性。在循环写入模式下,需要自动删除“最旧”的文件,但删除动作只是在nvram日志中做标记,等下次上电初始化时再删除;
找到断电未关闭的文件,并找到文件断电时的“断点”,进入步骤4;
判断是否实时写入,如果是则进入步骤5,否则进入步骤6;
读取在nvram中缓冲的数据,写入到nand阵列中。因为实时模式下,nvram是作为缓存的,掉电后缓存的数据仍然可用,需要将数据写入到nand阵列中,为了尽量不丢失数据;
处理文件末尾字段,记录文件末尾的地址,写入文件系统分区表中;
计算文件大小、总使用大小、下个可用空间等信息;
更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的三个备份;
更新nvram中的日志信息。
在本文件系统所使用的nvram存储器中保存着当前正在操作的文件的状态信息,数据结 构如下:

其中FR_DATA_TYPE是并行访问nand flash的位宽,在实际系统中,位宽可为uchar8,uint16,ulong32或ulonglong64。
当写入文件时,nvram会记录当前访问的位置信息,即断点信息,当系统掉电后,通过读取该断点信息,可知道最近一次访问的位置,继而对断电的文件继续进行操作。PartitionInNvStruct是nvram中记录的某一个分区正在使用的情况,包括:当前访问的单元(raidpage)、单元内的偏移位置、当前访问的文件序号、是否进入循环的标志等信息。
由于nvram记录的数据是非常重要的数据,它的正确性要求非常高。本文件系统为nvram设计了ecc校验机制与多备份机制。Ecc校验可纠1bit错;多备份可弥补ecc无法纠正的情况,从设计角度可将nvram出现错误的概率降至最低。
坏块替换子模块,用于根据好块/坏块替换表替换无效数据块;
坏块记录表的结构如图12所示,坏块记录表BadTable记录了坏块的位置,坏块替换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文件系统保留的处于nand flash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生的坏块。替换表SubstiTable保留了总有效块的3%的区域作为替换块。当写入过程中出现记录错误、擦除、读出校验等错误,需要进行块替换时,操作步骤如下:
首先将数据从坏块拷贝出,并进行校验修正,存入sdram存储器;
从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
标记新产生的坏块b,并放入BadTable表中;
建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是坏块,需要通过访问块b获取正确的数据;
保存新的分区表。
文件存取模块,用于控制文件的读取与写入操作;
文件写入子模块,用于将数据从sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域;写入的文件在分区中顺序存放;每个分区同一时间只有一个文件在进行写操作;
文件写入的编址方式设计:
nand flash的编址采用块(block)、页(page)、单元(col)三种组合的编址方式;
由于page编程速度最快,本文件系统采用以page为基本单元进行访问。假设每个block有M个page组成,以下是对nand flash中的某个单元进行读、写、擦除操作的步骤。
当需要读取第i个block的第j个page的第k个col单元内的数据,其访问地址为第(i*M+j)个page,并将该page读取到缓冲区中,然后从缓冲区中读取第k个数据。
当需要将数据写入第i个block的第j个page的第k个col单元内时,如果是调用单col写入函数,即只写1个数据,则数据会直接写入;如果希望写入一批数据,则会首先将数据写入缓冲区,当缓冲区达到1个page的长度后,调用page写入函数,将数据写入第(i*M+j)个page。
数据的存储采用连续存储方式,即以页(page)为基本访问单元,在一个分区内部,按照页的地址顺序进行访问。
文件循环写入子模块,用于分区空间满时,自动删除最旧文件并写入新文件;
本文件系统设计了循环写入功能,文件循环写入子模块在分区空间满时,会自动删除掉最旧的文件。但在要求实时性非常高的应用中,删除文件时如果擦除文件所占的空间会造成较长时间无法记录数据。解决该问题的方法是删除文件时,只是将它从分区表中删除,在数据记录到删除的文件所占的空间时再进行擦除,即“边写边擦”。循环写入从原理上看很简单,但由于nand存储器的特性,擦除是非常耗费时间的,即使是删除文件这种简单操作,也需要花费若干毫秒(ms)的时间,这对实时系统是不能允许的。本文件系统使用了一种方法,在非易失存储器(nvram)中记录着需要更新的分区表的简要信息(类似索引信息)以及需要被删除的文件索引号,当系统不繁忙时或重新初始化时,根据nvram中记录的简要信息,完成 分区表的更新、文件的删除,从而不影响系统的实时性,保持数据吞吐的稳定性。
文件循环写入子模块的工作流程图如图3,工作步骤为:
创建文件,步骤流程为“文件创建子模块”工作流程;
判断写入模式(文件创建时由输入参数确定写入模式),如果是实时写入模式,则修改缓冲区指针,指向nvram区,写入的数据可保证不丢失;如果是普通模式,则将缓冲区指针指向sdram。由于sdram访问速度快,容量大,适合批量数据的存储,nvram容量小,速度稍慢,可保证数据不丢失;
判断nand阵列中是否有空间可写入。如果没有空间可写入,在进入步骤4;
判断是否是循环写入模式,如果不是循环写入模式,则直接返回,丢弃数据;如果是循环模式,则对最旧的文件进行删除,腾出空间,继续写入,进入步骤5;
判断缓冲区是否已满,如果已满则将缓冲区数据写入nand阵列,并释放缓冲区;如果未满直接将数据写入缓冲区;
更新文件指针、更新将断点日志记录,存入nvram存储器。
文件实时写入子模块,用于将数据写入分区前先缓冲至nvram非易失存储器中,实时将数据写入分区中;
文件的实时写入子模块与普通缓冲式写入的区别在于记录数据的缓冲不同,并且掉电后的处理方法不同。由于nand flash不同于普通的随机存储器(SRAM),对nand flash的基本存储单元page的访问是有次数限制的,一般厂家规定擦除page后,对page内最多进行4次写入操作。对于比较重要的数据,一般不希望数据有任何的丢失发生,希望数据随时被记录到存储器中,然而又有“对page内最多进行4次写入操作”的限制,不可能随时写入,这两者就存在了矛盾。解决矛盾的方法就是采用缓存,而普通的随机存储器SRAM做缓存掉电后数据就会丢失,本文件系统采用了nvram缓存数据的方式,并随时做好断点保护,以便断电后能将数据的损失降至最低。文件的缓冲存于非易失的nvram存储器中,当掉电重新上电时,初始化函数根据未关闭的文件“日志”记录,可以查询到最后写入的数据的内容,将未写入至nand存储器的数据重新写入到nand的某分区中。
文件实时写入子模块的工作步骤为:
1、将数据写入分区前先缓冲至nvram非易失存储器中,并随时做好断点保护;
2、将数据写入分区中;
3、若掉电,当重新上电时,根据未关闭的文件“日志”记录,可以查询到最后写入的数 据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand的某分区中。
文件读取子模块,用于将数据从分区读取到sdram存储器中,然后从sdram存储器中取走。
进一步的,文件管理模块还可以加入重名文件处理子模块,用于在同一分区中创建同名文件的处理。
本文件系统还设计了文件名自动追加功能。在常见的文件系统中,在一个目录下创建同名的文件是不被允许的,而本系统中可以允许创建同名文件,其处理方法是在文件名后自动加上如“_1”、“_2”、“_3”等后缀。在嵌入式系统中,通常程序软件是固化在FLASH中,程序软件一般不会经常改动,而在嵌入式系统中能使用的资源十分有限,无法获得动态变化的文件名。针对嵌入式系统的特点,本文件系统设计了文件名自动追加功能。
当需要在一个分区内创建已经存在的文件时,首先扫描分区表中该分区的所有文件,找到该已经存在的文件,在该文件的FR_FILE结构的SameFileCnt字段加1,并用该序号为新创建的文件名改名,加上”_1”、“_2”的后缀,即可自动避免出现重名文件。同理,在读取文件时,如果希望读取加后缀的同名文件序列,则只需要以连续读取模式打开文件,即可读取后续的同名文件。假设在本文件系统中存在abc.dat、abc.dat_1、abc.dat_2、abc.dat_3、abc.dat_4等文件,用户以“fopen(“abc.dat”,”r.”)”函数调用(其中”r.”代表连续读取模式),读取abc.dat文件时使用连续读取文件模式,则在文件abc.dat读取后,会自动链接到abc.dat_1,依此类推可连续读取若干文件。这种读取方式下,固化好的用户代码不需要改动,即可每次重新上电创建一个新文件记录数据,读取数据时可选择读取某个文件或是连续读取所有的文件。
进一步的,本发明的文件系统还包括文件远程操控模块和人机界面;所述文件远程操控模块用于与远程PC机进行通讯,实现远程PC机对文件系统的控制。如图2所示。
进一步的,本发明采用的nand flash为多个nand flash组成的多片并行nand flash。
典型的多片并行的硬件设计原理框图如图5所示。通常nand flash是8bit位宽的存储器,而CPU处理器通常是16bit、32bit、64bit处理器,可以通过将多个nand flash拼在一起的方式,提高系统的性能。
本实施例的“分区表”设计:
文件系统以一个数据结构的形式存放在nand flash内部,记录着管理文件系统所需的所有数据,简称分区表。分区表分为三个部分:如图10所示;
1.包含指定分区的文件信息的数据结构PartitionDescription;
2.包含坏块信息以及替换查找表的BadTable;
3.记录其它分区整理信息的DiskDetail;
分区文件信息分2个部分,分区概况信息与每个文件信息。分区概况信息记录着分区的起始地址、分区大小、使用大小、结束标志、擦除标志、当前访问文件序号等信息。通过分区的概况信息,可获得以下信息:可在哪里创建新文件、上次写入的文件是否正常关闭等信息,以便进行创建新文件、掉电保护等操作。分区表与文件关系如图9所示。
文件信息的数据结构PartitionDescription包含了某个分区的全部文件的信息,包括该分区的始末地址,分区大小、文件个数、使用空间、未用空间、文件指针等信息,如图11。
坏块记录表的结构如图12所示,坏块记录表BadTable记录了坏块的位置,坏块替换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文件系统保留的处于nand flash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生的坏块。
文件系统整体描述信息表如图13所示,该信息表记录了存储区的大小、已使用大小、分区个数、总坏块个数、是否掉电、分区完整标志等信息。
如图14所示,文件分区表多备份方法如下:
分区表存储在从固态盘开始的128block中查找好的3块,作为3备份分区的存放。分区表的存放规则是3备份分开存放:0备份放置在0~39,1备份放置在40~79,2备份放置在80~127。0备份只能放在0~39,当出现某分区表异常时,根据出错情况判断是出现记录bit错误或是记录时断电,当出现记录bit错误时,标记为坏块并自动向后替换。在初始化找分区表时,根据备份区的坏块标记,找到分区表。根据找到的三个分区表的“新旧状况”找到最新、校验正确的分区表。
对于记录分区表的存储单元,每个分区表都有一段ECC校验值(每512字节生产1个ecc校验码),并与分区表存放在一起。分区表更新方法如图15所示,当出现ECC校验错误时,判断是否能纠正,若能纠正则使用该分区表,并将该block标记为坏块,以防出现不可纠正的错误。对于出现ECC校验错误时就标记为坏块的做法的原因,是考虑到本文件系统是使用在高可靠系统中,任何数据都可能是非常重要的。分区表更新方法如图15所示。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。

一种基于NANDFLASH的高可靠线性文件系统.pdf_第1页
第1页 / 共24页
一种基于NANDFLASH的高可靠线性文件系统.pdf_第2页
第2页 / 共24页
一种基于NANDFLASH的高可靠线性文件系统.pdf_第3页
第3页 / 共24页
点击查看更多>>
资源描述

《一种基于NANDFLASH的高可靠线性文件系统.pdf》由会员分享,可在线阅读,更多相关《一种基于NANDFLASH的高可靠线性文件系统.pdf(24页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103577574 A (43)申请公布日 2014.02.12 CN 103577574 A (21)申请号 201310541079.4 (22)申请日 2013.11.05 G06F 17/30(2006.01) (71)申请人 中船重工 (武汉) 凌久电子有限责任 公司 地址 430074 湖北省武汉市洪山区珞喻路 718 号 (72)发明人 袁松 何冲 毛先俊 (74)专利代理机构 湖北武汉永嘉专利代理有限 公司 42102 代理人 唐万荣 (54) 发明名称 一种基于nand flash的高可靠线性文件系统 (57) 摘要 本发明公开了一种基于 nand 。

2、flash 的高可 靠线性文件系统, nand flash包括sdram存储器, nvram 非易失存储器和 nand flash 存储阵列 ; 该 文件系统包括硬件抽象层和软件层, 所述硬件抽 象层用于实现对硬件 IO 的访问, 所述软件层通过 访问硬件抽象层的接口实现对文件的操作, 所述 软件层包括分区表初始化模块、 文件管理模块和 文件存取模块。本发明实现了对基于 nand flash 的设备的文件管理, 具有可移植性高、 效率高、 以 文件方式实现数据存取、 自动循环记录、 断电保护 文件等特点。 (51)Int.Cl. 权利要求书 2 页 说明书 11 页 附图 10 页 (19)中。

3、华人民共和国国家知识产权局 (12)发明专利申请 权利要求书2页 说明书11页 附图10页 (10)申请公布号 CN 103577574 A CN 103577574 A 1/2 页 2 1. 一种基于 nand flash 的高可靠线性文件系统, 其特征在于, 所述文件系统包括硬件 抽象层和软件层, 所述硬件抽象层用于实现对硬件 IO 的访问, 所述软件层通过访问硬件抽 象层的接口实现对文件的操作, 所述软件层包括 : 分区表初始化模块, 用于对分区表进行初始化 ; 文件信息初始化模块, 用于初始化文件的始末地址、 打开方式、 文件名和文件大小信 息 ; 文件管理模块, 用于对文件进行管理 。

4、; 所述文件管理模块包括 : 文件创建子模块, 用于完成创建新文件 ; 文件存取模块, 用于控制文件的读取与写入操作 ; 所述文件存取模块包括 : 文件写入子模块, 用于按采用顺序地址方式将数据从 sdram 存储器中的缓冲区搬移至 分区中文件指针指向的存储区域 ; 文件循环写入子模块, 用于分区空间满时, 自动删除最旧文件并写入新文件 ; 文件实时写入子模块, 用于将数据写入分区前先缓冲至 nvram 非易失存储器中 ; 文件读取子模块, 用于将数据从分区读取到sdram存储器中, 然后从sdram存储器中取 走。 2. 根据权利要求 1 所述的文件系统, 其特征在于, 所述文件创建子模块包。

5、括 : 文件名非法纠正模块, 用于进行文件名非法自处纠正 ; 同名文件判断模块, 用于判断是否存在同名文件 ; “自动追加” 模式判断模块, 用于判断是否 “自动追加” 模式, 如果是则对文件名自动追 加后缀序号 ; 文件个数判断模块, 用于判断是否文件个数已满 ; 循环模式判断模块, 用于需要判断是否是循环模式, 如果是循环模式, 则删除最老的文 件 ; 文件信息创建模块, 用于在分区表中找到一个位置, 创建文件信息, 并返回指向该位置 的文件指针, 并根据文件的大小更新分区表。 3. 根据权利要求 1 所述的文件系统, 其特征在于, 所述分区表初始化模块包括 : 芯片硬件初始化子模块, 用。

6、于通过初始化获得芯片的属性信息, 并防止对芯片进行异 常访问 ; 坏块信息扫描子模块, 用于识别 nand 芯片的所有坏块 ; 好块 / 坏块替换表, 用于建立坏块到好块的物理位置的映射关系 ; 文件分区划分子模块, 用于按照分区时的参数进行分区大小划分。 4. 根据权利要求 1 所述的文件系统, 其特征在于, 所述文件管理模块还包括 : 掉电文件处理子模块, 用于恢复由于异常掉电丢失的文件 : 在写入文件时, 同时将文件 的日志记录到 nand flash 的一片 nvram 存储器中在写入文件时若掉电, 当重新上电时, 读 取 nvram 存储器中的日志数据, 通过读取该部分数据追朔至掉电。

7、前数据记录物理地址, 查 询到最后写入的数据的内容, 将未写入至nand存储器的数据从nvram非易失存储器中重新 写入到 nand 的某分区中。 权 利 要 求 书 CN 103577574 A 2 2/2 页 3 5. 根据权利要求 1 所述的文件系统, 其特征在于, 所述文件管理模块还包括 : 文件删除子模块, 用于将文件从分区表中删除, 释放存储空间 ; 坏块替换子模块, 用于在文件写入时根据好块 / 坏块替换表替换无效数据块。 6. 根据权利要求 1 所述的文件系统, 其特征在于, 所述文件系统还包括文件远程操控 模块和人机界面 ; 所述文件远程操控模块用于与远程PC机进行通讯, 实。

8、现远程PC机对文件 系统的控制。 7. 根据权利要求 3 所述的文件系统, 其特征在于, 所述分区表初始化模块还包括分区 备份子模块, 用于文件系统分区表同时存储在从 nand flash 存储阵列开始的 128block 中 查找的 3 个好块中作为 3 个备份。 权 利 要 求 书 CN 103577574 A 3 1/11 页 4 一种基于 nand flash 的高可靠线性文件系统 技术领域 0001 本发明涉及计算机存储领域, 尤其涉及一种基于nand flash的高可靠线性文件系 统。 背景技术 0002 nand flash 是一种大容量的存储芯片, 其特点是容量密度大, 制造成。

9、本低, 访问 速度快, 通常作为 U 盘、 固态盘、 存储卡等设备上的存储芯片, 但其也存在一些不足 : 它属于 地址、 数据共用类型访问方式, 访问相对麻烦, 它由于本身出厂是就存在坏块, 需要 “跳过” 坏块进行访问, 需要专门的管理方法进行块的管理。目前对数据的管理主要分以下两种方 式 : 0003 (1) 无文件系统方式访问, 使用者需调用函数对存储单元进行直接操作, 实现难度 低, 但使用难度高 ; 0004 (2) 文件系统方式访问, 使用者以文件的方式对存储系统进行访问, 实现难度高, 但使用难度低。 0005 文件系统的优点在于不需要使用者关注数据的存放位置, 文件系统来管理数。

10、据, 屏蔽了物理介质的不同。由于文件系统对使用者实现数据管理的透明, 完全接管数据的存 储, 一旦文件系统崩溃会导致数据丢失, 所以对文件系统的可靠性要求较高, 能经受长时间 的考验。 0006 本发明涉及一种基于 nand flash 的高可靠线性文件系统的软件。用于由 nand flash 组成的存储阵列中实现以文件的方式进行访问管理。本文件系统与 windows 上使用 的文件系统不同, windows 等操作系统上使用的文件系统属于 “基于页表结构” 形式, 而本 文件系统属于线性文件系统。所谓 “线性文件系统” 是指数据记录在顺序的地址单元中, 而 常见的文件系统都是 “基于页表结构。

11、” 形式, 即数据记录在不连续的地址单元中, 各地址单 元通过一个链表相连接。 线性文件系统的特点是管理简单, 记录效率高, 而常见页表形式的 文件系统管理页表较复杂, 无掉电保护特性, 效率稍低。 本发明非常适合于需要一种高可靠 性、 高效率、 方便使用的记录设备的环境下。 发明内容 0007 本发明要解决的技术问题在于针对上述现有技术中的缺陷, 提供一种基于 nand flash 的高可靠线性文件系统及线性文件存取方法。 0008 本发明解决其技术问题所采用的技术方案是 : 0009 本发明提供了一种基于nand flash的高可靠线性文件系统, 所述文件系统包括硬 件抽象层和软件层, 所。

12、述硬件抽象层用于实现对硬件 IO 的访问, 所述软件层通过访问硬件 抽象层的接口实现对文件的操作, 所述软件层包括 : 0010 分区表初始化模块, 用于对分区表进行初始化 ; 0011 文件信息初始化模块, 用于初始化文件的始末地址、 打开方式、 文件名和文件大小 说 明 书 CN 103577574 A 4 2/11 页 5 信息 ; 0012 文件管理模块, 用于对文件进行管理 ; 0013 所述文件管理模块包括 : 0014 文件创建子模块, 用于完成创建新文件 ; 0015 文件存取模块, 用于控制文件的读取与写入操作 ; 0016 所述文件存取模块包括 : 0017 文件写入子模块。

13、, 用于按采用顺序地址方式将数据从 sdram 存储器中的缓冲区搬 移至分区中文件指针指向的存储区域 ; 0018 文件循环写入子模块, 用于分区空间满时, 自动删除最旧文件并写入新文件 ; 0019 文件实时写入子模块, 用于将数据写入分区前先缓冲至 nvram 非易失存储器中 ; 0020 文件读取子模块, 用于将数据从分区读取到sdram存储器中, 然后从sdram存储器 中取走。 0021 按上述方案, 所述文件创建子模块包括 : 0022 文件名非法纠正模块, 用于进行文件名非法自处纠正 ; 0023 同名文件判断模块, 用于判断是否存在同名文件 ; 0024 “自动追加” 模式判断。

14、模块, 用于判断是否 “自动追加” 模式, 如果是则对文件名自 动追加后缀序号 ; 0025 文件个数判断模块, 用于判断是否文件个数已满 ; 0026 循环模式判断模块, 用于需要判断是否是循环模式, 如果是循环模式, 则删除最老 的文件 ; 0027 文件信息创建模块, 用于在分区表中找到一个位置, 创建文件信息, 并返回指向该 位置的文件指针, 并根据文件的大小更新分区表。 0028 按上述方案, 所述分区表初始化模块包括 : 0029 芯片硬件初始化子模块, 用于通过初始化获得芯片的属性信息, 并防止对芯片进 行异常访问 ; 0030 坏块信息扫描子模块, 用于识别 nand 芯片的所。

15、有坏块 ; 0031 好块 / 坏块替换表, 用于建立坏块到好块的物理位置的映射关系 ; 0032 文件分区划分子模块, 用于按照分区时的参数进行分区大小划分。 0033 按上述方案, 所述文件管理模块还包括 : 0034 掉电文件处理子模块, 用于恢复由于异常掉电丢失的文件 : 在写入文件时, 同时将 文件的日志记录到 nand flash 的一片 nvram 存储器中在写入文件时若掉电, 当重新上电 时, 读取 nvram 存储器中的日志数据, 通过读取该部分数据追朔至掉电前数据记录物理地 址, 查询到最后写入的数据的内容, 将未写入至 nand 存储器的数据从 nvram 非易失存储器 。

16、中重新写入到 nand 的某分区中。 0035 按上述方案, 所述文件管理模块还包括 : 0036 文件删除子模块, 用于将文件从分区表中删除, 释放存储空间 ; 0037 坏块替换子模块, 用于在文件写入时根据好块 / 坏块替换表替换无效数据块。 0038 按上述方案, 所述文件系统还包括文件远程操控模块和人机界面 ; 所述文件远程 操控模块用于与远程 PC 机进行通讯, 实现远程 PC 机对文件系统的控制。 说 明 书 CN 103577574 A 5 3/11 页 6 0039 按上述方案, 所述分区表初始化模块还包括分区备份子模块, 用于文件系统分区 表同时存储在从nand flash。

17、存储阵列开始的128block中查找的3个好块中作为3个备份。 0040 本发明产生的有益效果是 : 0041 1、 传统文件系统基本都是运行在操作系统上调用相应的驱动实现, 而在某些嵌入 式应用领域, 没有操作系统的支持, 对大容量 nand flash 阵列的数据访问还停留在对底层 芯片IO方式 ; 本发明对大容量nand flash阵列提供一种无需操作系统的文件形式访问, 适 用于需要一种高可靠性、 高效率、 方便使用的嵌入式系统中 ; 0042 2、 文件在 nand flash 中的记录采用顺序地址方式记录, 以并行流水方式操作, 提 升数据访问速度 ; 0043 3、 文件分区表记。

18、录在 nand flash 中, 并且分区表多备份, 防止文件分区表损坏时 无法修复 ; 0044 4、 对重名文件有自动添加后缀功能、 可连续读取自动添加后缀的文件 ; 0045 5、 分区数据满后, 实现循环记录功能 ; 0046 6、 实现实时记录功能 ; 0047 7、 具有断电保护功能, 任意时刻掉电保证文件不丢失, 文件系统不崩溃。 附图说明 0048 下面将结合附图及实施例对本发明作进一步说明, 附图中 : 0049 图 1 是本发明实施例的文件系统工作的原理框图 ; 0050 图 2 是本发明实施例的文件系统的功能模块图 ; 0051 图 3 是本发明实施例的文件循环写入子模块。

19、的工作流程图 ; 0052 图 4 是本发明实施例的文件系统的分层结构图 ; 0053 图 5 是本发明实施例的典型多片并行的硬件设计结构图 ; 0054 图 6 是本发明实施例的软件层结构组成图 ; 0055 图 7 是本发明实施例的文件创建子模块的工作流程图 ; 0056 图 8 是本发明实施例的异常掉电文件处理子模块的工作流程图 ; 0057 图 9 是本发明实施例的分区表与文件关系图 ; 0058 图 10 是本发明实施例的分区表框图 ; 0059 图 11 是本发明实施例的某分区的详细描述 ; 0060 图 12 是本发明实施例的坏块记录表 ; 0061 图 13 是本发明实施例的文。

20、件系统整体描述信息表 ; 0062 图 14 是本发明实施例的文件分区表多备份方法 ; 0063 图 15 是本发明实施例的分区表更新方法。 具体实施方式 0064 为了使本发明的目的、 技术方案及优点更加清楚明白, 以下结合附图及实施例, 对 本发明进行进一步详细说明。 应当理解, 此处所描述的具体实施例仅用以解释本发明, 并不 用于限定本发明。 0065 图 1 为本发明的 nand flash 文件系统工作的原理框图。图 1 中, CPU 处理器 1 连 说 明 书 CN 103577574 A 6 4/11 页 7 接数据总线 6 与数据接口 7, CPU 处理器 1 在 FS(fil。

21、e-system) 文件系统 2 的调度下, 负 责将数据从数据接口 7 搬移至 nand flash 存储阵列 5 或将数据从 nand flash 存储阵列 5 搬移至数据接口 7。SDRAM 存储器 3 用于 CPU 处理器 1 的数据缓冲, NVRAM 非易失存储器 4 用于记录 CPU 处理器 1 搬移数据至 nand flash 存储阵列 5 过程中的 “步骤记录” ,“步骤记 录” 是指数据被搬移至哪里、 是否记录完成、 以及部分缓冲数据等信息, 以便保证数据记录 的 “线索” 不丢失。系统掉电重新上电后, CPU 处理器 1 根据 NVRAM 非易失存储器 4 中记录 的 “线。

22、索” 获取掉电之前的记录状态, 根据 “线索” 将缓冲数据写入文件、 关闭未正常关闭的 文件等操作。 0066 如图 4 所示 : 本文件系统分为硬件抽象层和软件层两层。硬件抽象层主要实现对 硬件 IO 的访问, 包括基本的写保护、 复位、 单元读写、 页读写、 块擦除等基本函数。软件层访 问硬件抽象层的接口, 实现对文件系统的创建、 文件的管理、 文件的存取、 自动循环记录、 断 电保护文件、 分区信息多备份、 自动坏块替换等功能。 0067 具体如下 : 0068 一种基于 nand flash 的高可靠线性文件系统, 本实施例采用的 nand flash 包括 sdram存储器, nvr。

23、am非易失存储器和nand flash存储阵列 ; 该文件系统包括硬件抽象层和 软件层, 所述硬件抽象层用于实现对硬件 IO 的访问, 所述软件层通过访问硬件抽象层的接 口实现对文件的操作 ; 软件层结构组成如图 6 所示, 所述软件层包括分区表初始化模块、 文 件管理模块和文件存取模块 ; 0069 分区表初始化模块, 用于对分区表进行初始化 ; 所述分区表初始化模块包括 : 芯 片硬件初始化子模块, 用于通过初始化获得芯片的属性信息, 并防止对芯片进行异常访 问 ; 0070 芯片硬件初始化子模块的工作步骤为 : 向nand flash发出读ID的命令, 将读取到 的 nand flash。

24、ID 信息与已支持的芯片类型 ID 进行比对, 如果符合则通过初始化得到芯片 的特性信息 : 包括有多少个 block, 每 block 的 page 数等, 否则停止后续操作, 防止对芯片 进行异常访问。 0071 坏块信息扫描子模块, 用于识别 nand 芯片的所有坏块 ; 0072 坏块信息扫描子模块的工作步骤为 : 读取 nand 芯片的每个 block 的前 2 个 page 的 spare 区, 若该 spare 区的信息不为 0xff, 则该 block 为坏块 ; 扫描 nand 芯片的每一个 block, 直至识别出所有的坏块, 即完成坏块信息的扫描。 0073 好块 / 坏。

25、块替换表, 用于建立坏块到好块的物理位置的映射关系 ; 具体如下 : 建立 一张坏块, 即无效块到保留区的映射表, 当访问到无效块时, 通过查表访问被映射的好块的 物理位置。保留区设置在 nand 芯片的末尾 3% 的区域, 因为 nand 芯片的坏块率基本在 1% 以下, 保留 3% 的区域可保证所有的坏块均可被替换, 还有一定的余量供后续使用中发现的 坏块进行替换。在运行中发现新的坏块时, 标记坏块, 并从保留区找到一个好块, 将数据拷 贝至该好块中, 坏块计数器加 1。 0074 文件分区划分子模块, 用于按照分区时的参数进行分区划分 ; 0075 分区大小是分区时的参数指定的, 与硬盘。

26、重分区时对硬盘的划分方法一致 : 找到 一段连续的空间, 标记其起始地址、 大小等信息。每个分区的数据都只能在该分区中存在, 不能进入其他分区。 说 明 书 CN 103577574 A 7 5/11 页 8 0076 文件信息初始化模块, 用于初始化文件的始末地址、 打开方式、 文件名和文件大小 信息 ; 0077 初始化每个文件的始末地址、 打开方式、 文件名、 文件大小等信息为默认值。本文 件系统的文件个数是有限的, 每分区为 100 个文件, 都存于分区表中。文件信息包括始末地 址、 打开方式、 文件名、 文件大小等信息。文件信息的结构如下所示。 0078 0079 缓冲初始化 : 初。

27、始化文件的读写所用到的sdram指针, 每个分区都有一段sdram作 为该分区的数据缓冲。当写入数据时 , 首先将数据写入至 sdram 中, 当数据达到一个 page 时, 将数据写入 nand 中, 效率达到最高。当读取数据时 , 首先将数据读取到 sdram 中, 然后 从 sdram 中取走, 当数据不在当前缓冲中时, 则重新从分区中读取数据至 sdram 中。 0080 文件管理模块, 用于对文件进行管理 ; 所述文件管理模块包括 0081 文件创建子模块, 用于创建新文件 ; 本发明实现的文件的创建指以 fopen 函数为 接口的函数调用, 实现在分区表中找到一个位置, 创建文件信。

28、息, 并返回指向该位置的文件 指针。 说 明 书 CN 103577574 A 8 6/11 页 9 0082 文件创建子模块包括 : 0083 文件名非法纠正模块, 用于进行文件名非法自处纠正 ; 0084 同名文件判断模块, 用于判断是否存在同名文件 ; 0085 “自动追加” 模式判断模块, 用于判断是否 “自动追加” 模式, 如果是则对文件名自 动追加后缀序号 ; 0086 文件个数判断模块, 用于判断是否文件个数已满 ; 0087 循环模式判断模块, 用于需要判断是否是循环模式, 如果是循环模式, 则删除最老 的文件 ; 0088 文件信息创建模块, 用于在分区表中找到一个位置, 创。

29、建文件信息, 并返回指向该 位置的文件指针, 并根据文件的大小更新分区表。 0089 文件创建流程图如图 7 所示。文件创建子模块的工作步骤是 : 0090 1. 进行文件名非法自处纠正 ; 0091 因为本系统中文件名只能是字符或数字, 不允许超过 20 字符, 故需要对文件名进 行合法性检测, 去除非法字符 ; 0092 2. 判断是否存在同名文件, 如果不存在同名文件, 转入步骤 6, 否则转入步骤 3; 0093 3. 判断是否 “自动追加” 模式, 如果是转入步骤 4, 否则创建失败 ; 0094 4. 判断是否文件个数已满, 如果已满, 则转入步骤 6, 否则转入步骤 5 ; 00。

30、95 5. 创建添加 “后缀序号” 的文件 ; 0096 6.需要判断是否是循环模式 (可删除文件) , 如果是循环模式, 则删除最老的文件; 0097 7. 在分区表中找到一个位置, 创建文件信息, 并返回指向该位置的文件指针, 并根 据文件的大小更新分区表 ; 0098 8. 创建完成。 0099 文件删除子模块, 用于将文件从分区表中删除, 释放存储空间 ; 0100 文件的删除实际上只是将文件从分区表中删除, 释放出所占用的空间, 而不对用 过的空间进行擦出。由于 nand 芯片的特性是在编程前需要对存储单元进行擦除, 使所有的 存储单元都变为 1, 存储过程只能把 1 变成 0, 无。

31、法把 0 编程 1。在嵌入式系统中, 对系统的 实时性要求较高, 需要随时相应读写指令。而擦除 1 个 block 动作需要若干毫秒, 擦除某个 文件所占用的区域需要更多的时间, 这在实时系统中是不允许的。本发明针对这种状况采 取的方法分两种, 第一种是在写入数据前, 需要对 nand 芯片组成的阵列进行格式化 (擦除) 操作 ; 第二种是在循环写入方式下, 即需要删除并覆盖以前的文件, 采取的测量是 “擦一块、 写一块” 的方法, 破整为零, 以提供系统的实时性。 0101 掉电文件处理子模块, 用于恢复由于异常掉电丢失的文件 ; 0102 本文件系统的高可靠性主要表现在系统的防掉电设计, 。

32、即任意时刻掉电保证文件 不丢失, 数据损失最少, 文件系统不崩溃。完成异常掉电文件的处理需要在写入文件时, 同 时记录文件的日志到一片nvram存储器中。 nvram存储器掉电后数据能保存, 下次再上电后 仍可读取日志数据, 通过读取该部分数据即可追朔至掉电前数据记录至何处, 从而保证数 据丢失最少 (保证只要数据被记录到物理存储器中即可被找到) 。在本发明的实时记录模式 下, 数据缓冲为非易失的 nvram 存储器, 掉电后该部分缓冲的数据也不会丢失, 重新上电后 该部分数据可以被识别, 并记录到 nand 阵列的文件中, 可以保证数据不会发生任何字节丢 说 明 书 CN 103577574。

33、 A 9 7/11 页 10 失。 0103 如图 8 所示 , 若写入文件时掉电, 重新上电后, 本文件系统进入以下处理流程 : 0104 从 nvram 存储器读取日志数据, 判断日志是否正常 (校验码是否正确) , 若正常则 进入步骤 2, 否则进入灾难恢复流程 (通过扫描文件系统的特殊区域实现恢复) , 如果恢复成 功, 则进入步骤 2, 否则重新生成一个日志记录 (可能造成部分数据丢失) ; 0105 删除被标记需要删除的文件, 删除完成进入步骤 3。为了保证文件访问的实时性, 文件的删除工作在文件记录阶段是不运行的, 否则会造成一定时间 (2ms) 内文件系统不响 应命令, 影响系。

34、统的实时性。在循环写入模式下, 需要自动删除 “最旧” 的文件, 但删除动作 只是在 nvram 日志中做标记, 等下次上电初始化时再删除 ; 0106 找到断电未关闭的文件, 并找到文件断电时的 “断点” , 进入步骤 4 ; 0107 判断是否实时写入, 如果是则进入步骤 5, 否则进入步骤 6 ; 0108 读取在 nvram 中缓冲的数据, 写入到 nand 阵列中。因为实时模式下, nvram 是作 为缓存的, 掉电后缓存的数据仍然可用, 需要将数据写入到 nand 阵列中, 为了尽量不丢失 数据 ; 0109 处理文件末尾字段, 记录文件末尾的地址, 写入文件系统分区表中 ; 01。

35、10 计算文件大小、 总使用大小、 下个可用空间等信息 ; 0111 更新分区表, 即保存分区表到 nand 阵列中, 计算校验码, 并保存分区表的三个备 份 ; 0112 更新 nvram 中的日志信息。 0113 在本文件系统所使用的 nvram 存储器中保存着当前正在操作的文件的状态信息, 数据结构如下 : 0114 0115 其中 FR_DATA_TYPE 是并行访问 nand flash 的位宽, 在实际系统中, 位宽可为 说 明 书 CN 103577574 A 10 8/11 页 11 uchar8,uint16,ulong32 或 ulonglong64。 0116 当写入文件。

36、时, nvram 会记录当前访问的位置信息, 即断点信息, 当系统掉电后, 通过读取该断点信息, 可知道最近一次访问的位置, 继而对断电的文件继续进行操作。 PartitionInNvStruct 是 nvram 中记录的某一个分区正在使用的情况, 包括 : 当前访问的单 元 (raidpage) 、 单元内的偏移位置、 当前访问的文件序号、 是否进入循环的标志等信息。 0117 由于 nvram 记录的数据是非常重要的数据, 它的正确性要求非常高。本文件系统 为 nvram 设计了 ecc 校验机制与多备份机制。Ecc 校验可纠 1bit 错 ; 多备份可弥补 ecc 无 法纠正的情况, 从。

37、设计角度可将 nvram 出现错误的概率降至最低。 0118 坏块替换子模块, 用于根据好块 / 坏块替换表替换无效数据块 ; 0119 坏块记录表的结构如图12所示, 坏块记录表BadTable记录了坏块的位置, 坏块替 换表 SubstiTable 记录了被映射到坏块位置的好块的位置。坏块替换表 SubstiTable 是文 件系统保留的处于nand flash末尾的一些好块, 被用于替换出厂坏块以及后续运行时产生 的坏块。替换表 SubstiTable 保留了总有效块的 3% 的区域作为替换块。当写入过程中出 现记录错误、 擦除、 读出校验等错误, 需要进行块替换时, 操作步骤如下 : 。

38、0120 首先将数据从坏块拷贝出, 并进行校验修正, 存入 sdram 存储器 ; 0121 从替换表 SubstiTable 中取出的第一个块 a, 将数据拷入其中 ; 0122 标记新产生的坏块 b, 并放入 BadTable 表中 ; 0123 建立块 a 与块 b 的映射关系, 当访问地址处于块 a 时, 会通过查找表, 发现块 a 是 坏块, 需要通过访问块 b 获取正确的数据 ; 0124 保存新的分区表。 0125 文件存取模块, 用于控制文件的读取与写入操作 ; 0126 文件写入子模块, 用于将数据从 sdram 存储器中的缓冲区搬移至分区中文件指针 指向的存储区域 ; 写入。

39、的文件在分区中顺序存放 ; 每个分区同一时间只有一个文件在进行 写操作 ; 0127 文件写入的编址方式设计 : 0128 nand flash 的编址采用块 (block) 、 页 (page) 、 单元 (col) 三种组合的编址方式 ; 0129 由于 page 编程速度最快, 本文件系统采用以 page 为基本单元进行访问。假设每 个 block 有 M 个 page 组成, 以下是对 nand flash 中的某个单元进行读、 写、 擦除操作的步 骤。 0130 当需要读取第 i 个 block 的第 j 个 page 的第 k 个 col 单元内的数据, 其访问地址 为第 (i*M。

40、+j) 个 page, 并将该 page 读取到缓冲区中, 然后从缓冲区中读取第 k 个数据。 0131 当需要将数据写入第 i 个 block 的第 j 个 page 的第 k 个 col 单元内时, 如果是调 用单col写入函数, 即只写1个数据, 则数据会直接写入 ; 如果希望写入一批数据, 则会首先 将数据写入缓冲区, 当缓冲区达到 1 个 page 的长度后, 调用 page 写入函数, 将数据写入第 (i*M+j) 个 page。 0132 数据的存储采用连续存储方式, 即以页 (page) 为基本访问单元, 在一个分区内部, 按照页的地址顺序进行访问。 0133 文件循环写入子模。

41、块, 用于分区空间满时, 自动删除最旧文件并写入新文件 ; 0134 本文件系统设计了循环写入功能, 文件循环写入子模块在分区空间满时, 会自动 说 明 书 CN 103577574 A 11 9/11 页 12 删除掉最旧的文件。但在要求实时性非常高的应用中, 删除文件时如果擦除文件所占的空 间会造成较长时间无法记录数据。解决该问题的方法是删除文件时, 只是将它从分区表中 删除, 在数据记录到删除的文件所占的空间时再进行擦除, 即 “边写边擦” 。 循环写入从原理 上看很简单, 但由于 nand 存储器的特性, 擦除是非常耗费时间的 , 即使是删除文件这种简 单操作, 也需要花费若干毫秒 (。

42、ms) 的时间, 这对实时系统是不能允许的。本文件系统使用 了一种方法, 在非易失存储器 (nvram) 中记录着需要更新的分区表的简要信息 (类似索引信 息) 以及需要被删除的文件索引号, 当系统不繁忙时或重新初始化时, 根据 nvram 中记录的 简要信息, 完成分区表的更新、 文件的删除, 从而不影响系统的实时性, 保持数据吞吐的稳 定性。 0135 文件循环写入子模块的工作流程图如图 3, 工作步骤为 : 0136 创建文件, 步骤流程为 “文件创建子模块” 工作流程 ; 0137 判断写入模式 (文件创建时由输入参数确定写入模式) , 如果是实时写入模式, 则 修改缓冲区指针, 指向。

43、 nvram 区, 写入的数据可保证不丢失 ; 如果是普通模式, 则将缓冲区 指针指向 sdram。由于 sdram 访问速度快, 容量大, 适合批量数据的存储, nvram 容量小, 速 度稍慢, 可保证数据不丢失 ; 0138 判断 nand 阵列中是否有空间可写入。如果没有空间可写入, 在进入步骤 4 ; 0139 判断是否是循环写入模式, 如果不是循环写入模式, 则直接返回, 丢弃数据 ; 如果 是循环模式, 则对最旧的文件进行删除, 腾出空间, 继续写入, 进入步骤 5 ; 0140 判断缓冲区是否已满, 如果已满则将缓冲区数据写入 nand 阵列, 并释放缓冲区 ; 如果未满直接将。

44、数据写入缓冲区 ; 0141 更新文件指针、 更新将断点日志记录 , 存入 nvram 存储器。 0142 文件实时写入子模块, 用于将数据写入分区前先缓冲至 nvram 非易失存储器中, 实时将数据写入分区中 ; 0143 文件的实时写入子模块与普通缓冲式写入的区别在于记录数据的缓冲不同, 并且 掉电后的处理方法不同。 由于nand flash不同于普通的随机存储器 (SRAM) , 对nand flash 的基本存储单元 page 的访问是有次数限制的, 一般厂家规定擦除 page 后, 对 page 内最多 进行 4 次写入操作。对于比较重要的数据, 一般不希望数据有任何的丢失发生, 希。

45、望数据随 时被记录到存储器中, 然而又有 “对 page 内最多进行 4 次写入操作” 的限制, 不可能随时写 入, 这两者就存在了矛盾。解决矛盾的方法就是采用缓存, 而普通的随机存储器 SRAM 做缓 存掉电后数据就会丢失, 本文件系统采用了 nvram 缓存数据的方式, 并随时做好断点保护, 以便断电后能将数据的损失降至最低。文件的缓冲存于非易失的 nvram 存储器中, 当掉电 重新上电时, 初始化函数根据未关闭的文件 “日志” 记录, 可以查询到最后写入的数据的内 容, 将未写入至 nand 存储器的数据重新写入到 nand 的某分区中。 0144 文件实时写入子模块的工作步骤为 : 。

46、0145 1、 将数据写入分区前先缓冲至 nvram 非易失存储器中, 并随时做好断点保护 ; 0146 2、 将数据写入分区中 ; 0147 3、 若掉电, 当重新上电时, 根据未关闭的文件 “日志” 记录, 可以查询到最后写入的 数据的内容, 将未写入至 nand 存储器的数据从 nvram 非易失存储器中重新写入到 nand 的 某分区中。 说 明 书 CN 103577574 A 12 10/11 页 13 0148 文件读取子模块, 用于将数据从分区读取到sdram存储器中, 然后从sdram存储器 中取走。 0149 进一步的, 文件管理模块还可以加入重名文件处理子模块, 用于在同。

47、一分区中创 建同名文件的处理。 0150 本文件系统还设计了文件名自动追加功能。在常见的文件系统中, 在一个目录下 创建同名的文件是不被允许的, 而本系统中可以允许创建同名文件, 其处理方法是在文件 名后自动加上如 “_1” 、“_2” 、“_3” 等后缀。在嵌入式系统中, 通常程序软件是固化在 FLASH 中, 程序软件一般不会经常改动, 而在嵌入式系统中能使用的资源十分有限, 无法获得动态 变化的文件名。针对嵌入式系统的特点, 本文件系统设计了文件名自动追加功能。 0151 当需要在一个分区内创建已经存在的文件时, 首先扫描分区表中该分区的所有文 件, 找到该已经存在的文件, 在该文件的 。

48、FR_FILE 结构的 SameFileCnt 字段加 1, 并用该序 号为新创建的文件名改名, 加上” _1” 、“_2” 的后缀, 即可自动避免出现重名文件。同理, 在 读取文件时, 如果希望读取加后缀的同名文件序列, 则只需要以连续读取模式打开文件, 即 可读取后续的同名文件。假设在本文件系统中存在 abc.dat、 abc.dat_1、 abc.dat_2、 abc. dat_3、 abc.dat_4 等文件, 用户以 “fopen(“abc.dat” ,” r.” )” 函数调用 (其中” r.” 代表 连续读取模式) , 读取 abc.dat 文件时使用连续读取文件模式, 则在文件 abc.dat 读取后, 会自动链接到 abc.dat_1, 依此类推可连续读取若干文件。这种读取方式下, 固化好的用户 代码不需要改动, 即可每次重新上电创建一个新文件记录数据, 读取数据时可选择读取某 个文件或是连续读取所有的文件。 0152 进一步的, 本发明的文件系统还包括文件远程操控模块和人机界面 ; 所述文件远 程操控模块用于与远程 PC 机进行通讯, 实现远程 PC 机对文件系统的控制。如图 2 所示。 0153 进一步的, 本发明采用的 nand flash 为多个 nand flash 组成的多片并行 nand flash。 0154 典型的多片并行的硬件设。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1