一种基于nandflash的高可靠线性文件系统的制作方法

文档序号:6517873阅读:277来源:国知局
一种基于nand flash的高可靠线性文件系统的制作方法
【专利摘要】本发明公开了一种基于nand?flash的高可靠线性文件系统,nand?flash包括sdram存储器,nvram非易失存储器和nand?flash存储阵列;该文件系统包括硬件抽象层和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接口实现对文件的操作,所述软件层包括分区表初始化模块、文件管理模块和文件存取模块。本发明实现了对基于nand?flash的设备的文件管理,具有可移植性高、效率高、以文件方式实现数据存取、自动循环记录、断电保护文件等特点。
【专利说明】—种基于nand flash的高可靠线性文件系统
【技术领域】
[0001]本发明涉及计算机存储领域,尤其涉及一种基于nand flash的高可靠线性文件系 统。
【背景技术】
[0002]nand flash是一种大容量的存储芯片,其特点是容量密度大,制造成本低,访问 速度快,通常作为U盘、固态盘、存储卡等设备上的存储芯片,但其也存在一些不足:它属于 地址、数据共用类型访问方式,访问相对麻烦,它由于本身出厂是就存在坏块,需要“跳过” 坏块进行访问,需要专门的管理方法进行块的管理。目前对数据的管理主要分以下两种方 式:
[0003](I)无文件系统方式访问,使用者需调用函数对存储单元进行直接操作,实现难度 低,但使用难度高;
[0004](2)文件系统方式访问,使用者以文件的方式对存储系统进行访问,实现难度高, 但使用难度低。
[0005]文件系统的优点在于不需要使用者关注数据的存放位置,文件系统来管理数据, 屏蔽了物理介质的不同。由于文件系统对使用者实现数据管理的透明,完全接管数据的存 储,一旦文件系统崩溃会导致数据丢失,所以对文件系统的可靠性要求较高,能经受长时间 的考验。
[0006]本发明涉及一种基于nand flash的高可靠线性文件系统的软件。用于由nand flash组成的存储阵列中实现以文件的方式进行访问管理。本文件系统与windows上使用 的文件系统不同,windows等操作系统上使用的文件系统属于“基于页表结构”形式,而本 文件系统属于线性文件系统。所谓“线性文件系统”是指数据记录在顺序的地址单元中,而 常见的文件系统都是“基于页表结构”形式,即数据记录在不连续的地址单元中,各地址单 元通过一个链表相连接。线性文件系统的特点是管理简单,记录效率高,而常见页表形式的 文件系统管理页表较复杂,无掉电保护特性,效率稍低。本发明非常适合于需要一种高可靠 性、高效率、方便使用的记录设备的环境下。

【发明内容】

