一种基于nand flash的高可靠线性文件存取方法
【专利摘要】本发明公开了一种基于nand?flash的高可靠线性文件存取方法,nand?flash包括sdram存储器,nvram非易失存储器和nand?flash存储阵列;存取方法包括以下步骤:初始化分区表;初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;根据初始化文件信息,创建新文件;采用顺序地址方式将数据从nand?flash的sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;将数据从分区读取到nand?flash的sdram存储器中,然后从sdram存储器中取走,完成文件读取。本发明实现了对基于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的高可靠线性文件存取方法,包括以下步骤:
[0010]I)初始化分区表;通过初始化获得芯片的属性信息,并对芯片中坏块做好替换准 备;
[0011]2)初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;
[0012]3)根据初始化文件信息,创建新文件;包括以下步骤:[0013]a.检查文件名,进行文件名非法自处纠正;
[0014]b.判断是否存在同名文件,如果不存在同名文件,转入步骤f,否则转入步骤c;
[0015]c.判断是否“自动追加”模式,如果是转入步骤d,否则创建失败;
[0016]d.判断是否文件个数已满,如果已满,则转入步骤f,否则转入步骤e ;
[0017]e.对文件名自动追加后缀序号后,创建添加“后缀序号”的文件;
[0018]f.判断是否是循环模式,如果是循环模式,则删除最老的文件;
[0019]g.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根 据文件的大小更新分区表;
[0020]h.创建完成;
[0021]4)采用顺序地址方式将数据从nand flash的sdram存储器中的缓冲区搬移至分 区中文件指针指向的存储区域,完成文件与入;
[0022]5)将数据从分区读取到nand flash的sdram存储器中,然后从sdram存储器中取 走,完成文件读取。
[0023]按上述方案,所述步骤I)初始化分区表包括以下步骤:
[0024]1.1)通过初始化获得芯片的属性信息:向nand flash发出读ID的命令,将读取 到的nand fIashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯 片的特性信息:block的个数和每block的page数,否则停止后续操作,防止对芯片进行异 常访问;
[0025]1.2)识别nand芯片中的所有坏块:读取nand芯片的每个block的前2个page 的spare区,若该spare区的信息不为Oxff,则该block为坏块;扫描nand芯片的每一个 block,直至识别出所有的坏块,即完成坏块信息的扫描;
[0026]1.3)建立坏块到好块的物理位置的映射关系:建立一张坏块表,即无效块到保留 区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置。保留区设置在 nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证 所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换。在运行中发 现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器 加I ;
[0027]1.4)按照分区时的参数进行分区大小划分。
[0028]按上述方案,步骤4)将数据写入分区前,还包括将数据缓冲至nand flash的 nvram非易失存储器中,并随时做好断点保护的步骤。
[0029]按上述方案,所述步骤4)中,在写入文件时,同时将文件的日志记录到nand flash 的一片nvram存储器中。
[0030]按上述方案,所述步骤4)中,在写入文件时若掉电,当重新上电时,读取nvram存 储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地址,查询到最后写 入的数据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand 的某分区中。
[0031]按上述方案,所述步骤4)中,在写入文件时若掉电,采取以下步骤进行处理:
[0032]4.1)从nvram存储器读取日志数据,判断日志是否正常,若正常则进入步骤4.2);
[0033]4.2)删除被标记需要删除的文件;[0034]4.3)根据日志数据找到断电未关闭的文件,并找到文件断电时的“断点”;
[0035]4.4)判断是否实时写入,如果是则进入步骤4.5),否则进入步骤4.6);
[0036]4.5)读取在nvram中缓冲的文件数据,写入到nand阵列中;进入步骤4.7)
[0037]4.6)处理文件末尾字段,记录文件末尾的地址,写入文件系统分区表中;计算文件 大小、总使用大小、下个可用空间等信息;
[0038]4.7)更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的备 份;
[0039]4.8)更新nvram中的日志信息。
[0040]按上述方案,所述步骤4)中,在文件写入过程中,当写入过程中出现记录错误、擦 除、读出校验等错误时,需要进行块替换时,替换步骤如下:
[0041]7.1)首先将数据从坏块拷贝出,并进行校验修正,存入sdram存储器;
[0042]7.2)从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
[0043]7.3)标记新产生的坏块b,并放入BadTable表中;
[0044]7.4)建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块 a是坏块,需要通过访问块b获取正确的数据;
[0045]7.5)保存新的分区表;
[0046]所述坏块记录表BadTable为记录坏块的位置的记录表,坏块替换表SubstiTable 为记录被映射到坏块位置的好块的位置的记录表。
[0047]本发明产生的有益效果是:
[0048]1、传统文件存取方法基本都是运行在操作系统上调用相应的驱动实现,而在某些 嵌入式应用领域,没有操作系统的支持,对大容量nand flash阵列的数据访问还停留在对 底层芯片IO方式;本发明对大容量nand flash阵列提供一种无需操作系统的文件形式访 问方法,适用于需要一种高可靠性、高效率、方便使用的嵌入式系统中;
[0049]2、文件在nand flash中的记录采用顺序地址方式记录,以并行流水方式操作,提 升数据访问速度;
[0050]3、文件分区表记录在nand flash中,并且分区表多备份,防止文件分区表损坏时 无法修复;
[0051]4、对重名文件有自动添加后缀功能、可连续读取自动添加后缀的文件;
[0052]5、分区数据满后,实现循环记录功能;
[0053]6、实现实时记录功能;
[0054]7、具有断电保护功能,任意时刻掉电保证文件不丢失。
【专利附图】
【附图说明】
[0055]图1是本发明实施例的存取方法使用的硬件原理框图;
[0056]图2是本发明实施例的存取方法的流程图;
[0057]图3是本发明实施例的文件创建的工作流程图;
[0058]图4是本发明实施例的异常掉电文件处理的工作流程图;
[0059]图5是本发明实施例的分区表与文件关系图;
[0060]图6是本发明实施例的某分区的详细描述;[0061 ]图1是本发明实施例的坏块记录表;
[0062]图8是本发明实施例的文件系统整体描述信息表;
[0063]图9是本发明实施例的文件分区表多备份图;
[0064]图10是本发明实施例的分区表更新方法;
[0065]图11是本发明实施例的文件循环写入步骤的工作流程图。
【具体实施方式】
[0066]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对 本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不 用于限定本发明。
[0067]图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中记录的“线索”获取掉电之前的记录状态,根据“线索”将缓冲数据写入文件、关闭未 正常关闭的文件等操作。
[0068]如图2所示:本发明的文件存取方法的步骤如下:
[0069]—种基于nand flash的高可靠线性文件存取方法,本实施例采用的nand flash 包括sdram存储器,nvram非易失存储器和nand flash存储阵列;
[0070]包括以下步骤:
[0071]I)初始化分区表;通过初始化获得芯片的属性信息,并对芯片中坏块做好替换准 备;
[0072]1.1)通过初始化获得芯片的属性信息:向nand flash发出读ID的命令,将读取 到的nand fIashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯 片的特性信息:block的个数和每block的page数,否则停止后续操作,防止对芯片进行异 常访问;
[0073]1.2)识别nand芯片中的所有坏块:读取nand芯片的每个block的前2个page 的spare区,若该spare区的信息不为Oxff,则该block为坏块;扫描nand芯片的每一个 block,直至识别出所有的坏块,即完成坏块信息的扫描;
[0074]1.3)建立坏块到好块的物理位置的映射关系:建立一张坏块表,即无效块到保留 区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置;保留区设置在 nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证 所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换;在运行中发 现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器 加I ;
[0075]1.4)按照分区时的参数进行分区大小划分;[0076]文件写入的编址方式设计如下:
[0077]nand flash的编址米用块(block)、页(page)、单兀(col)三种组合的编址方式;
[0078]由于page编程速度最快,本文件系统采用以page为基本单元进行访问。假设每 个block有M个page组成,以下是对nand flash中的某个单元进行读、写、擦除操作的步骤。。
[0079]当需要读取第i个block的第j个page的第k个col单元内的数据,其访问地址 为第(i*M+j)个page,并将该page读取到缓冲区中,然后从缓冲区中读取第k个数据。
[0080]当需要将数据写入第i个block的第j个page的第k个col单元内时,如果是调 用单col写入函数,即只写I个数据,则数据会直接写入;如果希望写入一批数据,则会首先 将数据写入缓冲区,当缓冲区达到I个page的长度后,调用page写入函数,将数据写入第 (i*M+j)个 page。
[0081]数据的存储采用连续存储方式,即以页(page)为基本访问单元,在一个分区内部, 按照页的地址顺序进行访问。
[0082]2)初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;
[0083]3)根据初始化文件信息,创建新文件;包括以下步骤:
[0084]a.检查文件名,进行文件名非法自处纠正;
[0085]b.判断是否存在同名文件,如果不存在同名文件,转入步骤f,否则转入步骤c;
[0086]c.判断是否“自动追加”模式,如果是转入步骤d,否则创建失败;
[0087]d.判断是否文件个数已满,如果已满,则转入步骤f,否则转入步骤e ;
[0088]e.对文件名自动追加后缀序号后,创建添加“后缀序号”的文件;
[0089]f.判断是否是循环模式,如果是循环模式,则删除最老的文件;
[0090]g.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根 据文件的大小更新分区表;
[0091]h.创建完成;
[0092]4)采用顺序地址方式将数据从nand flash的sdram存储器中的缓冲区搬移至分 区中文件指针指向的存储区域,完成文件与入;
[0093]5)将数据从分区读取到nand flash的sdram存储器中,然后从sdram存储器中取 走,完成文件读取。
[0094]进一步的,步骤4)将数据写入分区前,还包括将数据缓冲至nand flash的nvram 非易失存储器中,并随时做好断点保护的步骤;
[0095]在写入文件时,同时将文件的日志记录到nand flash的一片nvram存储器中;
[0096]在写入文件时若掉电,当重新上电时,读取nvram存储器中的日志数据,通过读取 该部分数据追朔至掉电前数据记录物理地址,查询到最后写入的数据的内容,将未写入至 nand存储器的数据从nvram非易失存储器中重新写入到nand的某分区中。
[0097]步骤4)在写入文件时若掉电,也可以采取以下步骤进行处理:
[0098]4.1)从nvram存储器读取日志数据,判断日志是否正常,若正常则进入步骤4.2);
[0099]4.2)删除被标记需要删除的文件;
[0100]4.3)根据日志数据找到断电未关闭的文件,并找到文件断电时的“断点”;
[0101]4.4)判断是否实时写入,如果是则进入步骤4.5),否则进入步骤4.6);[0102]4.5)读取在nvram中缓冲的文件数据,写入到nand阵列中;进入步骤4.7)
[0103]4.6)处理文件末尾字段,记录文件末尾的地址,写入文件系统分区表中;计算文件 大小、总使用大小、下个可用空间等信息;
[0104]4.7)更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的备 份;
[0105]4.8)更新nvram中的日志信息;
[0106]在文件写入过程中,当写入过程中出现记录错误、擦除、读出校验等错误时,需要 进行块替换时,替换步骤如下:
[0107]7.1)首先将数据从坏块拷贝出,并进行校验修正,存入sdram存储器;
[0108]7.2)从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
[0109]7.3)标记新产生的坏块b,并放入BadTable表中;
[0110]7.4)建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块 a是坏块,需要通过访问块b获取正确的数据;
[0111]7.5)保存新的分区表;
[0112]坏块记录表BadTable为记录坏块的位置的记录表,坏块替换表SubstiTable为记 录被映射到坏块位置的好块的位置的记录表。
[0113]进一步的,步骤3)中文件创建流程图如图3所示。文件创建的步骤是:
[0114]1.进行文件名非法自处纠正;
[0115]因为文件名只能是字符或数字,不允许超过20字符,故需要对文件名进行合法性 检测,去除非法字符;
[0116]2.判断是否存在同名文件,如果不存在同名文件,转入步骤6,否则转入步骤3;
[0117]3.判断是否“自动追加”模式,如果是转入步骤4,否则创建失败;
[0118]4.判断是否文件个数已满,如果已满,则转入步骤6,否则转入步骤5 ;
[0119]5.创建添加“后缀序号”的文件;
[0120]6.需要判断是否是循环模式(可删除文件),如果是循环模式,则删除最老的文件;
[0121]7.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根 据文件的大小更新分区表;
[0122]8.创建完成。
[0123]本方法的高可靠性主要表现在防掉电设计中,即任意时刻掉电保证文件不丢失, 数据损失最少。完成异常掉电文件的处理需要在写入文件时,同时记录文件的日志到一片 nvram存储器中。nvram存储器掉电后数据能保存,下次再上电后仍可读取日志数据,通过 读取该部分数据即可追朔至掉电前数据记录至何处,从而保证数据丢失最少(保证只要数 据被记录到物理存储器中即可被找到)。在本发明的实时记录模式下,数据缓冲为非易失的 nvram存储器,掉电后该部分缓冲的数据也不会丢失,重新上电后该部分数据可以被识别, 并记录到nand阵列的文件中,可以保证数据不会发生任何字节丢失。
[0124]如图4所示,若写入文件时掉电,重新上电后,进入以下处理流程:
[0125]从nvram存储器读取日志数据,判断日志是否正常(校验码是否正确),若正常则 进入步骤2,否则进入灾难恢复流程(通过扫描文件系统的特殊区域实现恢复),如果恢复成 功,则进入步骤2,否则重新生成一个日志记录(可能造成部分数据丢失);[0126]删除被标记需要删除的文件,删除完成进入步骤3。为了保证文件访问的实时性, 文件的删除工作在文件记录阶段是不运行的,否则会造成一定时间(2ms)内文件系统不响 应命令,影响系统的实时性。在循环写入模式下,需要自动删除“最旧”的文件,但删除动作 只是在nvram日志中做标记,等下次上电初始化时再删除;
[0127]找到断电未关闭的文件,并找到文件断电时的“断点”,进入步骤4;
[0128]判断是否实时写入,如果是则进入步骤5,否则进入步骤6 ;
[0129]读取在nvram中缓冲的数据,写入到nand阵列中。因为实时模式下,nvram是作 为缓存的,掉电后缓存的数据仍然可用,需要将数据写入到nand阵列中,为了尽量不丢失 数据;
[0130]处理文件末尾字段,记录文件末尾的地址,写入文件系统分区表中;
[0131]计算文件大小、总使用大小、下个可用空间等信息;
[0132]更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的三个备 份;
[0133]更新nvram中的日志信息。
[0134]当写入文件时,nvram会记录当前访问的位置信息,即断点信息,当掉电后, 通过读取该断点信息,可知道最近一次访问的位置,继而对断电的文件继续进行操作。 PartitionInNvStruct是nvram中记录的某一个分区正在使用的情况,包括:当前访问的单 元(raidpage)、单元内的偏移位置、当前访问的文件序号、是否进入循环的标志等信息。
[0135]由于nvram记录的数据是非常重要的数据,它的正确性要求非常高。本方法为 nvram设计了 ecc校验机制与多备份机制。Ecc校验可纠Ibit错;多备份可弥补ecc无法 纠正的情况,从设计角度可将nvram出现错误的概率降至最低。
[0136]坏块替换步骤,根据好块/坏块替换表替换无效数据块;
[0137]坏块记录表的结构如图1所示,坏块记录表BadTable记录了坏块的位置,坏块替 换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文 件系统保留的处于nand flash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生 的坏块。替换表SubstiTable保留了总有效块的3%的区域作为替换块。当写入过程中出 现记录错误、擦除、读出校验等错误,需要进行块替换时,操作步骤如下:
[0138]首先将数据从坏块拷贝出,并进行校验修正,存入sdram存储器;
[0139]从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
[0140]标记新产生的坏块b,并放入BadTable表中;
[0141]建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是 坏块,需要通过访问块b获取正确的数据;
[0142]保存新的分区表。
[0143]本方法还设计了循环写入功能,用于分区空间满时,自动删除最旧文件并写入新 文件;但在要求实时性非常高的应用中,删除文件时如果擦除文件所占的空间会造成较长 时间无法记录数据。解决该问题的方法是删除文件时,只是将它从分区表中删除,在数据记 录到删除的文件所占的空间时再进行擦除,即“边写边擦”。循环写入从原理上看很简单,但 由于nand存储器的特性,擦除是非常耗费时间的,即使是删除文件这种简单操作,也需要 花费若干毫秒(ms)的时间,这对实时系统是不能允许的。本文件系统使用了一种方法,在非易失存储器(nvram)中记录着需要更新的分区表的简要信息(类似索引信息)以及需要被 删除的文件索引号,当系统不繁忙时或重新初始化时,根据nvram中记录的简要信息,完成 分区表的更新、文件的删除,从而不影响系统的实时性,保持数据吞吐的稳定性。
[0144]文件循环写入的工作流程图如图11,工作步骤为:
[0145]创建文件,步骤流程为“文件创建子模块”工作流程;
[0146]判断写入模式(文件创建时由输入参数确定写入模式),如果是实时写入模式,则 修改缓冲区指针,指向nvram区,写入的数据可保证不丢失;如果是普通模式,则将缓冲区 指针指向sdram。由于sdram访问速度快,容量大,适合批量数据的存储,nvram容量小,速 度稍慢,可保证数据不丢失;
[0147]判断nand阵列中是否有空间可写入。如果没有空间可写入,在进入步骤4 ;
[0148]判断是否是循环写入模式,如果不是循环写入模式,则直接返回,丢弃数据;如果 是循环模式,则对最旧的文件进行删除,腾出空间,继续写入,进入步骤5 ;
[0149]判断缓冲区是否已满,如果已满则将缓冲区数据写入nand阵列,并释放缓冲区; 如果未满直接将数据写入缓冲区;
[0150]更新文件指针、更新将断点日志记录,存入nvram存储器。
[0151]本方法还设计了文件实时写入功能,用于将数据写入分区前先缓冲至nvram非易 失存储器中,实时将数据写入分区中;
[0152]文件的实时写入与普通缓冲式写入的区别在于记录数据的缓冲不同,并且掉电后 的处理方法不同。由于nand flash不同于普通的随机存储器(SRAM),对nand flash的基 本存储单元page的访问是有次数限制的,一般厂家规定擦除page后,对page内最多进行 4次写入操作。对于比较重要的数据,一般不希望数据有任何的丢失发生,希望数据随时被 记录到存储器中,然而又有“对page内最多进行4次写入操作”的限制,不可能随时写入, 这两者就存在了矛盾。解决矛盾的方法就是采用缓存,而普通的随机存储器SRAM做缓存掉 电后数据就会丢失,本文件系统采用了 nvram缓存数据的方式,并随时做好断点保护,以便 断电后能将数据的损失降至最低。文件的缓冲存于非易失的nvram存储器中,当掉电重新 上电时,初始化函数根据未关闭的文件“日志”记录,可以查询到最后写入的数据的内容,将 未写入至nand存储器的数据重新写入到nand的某分区中。
[0153]文件实时写入的工作步骤为:
[0154]1、将数据写入分区前先缓冲至nvram非易失存储器中,并随时做好断点保护;
[0155]2、将数据写入分区中;
[0156]3、若掉电,当重新上电时,根据未关闭的文件“日志”记录,可以查询到最后写入的 数据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand的 某分区中。
[0157]进一步的,本方法还可以加入重名文件处理功能,用于在同一分区中创建同名文 件的处理。
[0158]本方法还设计了文件名自动追加功能。在常见的文件系统中,在一个目录下创建 同名的文件是不被允许的,而本方法中可以允许创建同名文件,其处理方法是在文件名后 自动加上如“_1”、“_2”、“_3”等后缀。在嵌入式系统中,通常程序软件是固化在FLASH中, 程序软件一般不会经常改动,而在嵌入式系统中能使用的资源十分有限,无法获得动态变化的文件名。针对嵌入式系统的特点,本文件系统设计了文件名自动追加功能。
[0159]当需要在一个分区内创建已经存在的文件时,首先扫描分区表中该分区的所有文 件,找到该已经存在的文件,在该文件的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,依此类推可连续读取若干文件。这种读取方式下,固化好的用户 代码不需要改动,即可每次重新上电创建一个新文件记录数据,读取数据时可选择读取某 个文件或是连续读取所有的文件。
[0160]进一步的,本发明采用的nand flash为多个nand flash组成的多片并行nand flash。
[0161]通常nand flash是8bit位宽的存储器,而CPU处理器通常是16bit、32bit、64bit 处理器,可以通过将多个nand flash拼在一起的方式,提高系统的性能。
[0162]本实施例的“分区表”设计:
[0163]分区表分为三个部分:
[0164]1.包含指定分区的文件信息的数据结构PartitionDescription ;
[0165]2.包含坏块信息以及替换查找表的BadTable ;
[0166]3.记录其它分区整理信息的DiskDetail ;
[0167]分区文件信息分2个部分,分区概况信息与每个文件信息。分区表与文件关系如 图5所示。分区概况信息记录着分区的起始地址、分区大小、使用大小、结束标志、擦除标 志、当前访问文件序号等信息。通过分区的概况信息,可获得以下信息:可在哪里创建新文 件、上次写入的文件是否正常关闭等信息,以便进行创建新文件、掉电保护等操作。
[0168]文件信息的数据结构PartitionDescription包含了某个分区的全部文件的信 息,包括该分区的始末地址,分区大小、文件个数、使用空间、未用空间、文件指针等信息,如 图6所示。
[0169]坏块记录表的结构如图7所示,坏块记录表BadTable记录了坏块的位置,坏块替 换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文 件系统保留的处于nand flash末尾的一些好块,被用于替换出厂坏块以及后续运行时产 生的坏块。
[0170]文件整体描述信息表如图8所示,该信息表记录了存储区的大小、已使用大小、分 区个数、总坏块个数、是否掉电、分区完整标志等信息。
[0171]如图9所示,文件分区表多备份方法如下:
[0172]分区表存储在从固态盘开始的128block中查找好的3块,作为3备份分区的存 放。分区表的存放规则是3备份分开存放:0备份放置在0?39,I备份放置在40?79,2 备份放置在80?127。0备份只能放在0?39,当出现某分区表异常时,根据出错情况判 断是出现记录bit错误或是记录时断电,当出现记录bit错误时,标记为坏块并自动向后替 换。在初始化找分区表时,根据备份区的坏块标记,找到分区表。根据找到的三个分区表的“新旧状况”找到最新、校验正确的分区表。
[0173]对于记录分区表的存储单元,每个分区表都有一段ECC校验值(每512字节生产I 个ecc校验码),并与分区表存放在一起。分区表更新方法如图10所示,当出现ECC校验错 误时,判断是否能纠正,若能纠正则使用该分区表,并将该block标记为坏块,以防出现不 可纠正的错误。对于出现ECC校验错误时就标记为坏块的做法的原因,是考虑到本文件系 统是使用在高可靠系统中,任何数据都可能是非常重要的。分区表更新方法如图10所示。
[0174]应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换, 而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
【权利要求】
1.一种基于nand flash的高可靠线性文件存取方法,其特征在于,包括以下步骤:1)初始化分区表;通过初始化获得芯片的属性信息,并对芯片中坏块做好替换准备;2)初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;3)根据初始化文件信息,创建新文件;包括以下步骤:a.检查文件名,进行文件名非法自处纠正;b.判断是否存在同名文件,如果不存在同名文件,转入步骤f,否则转入步骤c;c.判断是否“自动追加”模式,如果是转入步骤d,否则创建失败;d.判断是否文件个数已满,如果已满,则转入步骤f,否则转入步骤e;e.对文件名自动追加后缀序号后,创建添加“后缀序号”的文件;f.判断是否是循环模式,如果是循环模式,则删除最老的文件;g.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表;h.创建完成;4)采用顺序地址方式将数据从nandflash的sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;5)将数据从分区读取到nand flash的sdram存储器中,然后从sdram存储器中取走, 完成文件读取。
2.根据权利要求1所述的基于nandflash的高可靠线性文件存取方法,其特征在于, 所述步骤I)初始化分区表包括以下步骤:.1.1)通过初始化获得芯片的属性信息:向nand flash发出读ID的命令,将读取到的 nand flashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯片的特性信息:block的个数和每block的page数,否则停止后续操作,防止对芯片进行异常访问;.1.2)识别nand芯片中的所有坏块:读取nand芯片的每个block的前2个page的spare 区,若该spare区的信息不为Oxff,则该block为坏块;扫描nand芯片的每一个block,直至识别出所有的坏块,即完成坏块信息的扫描;.1.3)建立坏块到好块的物理位置的映射关系:建立一张坏块表,即无效块到保留区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置;保留区设置在nand 芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换;在运行中发现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器加I ;.1.4)按照分区时的参数进行分区大小划分。
3.根据权利要求1所述的基于nandflash的高可靠线性文件存取方法,其特征在于, 步骤4)将数据写入分区前,还包括将数据缓冲至nand flash的nvram非易失存储器中,并随时做好断点保护的步骤。
4.根据权利要求1或3所述的基于nandflash的高可靠线性文件存取方法,其特征在于,所述步骤4)中,在写入文件时,同时将文件的日志记录到nand flash的一片nvram存储器中。
5.根据权利要求4所述的基于nandflash的高可靠线性文件存取方法,其特征在于,所述步骤4)中,在写入文件时若掉电,当重新上电时,读取nvram存储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地址,查询到最后写入的数据的内容,将未写入至nand存储器的数据从nvram非易失存储器中重新写入到nand的某分区中。
6.根据权利要求4所述的基于nandflash的高可靠线性文件存取方法,其特征在于, 所述步骤4)中,在写入文件时若掉电,采取以下步骤进行处理:4.1)从nvram存储器读取日志数据,判断日志是否正常,若正常则进入步骤4.2);4.2)删除被标记需要删除的文件;4.3)根据日志数据找到断电未关闭的文件,并找到文件断电时的“断点”;4.4)判断是否实时写入,如果是则进入步骤4.5),否则进入步骤4.6);4.5)读取在nvram中缓冲的文件数据,写入到nand阵列中;进入步骤4.7)4.6)处理文件末尾字段,记录文件末尾的地址,写入文件系统分区表中;计算文件大小、总使用大小、下个可用空间等信息;4.7)更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的备份;4.8)更新nvram中的日志信息。
7.根据权利要求2所述的基于nandflash的高可靠线性文件存取方法,其特征在于, 所述步骤4)中,在文件写入过程中,当写入过程中出现记录错误、擦除、读出校验等错误时, 需要进行块替换时,替换步骤如下:7.1)首先将数据从坏块拷贝出,并进行校验修正,存入sdram存储器;7.2)从替换表SubstiTable中取出的第一个块a,将数据拷入其中;7.3)标记新产生的坏块b,并放入BadTable表中;7.4)建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是坏块,需要通过访问块b获取正确的数据;7.5)保存新的分区表;所述坏块记录表BadTable为记录坏块的位置的记录表,坏块替换表SubstiTable为记录被映射到坏块位置的好块的位置的记录表。
【文档编号】G06F12/16GK103577121SQ201310541024
【公开日】2014年2月12日 申请日期:2013年11月5日 优先权日:2013年11月5日
【发明者】袁松, 毛先俊, 何冲 申请人:中船重工(武汉)凌久电子有限责任公司