[0007]本发明要解决的技术问题在于针对上述现有技术中的缺陷,提供一种基于nand flash的高可靠线性文件系统及线性文件存取方法。
[0008]本发明解决其技术问题所采用的技术方案是:
[0009]本发明提供了一种基于nand flash的高可靠线性文件系统,所述文件系统包括硬 件抽象层和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件 抽象层的接口实现对文件的操作,所述软件层包括:
[0010]分区表初始化模块,用于对分区表进行初始化;
[0011]文件信息初始化模块,用于初始化文件的始末地址、打开方式、文件名和文件大小信息;
[0012]文件管理模块,用于对文件进行管理;
[0013]所述文件管理模块包括:
[0014]文件创建子模块,用于完成创建新文件;
[0015]文件存取模块,用于控制文件的读取与写入操作;
[0016]所述文件存取模块包括:
[0017]文件写入子模块,用于按采用顺序地址方式将数据从sdram存储器中的缓冲区搬 移至分区中文件指针指向的存储区域;
[0018]文件循环写入子模块,用于分区空间满时,自动删除最旧文件并写入新文件;
[0019]文件实时写入子模块,用于将数据写入分区前先缓冲至nvram非易失存储器中;
[0020]文件读取子模块,用于将数据从分区读取到sdram存储器中,然后从sdram存储器 中取走。
[0021]按上述方案,所述文件创建子模块包括:
[0022]文件名非法纠正模块,用于进行文件名非法自处纠正;
[0023]同名文件判断模块,用于判断是否存在同名文件;
[0024]“自动追加”模式判断模块,用于判断是否“自动追加”模式,如果是则对文件名自 动追加后缀序号;
[0025]文件个数判断模块,用于判断是否文件个数已满;
[0026]循环模式判断模块,用于需要判断是否是循环模式,如果是循环模式,则删除最老 的文件;
[0027]文件信息创建模块,用于在分区表中找到一个位置,创建文件信息,并返回指向该 位置的文件指针,并根据文件的大小更新分区表。
[0028]按上述方案,所述分区表初始化模块包括:
[0029]芯片硬件初始化子模块,用于通过初始化获得芯片的属性信息,并防止对芯片进 行异常访问;
[0030]坏块信息扫描子模块,用于识别nand芯片的所有坏块;
[0031]好块/坏块替换表,用于建立坏块到好块的物理位置的映射关系;
[0032]文件分区划分子模块,用于按照分区时的参数进行分区大小划分。
[0033]按上述方案,所述文件管理模块还包括:
[0034]掉电文件处理子模块,用于恢复由于异常掉电丢失的文件:在写入文件时,同时将 文件的日志记录到nand flash的一片nvram存储器中在写入文件时若掉电,当重新上电 时,读取nvram存储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地 址,查询到最后写入的数据的内容,将未写入至nand存储器的数据从nvram非易失存储器 中重新写入到nand的某分区中。
[0035]按上述方案,所述文件管理模块还包括:
[0036]文件删除子模块,用于将文件从分区表中删除,释放存储空间;
[0037]坏块替换子模块,用于在文件写入时根据好块/坏块替换表替换无效数据块。
[0038]按上述方案,所述文件系统还包括文件远程操控模块和人机界面;所述文件远程 操控模块用于与远程PC机进行通讯,实现远程PC机对文件系统的控制。[0039]按上述方案,所述分区表初始化模块还包括分区备份子模块,用于文件系统分区 表同时存储在从nand flash存储阵列开始的128block中查找的3个好块中作为3个备份。
[0040]本发明产生的有益效果是:
[0041]1、传统文件系统基本都是运行在操作系统上调用相应的驱动实现,而在某些嵌入 式应用领域,没有操作系统的支持,对大容量nand flash阵列的数据访问还停留在对底层 芯片IO方式;本发明对大容量nand flash阵列提供一种无需操作系统的文件形式访问,适 用于需要一种高可靠性、高效率、方便使用的嵌入式系统中;
[0042]2、文件在nand flash中的记录采用顺序地址方式记录,以并行流水方式操作,提 升数据访问速度;
[0043]3、文件分区表记录在nand flash中,并且分区表多备份,防止文件分区表损坏时 无法修复;
[0044]4、对重名文件有自动添加后缀功能、可连续读取自动添加后缀的文件;
[0045]5、分区数据满后,实现循环记录功能;
[0046]6、实现实时记录功能;
[0047]7、具有断电保护功能,任意时刻掉电保证文件不丢失,文件系统不崩溃。
【专利附图】

【附图说明】
[0048]下面将结合附图及实施例对本发明作进一步说明,附图中:
[0049]图1是本发明实施例的文件系统工作的原理框图;
[0050]图2是本发明实施例的文件系统的功能模块图;
[0051]图3是本发明实施例的文件循环写入子模块的工作流程图;
[0052]图4是本发明实施例的文件系统的分层结构图;
[0053]图5是本发明实施例的典型多片并行的硬件设计结构图;
[0054]图6是本发明实施例的软件层结构组成图;
[0055]图7是本发明实施例的文件创建子模块的工作流程图;
[0056]图8是本发明实施例的异常掉电文件处理子模块的工作流程图;
[0057]图9是本发明实施例的分区表与文件关系图;
[0058]图10是本发明实施例的分区表框图;
[0059]图11是本发明实施例的某分区的详细描述;
[0060]图12是本发明实施例的坏块记录表;
[0061]图13是本发明实施例的文件系统整体描述信息表;
[0062]图14是本发明实施例的文件分区表多备份方法;
[0063]图15是本发明实施例的分区表更新方法。
【具体实施方式】
[0064]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对 本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不 用于限定本发明。
[0065]图1为本发明的nand flash文件系统工作的原理框图。图1中,CPU处理器I连接数据总线6与数据接口 7,CPU处理器I在FS (file-system)文件系统2的调度下,负 责将数据从数据接口 7搬移至nand flash存储阵列5或将数据从nand flash存储阵列5 搬移至数据接口 7。SDRAM存储器3用于CPU处理器I的数据缓冲,NVRAM非易失存储器4 用于记录CPU处理器I搬移数据至nand flash存储阵列5过程中的“步骤记录”,“步骤记 录”是指数据被搬移至哪里、是否记录完成、以及部分缓冲数据等信息,以便保证数据记录 的“线索”不丢失。系统掉电重新上电后,CPU处理器I根据NVRAM非易失存储器4中记录 的“线索”获取掉电之前的记录状态,根据“线索”将缓冲数据写入文件、关闭未正常关闭的 文件等操作。
[0066]如图4所示:本文件系统分为硬件抽象层和软件层两层。硬件抽象层主要实现对 硬件IO的访问,包括基本的写保护、复位、单元读写、页读写、块擦除等基本函数。软件层访 问硬件抽象层的接口,实现对文件系统的创建、文件的管理、文件的存取、自动循环记录、断 电保护文件、分区信息多备份、自动坏块替换等功能。
[0067]具体如下:
[0068]—种基于nand flash的高可靠线性文件系统,本实施例采用的nand flash包括 sdram存储器,nvram非易失存储器和nand flash存储阵列;该文件系统包括硬件抽象层和 软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接 口实现对文件的操作;软件层结构组成如图6所示,所述软件层包括分区表初始化模块、文 件管理模块和文件存取模块;
[0069]分区表初始化模块,用于对分区表进行初始化;所述分区表初始化模块包括:芯 片硬件初始化子模块,用于通过初始化获得芯片的属性信息,并防止对芯片进行异常访 问;
[0070]芯片硬件初始化子模块的工作步骤为:向nand flash发出读ID的命令,将读取到 的nand flashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯片 的特性信息:包括有多少个block,每block的page数等,否则停止后续操作,防止对芯片 进行异常访问。
[0071]坏块信息扫描子模块,用于识别nand芯片的所有坏块;
[0072]坏块信息扫描子模块的工作步骤为:读取nand芯片的每个block的前2个page 的spare区,若该spare区的信息不为Oxff,则该block为坏块;扫描nand芯片的每一个 block,直至识别出所有的坏块,即完成坏块信息的扫描。
[0073]好块/坏块替换表,用于建立坏块到好块的物理位置的映射关系;具体如下:建立 一张坏块,即无效块到保留区的映射表,当访问到无效块时,通过查表访问被映射的好块的 物理位置。保留区设置在nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1% 以下,保留3%的区域可保证所有的坏块均可被替换,还有一定的余量供后续使用中发现的 坏块进行替换。在运行中发现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷 贝至该好块中,坏块计数器加I。
[0074]文件分区划分子模块,用于按照分区时的参数进行分区划分;
[0075]分区大小是分区时的参数指定的,与硬盘重分区时对硬盘的划分方法一致:找到 一段连续的空间,标记其起始地址、大小等信息。每个分区的数据都只能在该分区中存在, 不能进入其他分区。[0076]文件信息初始化模块,用于初始化文件的始末地址、打开方式、文件名和文件大小
信息;
[0077]初始化每个文件的始末地址、打开方式、文件名、文件大小等信息为默认值。本文
件系统的文件个数是有限的,每分区为100个文件,都存于分区表中。文件信息包括始末地
址、打开方式、文件名、文件大小等信息。文件信息的结构如下所示。
[0078]
typcdc I'struct
{
bool FilcNotEmplyFlag; //文件是否为空,为空则后续信息无效 int FiIcFinishcd;//文件是正常关闭,用于判断异常断电
int bclongto;//文件属于哪个分区
int OpcnModc;//文件打开模式:写入、实时、读出、循环模式等
charFilcNamc[FILENAME_LEN]; //文件名
int FiIeI ndcx;//文件序列号
int SameFileCnt; //同名文件个数
unsigned SiarlRaidPagc; /7起:始 page IikJl1:
unsigned EndRaidPagc; HM) d page J也J ll:
long long FiIcSizc;节 lT1-^V.unsigned EndOffsclInRaidPagc; //Ud page 内 fei移地Jll:
unsigned CurrcniRaidPagc; //当前page地址
unsigned CurrcntOflsctInRaidPage; //'1I fjlj page 内 1?移地址
unsigned CycMaxRegion;,V当前最大可写的page地址,用于循环记录
unsigned ClycleWrtFlag;//是否循环成功标志
unsigned EccFlag; //本文件是否出现了坏块标志
IFRFILE;
[0079]缓冲初始化:初始化文件的读写所用到的sdram指针,每个分区都有一段sdram作
为该分区的数据缓冲。当写入数据时,首先将数据写入至sdram中,当数据达到一个page
时,将数据写入nand中,效率达到最高。当读取数据时,首先将数据读取到sdram中,然后
从sdram中取走,当数据不在当前缓冲中时,贝U重新从分区中读取数据至sdram中。
[0080]文件管理模块,用于对文件进行管理;所述文件管理模块包括
[0081]文件创建子模块,用于创建新文件;本发明实现的文件的创建指以fopen函数为
接口的函数调用,实现在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针。[0082]文件创建子模块包括:
[0083]文件名非法纠正模块,用于进行文件名非法自处纠正;
[0084]同名文件判断模块,用于判断是否存在同名文件;
[0085]“自动追加”模式判断模块,用于判断是否“自动追加”模式,如果是则对文件名自 动追加后缀序号;
[0086]文件个数判断模块,用于判断是否文件个数已满;
[0087]循环模式判断模块,用于需要判断是否是循环模式,如果是循环模式,则删除最老 的文件;
[0088]文件信息创建模块,用于在分区表中找到一个位置,创建文件信息,并返回指向该 位置的文件指针,并根据文件的大小更新分区表。
[0089]文件创建流程图如图7所示。文件创建子模块的工作步骤是:
[0090]1.进行文件名非法自处纠正;
[0091]因为本系统中文件名只能是字符或数字,不允许超过20字符,故需要对文件名进 行合法性检测,去除非法字符;
[0092]2.判断是否存在同名文件,如果不存在同名文件,转入步骤6,否则转入步骤3;
[0093]3.判断是否“自动追加”模式,如果是转入步骤4,否则创建失败;
[0094]4.判断是否文件个数已满,如果已满,则转入步骤6,否则转入步骤5 ;
[0095]5.创建添加“后缀序号”的文件;
[0096]6.需要判断是否是循环模式(可删除文件),如果是循环模式,则删除最老的文件;
[0097]7.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根 据文件的大小更新分区表;
[0098]8.创建完成。
[0099]文件删除子模块,用于将文件从分区表中删除,释放存储空间;
[0100]文件的删除实际上只是将文件从分区表中删除,释放出所占用的空间,而不对用 过的空间进行擦出。由于nand芯片的特性是在编程前需要对存储单元进行擦除,使所有的 存储单元都变为I,存储过程只能把I变成0,无法把0编程I。在嵌入式系统中,对系统的 实时性要求较高,需要随时相应读写指令。而擦除I个block动作需要若干毫秒,擦除某个 文件所占用的区域需要更多的时间,这在实时系统中是不允许的。本发明针对这种状况采 取的方法分两种,第一种是在写入数据前,需要对nand芯片组成的阵列进行格式化(擦除) 操作;第二种是在循环写入方式下,即需要删除并覆盖以前的文件,采取的测量是“擦一块、 写一块”的方法,破整为零,以提供系统的实时性。
[0101]掉电文件处理子模块,用于恢复由于异常掉电丢失的文件;
[0102]本文件系统的高可靠性主要表现在系统的防掉电设计,即任意时刻掉电保证文件 不丢失,数据损失最少,文件系统不崩溃。完成异常掉电文件的处理需要在写入文件时,同 时记录文件的日志到一片nvram存储器中。nvram存储器掉电后数据能保存,下次再上电后 仍可读取日志数据,通过读取该部分数据即可追朔至掉电前数据记录至何处,从而保证数 据丢失最少(保证只要数据被记录到物理存储器中即可被找到)。在本发明的实时记录模式 下,数据缓冲为非易失的nvram存储器,掉电后该部分缓冲的数据也不会丢失,重新上电后 该部分数据可以被识别,并记录到nand阵列的文件中,可以保证数据不会发生任何字节丢失。
[0103]如图8所示,若写入文件时掉电,重新上电后,本文件系统进入以下处理流程:
[0104]从nvram存储器读取日志数据,判断日志是否正常(校验码是否正确),若正常则 进入步骤2,否则进入灾难恢复流程(通过扫描文件系统的特殊区域实现恢复),如果恢复成 功,则进入步骤2,否则重新生成一个日志记录(可能造成部分数据丢失);
[0105]删除被标记需要删除的文件,删除完成进入步骤3。为了保证文件访问的实时性, 文件的删除工作在文件记录阶段是不运行的,否则会造成一定时间(2ms)内文件系统不响 应命令,影响系统的实时性。在循环写入模式下,需要自动删除“最旧”的文件,但删除动作 只是在nvram日志中做标记,等下次上电初始化时再删除;
[0106]找到断电未关闭的文件,并找到文件断电时的“断点”,进入步骤4;
[0107]判断是否实时写入,如果是则进入步骤5,否则进入步骤6 ;
[0108]读取在nvram中缓冲的数据,写入到nand阵列中。因为实时模式下,nvram是作 为缓存的,掉电后缓存的数据仍然可用,需要将数据写入到nand阵列中,为了尽量不丢失 数据;
[0109]处理文件末尾字段,记录文件末尾的地址,写入文件系统分区表中;
[0110]计算文件大小、总使用大小、下个可用空间等信息;
[0111]更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的三个备 份;
[0112]更新nvram中的日志信息。
[0113]在本文件系统所使用的nvram存储器中保存着当前正在操作的文件的状态信息,
数据结构如下:
[0114]
typcdci'struct
{
int cur raidpage; //前访问的单元(raidpage ) int cur_pos—in—raidpage; //单元内的偏移位置 int cur—file—index;//当前访问的文件序号 int clycle_wrt_flag; //文件调头标志,在循环写入中用到 FR—DATA—TYPE ecc—value; //ccc 校验ff[ unsigned CycMaxRegion;// 最大可写的边界 int undelete—index; //未删除的文件起始 index int undelete—cnt; //未删除的文件个数 int avail—flag; //分区的日志数据有效标志 I ParlitionlnNvSlrucl;
[0115]其中FR—DATA—TYPE是并行访问nand flash的位宽,在实际系统中,位宽可为uchar8, uintl6, ulong32 或 ulonglong64。
[0116]当写入文件时,nvram会记录当前访问的位置信息,即断点信息,当系统掉电后, 通过读取该断点信息,可知道最近一次访问的位置,继而对断电的文件继续进行操作。 PartitionInNvStruct是nvram中记录的某一个分区正在使用的情况,包括:当前访问的单 元(raidpage)、单元内的偏移位置、当前访问的文件序号、是否进入循环的标志等信息。
[0117]由于nvram记录的数据是非常重要的数据,它的正确性要求非常高。本文件系统 为nvram设计了 ecc校验机制与多备份机制。Ecc校验可纠Ibit错;多备份可弥补ecc无 法纠正的情况,从设计角度可将nvram出现错误的概率降至最低。
[0118]坏块替换子模块,用于根据好块/坏块替换表替换无效数据块;
[0119]坏块记录表的结构如图12所示,坏块记录表BadTable记录了坏块的位置,坏块替 换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文 件系统保留的处于nand flash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生 的坏块。替换表SubstiTable保留了总有效块的3%的区域作为替换块。当写入过程中出 现记录错误、擦除、读出校验等错误,需要进行块替换时,操作步骤如下:
[0120]首先将数据从坏块拷贝出,并进行校验修正,存入sdram存储器;
[0121]从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
[0122]标记新产生的坏块b,并放入BadTable表中;
[0123]建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是 坏块,需要通过访问块b获取正确的数据;
[0124]保存新的分区表。
[0125]文件存取模块,用于控制文件的读取与写入操作;
[0126]文件写入子模块,用于将数据从sdram存储器中的缓冲区搬移至分区中文件指针 指向的存储区域;写入的文件在分区中顺序存放;每个分区同一时间只有一个文件在进行 写操作;
[0127]文件写入的编址方式设计:
[0128]nand flash的编址采用块(block)、页(page)、单元(col)三种组合的编址方式;
[0129]由于page编程速度最快,本文件系统采用以page为基本单元进行访问。假设每 个block有M个page组成,以下是对nand flash中的某个单元进行读、写、擦除操作的步骤。
[0130]当需要读取第i个block的第j个page的第k个col单元内的数据,其访问地址 为第(i*M+j)个page,并将该page读取到缓冲区中,然后从缓冲区中读取第k个数据。
[0131]当需要将数据写入第i个block的第j个page的第k个col单元内时,如果是调 用单col写入函数,即只写I个数据,则数据会直接写入;如果希望写入一批数据,则会首先 将数据写入缓冲区,当缓冲区达到I个page的长度后,调用page写入函数,将数据写入第 (i*M+j)个 page。
[0132]数据的存储采用连续存储方式,即以页(page)为基本访问单元,在一个分区内部, 按照页的地址顺序进行访问。
[0133]文件循环写入子模块,用于分区空间满时,自动删除最旧文件并写入新文件;
[0134]本文件系统设计了循环写入功能,文件循环写入子模块在分区空间满时,会自动删除掉最旧的文件。但在要求实时性非常高的应用中,删除文件时如果擦除文件所占的空 间会造成较长时间无法记录数据。解决该问题的方法是删除文件时,只是将它从分区表中 删除,在数据记录到删除的文件所占的空间时再进行擦除,即“边写边擦”。循环写入从原理 上看很简单,但由于nand存储器的特性,擦除是非常耗费时间的,即使是删除文件这种简 单操作,也需要花费若干毫秒(ms)的时间,这对实时系统是不能允许的。本文件系统使用 了一种方法,在非易失存储器(nvram)中记录着需要更新的分区表的简要信息(类似索引信 息)以及需要被删除的文件索引号,当系统不繁忙时或重新初始化时,根据nvram中记录的 简要信息,完成分区表的更新、文件的删除,从而不影响系统的实时性,保持数据吞吐的稳 定性。
[0135]文件循环写入子模块的工作流程图如图3,工作步骤为:
[0136]创建文件,步骤流程为“文件创建子模块”工作流程;
[0137]判断写入模式(文件创建时由输入参数确定写入模式),如果是实时写入模式,则 修改缓冲区指针,指向nvram区,写入的数据可保证不丢失;如果是普通模式,则将缓冲区 指针指向sdram。由于sdram访问速度快,容量大,适合批量数据的存储,nvram容量小,速 度稍慢,可保证数据不丢失;
[0138]判断nand阵列中是否有空间可写入。如果没有空间可写入,在进入步骤4 ;
[0139]判断是否是循环写入模式,如果不是循环写入模式,则直接返回,丢弃数据;如果 是循环模式,则对最旧的文件进行删除,腾出空间,继续写入,进入步骤5 ;
[0140]判断缓冲区是否已满,如果已满则将缓冲区数据写入nand阵列,并释放缓冲区; 如果未满直接将数据写入缓冲区;
[0141]更新文件指针、更新将断点日志记录,存入nvram存储器。
[0142]文件实时写入子模块,用于将数据写入分区前先缓冲至nvram非易失存储器中, 实时将数据写入分区中;
[0143]文件的实时写入子模块与普通缓冲式写入的区别在于记录数据的缓冲不同,并且 掉电后的处理方法不同。由于nand flash不同于普通的随机存储器(SRAM),对nand flash 的基本存储单元page的访问是有次数限制的,一般厂家规定擦除page后,对page内最多 进行4次写入操作。对于比较重要的数据,一般不希望数据有任何的丢失发生,希望数据随 时被记录到存储器中,然而又有“对page内最多进行4次写入操作”的限制,不可能随时写 入,这两者就存在了矛盾。解决矛盾的方法就是采用缓存,而普通的随机存储器SRAM做缓 存掉电后数据就会丢失,本文件系统采用了 nvram缓存数据的方式,并随时做好断点保护, 以便断电后能将数据的损失降至最低。文件的缓冲存于非易失的nvram存储器中,当掉电 重新上电时,初始化函数根据未关闭的文件“日志”记录,可以查询到最后写入的数据的内 容,将未写入至nand存储器的数据重新写入到nand的某分区中。
[0144]文件实时写入子模块的工作步骤为:
[0145]1、将数据写入分区前先缓冲至nvram非易失存储器中,并随时做好断点保护;
[0146]2、将数据写入分区中;
[0147]3、若掉电,当重新上电时,根据未关闭的文件“日志”记录,可以查询到最后写入的 数据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand的 某分区中。[0148]文件读取子模块,用于将数据从分区读取到sdram存储器中,然后从sdram存储器 中取走。
[0149]进一步的,文件管理模块还可以加入重名文件处理子模块,用于在同一分区中创 建同名文件的处理。
[0150]本文件系统还设计了文件名自动追加功能。在常见的文件系统中,在一个目录下 创建同名的文件是不被允许的,而本系统中可以允许创建同名文件,其处理方法是在文件 名后自动加上如“_1”、“_2”、“_3”等后缀。在嵌入式系统中,通常程序软件是固化在FLASH 中,程序软件一般不会经常改动,而在嵌入式系统中能使用的资源十分有限,无法获得动态 变化的文件名。针对嵌入式系统的特点,本文件系统设计了文件名自动追加功能。
[0151]当需要在一个分区内创建已经存在的文件时,首先扫描分区表中该分区的所有文 件,找到该已经存在的文件,在该文件的FR_FILE结构的SameFileCnt字段加1,并用该序 号为新创建的文件名改名,加上的后缀,即可自动避免出现重名文件。同理,在 读取文件时,如果希望读取加后缀的同名文件序列,则只需要以连续读取模式打开文件,即 可读取后续的同名文件。假设在本文件系统中存在abc.dat、abc.dat_l、abc.dat_2、abc.dat_3、abc.dat_4 等文件,用户以 “fopen ( “abc.dat”,”r.”)” 函数调用(其中” r.”代表 连续读取模式),读取abc.dat文件时使用连续读取文件模式,则在文件abc.dat读取后, 会自动链接到abc.dat_l,依此类推可连续读取若干文件。这种读取方式下,固化好的用户 代码不需要改动,即可每次重新上电创建一个新文件记录数据,读取数据时可选择读取某 个文件或是连续读取所有的文件。
[0152]进一步的,本发明的文件系统还包括文件远程操控模块和人机界面;所述文件远 程操控模块用于与远程PC机进行通讯,实现远程PC机对文件系统的控制。如图2所示。
[0153]进一步的,本发明采用的nand flash为多个nand flash组成的多片并行nand flash。
[0154]典型的多片并行的硬件设计原理框图如图5所示。通常nand flash是8bit位宽 的存储器,而CPU处理器通常是16bit、32bit、64bit处理器,可以通过将多个nand flash 拼在一起的方式,提高系统的性能。
[0155]本实施例的“分区表”设计:
[0156]文件系统以一个数据结构的形式存放在nand flash内部,记录着管理文件系统所 需的所有数据,简称分区表。分区表分为三个部分:如图10所示;
[0157]1.包含指定分区的文件信息的数据结构PartitionDescription ;
[0158]2.包含坏块信息以及替换查找表的BadTable ;
[0159]3.记录其它分区整理信息的DiskDetail ;
[0160]分区文件信息分2个部分,分区概况信息与每个文件信息。分区概况信息记录着 分区的起始地址、分区大小、使用大小、结束标志、擦除标志、当前访问文件序号等信息。通 过分区的概况信息,可获得以下信息:可在哪里创建新文件、上次写入的文件是否正常关闭 等信息,以便进行创建新文件、掉电保护等操作。分区表与文件关系如图9所示。
[0161]文件信息的数据结构PartitionDescription包含了某个分区的全部文件的信 息,包括该分区的始末地址,分区大小、文件个数、使用空间、未用空间、文件指针等信息,如 图11。[0162]坏块记录表的结构如图12所示,坏块记录表BadTable记录了坏块的位置,坏块替 换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文 件系统保留的处于nand flash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生 的坏块。
[0163]文件系统整体描述信息表如图13所示,该信息表记录了存储区的大小、已使用大 小、分区个数、总坏块个数、是否掉电、分区完整标志等信息。
[0164]如图14所示,文件分区表多备份方法如下:
[0165]分区表存储在从固态盘开始的128block中查找好的3块,作为3备份分区的存 放。分区表的存放规则是3备份分开存放:0备份放置在0?39,I备份放置在40?79,2 备份放置在80?127。0备份只能放在0?39,当出现某分区表异常时,根据出错情况判 断是出现记录bit错误或是记录时断电,当出现记录bit错误时,标记为坏块并自动向后替 换。在初始化找分区表时,根据备份区的坏块标记,找到分区表。根据找到的三个分区表的 “新旧状况”找到最新、校验正确的分区表。
[0166]对于记录分区表的存储单元,每个分区表都有一段ECC校验值(每512字节生产I 个ecc校验码),并与分区表存放在一起。分区表更新方法如图15所示,当出现ECC校验错 误时,判断是否能纠正,若能纠正则使用该分区表,并将该block标记为坏块,以防出现不 可纠正的错误。对于出现ECC校验错误时就标记为坏块的做法的原因,是考虑到本文件系 统是使用在高可靠系统中,任何数据都可能是非常重要的。分区表更新方法如图15所示。
[0167]应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换, 而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
【权利要求】
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个备份。
【文档编号】G06F17/30GK103577574SQ201310541079
【公开日】2014年2月12日 申请日期:2013年11月5日 优先权日:2013年11月5日
【发明者】袁松, 何冲, 毛先俊 申请人:中船重工(武汉)凌久电子有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1