CN103577121B - 一种基于Nand Flash的高可靠线性文件存取方法 - Google Patents
一种基于Nand Flash的高可靠线性文件存取方法 Download PDFInfo
- Publication number
- CN103577121B CN103577121B CN201310541024.3A CN201310541024A CN103577121B CN 103577121 B CN103577121 B CN 103577121B CN 201310541024 A CN201310541024 A CN 201310541024A CN 103577121 B CN103577121 B CN 103577121B
- Authority
- CN
- China
- Prior art keywords
- file
- block
- data
- bad block
- nandflash
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本发明公开了一种基于Nand Flash的高可靠线性文件存取方法,Nand Flash包括Sdram存储器,Nvram非易失存储器和Nand Flash存储阵列;存取方法包括以下步骤:初始化分区表;初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;根据初始化文件信息,创建新文件;采用顺序地址方式将数据从Nand Flash的Sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;将数据从分区读取到Nand Flash的Sdram存储器中,然后从Sdram存储器中取走,完成文件读取。本发明实现了对基于Nand Flash的设备的文件存取管理,具有效率高、以文件方式实现数据存取等特点。<!-- 2 -->
Description
技术领域
本发明涉及计算机存储领域,尤其涉及一种基于NandFlash的高可靠线性文件存取方法。
背景技术
NandFlash是一种大容量的存储芯片,其特点是容量密度大,制造成本低,访问速度快,通常作为U盘、固态盘、存储卡等设备上的存储芯片,但其也存在一些不足:它属于地址、数据共用类型访问方式,访问相对麻烦,它由于本身出厂是就存在坏块,需要“跳过”坏块进行访问,需要专门的管理方法进行块的管理。目前对数据的管理主要分以下两种方式:
(1)无文件***方式访问,使用者需调用函数对存储单元进行直接操作,实现难度低,但使用难度高;
(2)文件***方式访问,使用者以文件的方式对存储***进行访问,实现难度高,但使用难度低。
文件***的优点在于不需要使用者关注数据的存放位置,文件***来管理数据,屏蔽了物理介质的不同。由于文件***对使用者实现数据管理的透明,完全接管数据的存储,一旦文件***崩溃会导致数据丢失,所以对文件***的可靠性要求较高,能经受长时间的考验。
本发明涉及一种基于NandFlash的高可靠线性文件***的软件。用于由NandFlash组成的存储阵列中实现以文件的方式进行访问管理。本文件***与windows上使用的文件***不同,windows等操作***上使用的文件***属于“基于页表结构”形式,而本文件***属于线性文件***。所谓“线性文件***”是指数据记录在顺序的地址单元中,而常见的文件***都是“基于页表结构”形式,即数据记录在不连续的地址单元中,各地址单元通过一个链表相连接。线性文件***的特点是管理简单,记录效率高,而常见页表形式的文件***管理页表较复杂,无掉电保护特性,效率稍低。本发明非常适合于需要一种高可靠性、高效率、方便使用的记录设备的环境下。
发明内容
本发明要解决的技术问题在于针对上述现有技术中的缺陷,提供一种基于NandFlash的高可靠线性文件***及线性文件存取方法。
本发明解决其技术问题所采用的技术方案是:
一种基于NandFlash的高可靠线性文件存取方法,包括以下步骤:
1)初始化分区表;通过初始化获得芯片的属性信息,并对芯片中坏块做好替换准备;
2)初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;
3)根据初始化文件信息,创建新文件;包括以下步骤:
a.检查文件名,进行文件名非法自处纠正;
b.判断是否存在同名文件,如果不存在同名文件,转入步骤f,否则转入步骤c;
c.判断是否“自动追加”模式,如果是转入步骤d,否则创建失败;
d.判断是否文件个数已满,如果已满,则转入步骤f,否则转入步骤e;
e.对文件名自动追加后缀序号后,创建添加“后缀序号”的文件;
f.判断是否是循环模式,如果是循环模式,则删除最老的文件;
g.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表;
h.创建完成;
4)采用顺序地址方式将数据从NandFlash的Sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;
5)将数据从分区读取到NandFlash的Sdram存储器中,然后从Sdram存储器中取走,完成文件读取。
按上述方案,所述步骤1)初始化分区表包括以下步骤:
1.1)通过初始化获得芯片的属性信息:向NandFlash发出读ID的命令,将读取到的NandFlashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯片的特性信息:block的个数和每block的page数,否则停止后续操作,防止对芯片进行异常访问;
1.2)识别nand芯片中的所有坏块:读取nand芯片的每个block的前2个page的spare区,若该spare区的信息不为0xff,则该block为坏块;扫描nand芯片的每一个block,直至识别出所有的坏块,即完成坏块信息的扫描;
1.3)建立坏块到好块的物理位置的映射关系:建立一张坏块表,即无效块到保留区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置。保留区设置在nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换。在运行中发现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器加1;
1.4)按照分区时的参数进行分区大小划分。
按上述方案,步骤4)将数据写入分区前,还包括将数据缓冲至NandFlash的Nvram非易失存储器中,并随时做好断点保护的步骤。
按上述方案,所述步骤4)中,在写入文件时,同时将文件的日志记录到NandFlash的一片Nvram存储器中。
按上述方案,所述步骤4)中,在写入文件时若掉电,当重新上电时,读取Nvram存储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地址,查询到最后写入的数据的内容,将未写入至nand存储器的数据从Nvram非易失存储器中重新写入到nand的某分区中。
按上述方案,所述步骤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中的日志信息。
按上述方案,所述步骤4)中,在文件写入过程中,当写入过程中出现记录错误、擦除、读出校验等错误时,需要进行块替换时,替换步骤如下:
7.1)首先将数据从坏块拷贝出,并进行校验修正,存入Sdram存储器;
7.2)从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
7.3)标记新产生的坏块b,并放入BadTable表中;
7.4)建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是坏块,需要通过访问块b获取正确的数据;
7.5)保存新的分区表;
所述坏块记录表BadTable为记录坏块的位置的记录表,坏块替换表SubstiTable为记录被映射到坏块位置的好块的位置的记录表。
本发明产生的有益效果是:
1、传统文件存取方法基本都是运行在操作***上调用相应的驱动实现,而在某些嵌入式应用领域,没有操作***的支持,对大容量NandFlash阵列的数据访问还停留在对底层芯片IO方式;本发明对大容量NandFlash阵列提供一种无需操作***的文件形式访问方法,适用于需要一种高可靠性、高效率、方便使用的嵌入式***中;
2、文件在NandFlash中的记录采用顺序地址方式记录,以并行流水方式操作,提升数据访问速度;
3、文件分区表记录在NandFlash中,并且分区表多备份,防止文件分区表损坏时无法修复;
4、对重名文件有自动添加后缀功能、可连续读取自动添加后缀的文件;
5、分区数据满后,实现循环记录功能;
6、实现实时记录功能;
7、具有断电保护功能,任意时刻掉电保证文件不丢失。
附图说明
图1是本发明实施例的存取方法使用的硬件原理框图;
图2是本发明实施例的存取方法的流程图;
图3是本发明实施例的文件创建的工作流程图;
图4是本发明实施例的异常掉电文件处理的工作流程图;
图5是本发明实施例的分区表与文件关系图;
图6是本发明实施例的某分区的详细描述;
图7是本发明实施例的坏块记录表;
图8是本发明实施例的文件***整体描述信息表;
图9是本发明实施例的文件分区表多备份图;
图10是本发明实施例的分区表更新方法;
图11是本发明实施例的文件循环写入步骤的工作流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
图1为本发明的NandFlash文件***存取方法使用的硬件原理框图。图1中,CPU处理器1连接数据总线6与数据接口7,CPU处理器1在FS(file-system)文件***2的调度下,负责将数据从数据接口7搬移至NandFlash存储阵列5或将数据从NandFlash存储阵列5搬移至数据接口7。SDRAM存储器3用于CPU处理器1的数据缓冲,NVRAM非易失存储器4用于记录CPU处理器1搬移数据至NandFlash存储阵列5过程中的“步骤记录”,“步骤记录”是指数据被搬移至哪里、是否记录完成、以及部分缓冲数据等信息,以便保证数据记录的“线索”不丢失。***掉电重新上电后,CPU处理器1根据NVRAM非易失存储器4中记录的“线索”获取掉电之前的记录状态,根据“线索”将缓冲数据写入文件、关闭未正常关闭的文件等操作。
如图2所示:本发明的文件存取方法的步骤如下:
一种基于NandFlash的高可靠线性文件存取方法,本实施例采用的NandFlash包括Sdram存储器,Nvram非易失存储器和NandFlash存储阵列;
包括以下步骤:
1)初始化分区表;通过初始化获得芯片的属性信息,并对芯片中坏块做好替换准备;
1.1)通过初始化获得芯片的属性信息:向NandFlash发出读ID的命令,将读取到的NandFlashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯片的特性信息:block的个数和每block的page数,否则停止后续操作,防止对芯片进行异常访问;
1.2)识别nand芯片中的所有坏块:读取nand芯片的每个block的前2个page的spare区,若该spare区的信息不为0xff,则该block为坏块;扫描nand芯片的每一个block,直至识别出所有的坏块,即完成坏块信息的扫描;
1.3)建立坏块到好块的物理位置的映射关系:建立一张坏块表,即无效块到保留区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置;保留区设置在nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换;在运行中发现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器加1;
1.4)按照分区时的参数进行分区大小划分;
文件写入的编址方式设计如下:
NandFlash的编址采用块(block)、页(page)、单元(col)三种组合的编址方式;
由于page编程速度最快,本文件***采用以page为基本单元进行访问。假设每个block有M个page组成,以下是对NandFlash中的某个单元进行读、写、擦除操作的步骤。。
当需要读取第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)为基本访问单元,在一个分区内部,按照页的地址顺序进行访问。
2)初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;
3)根据初始化文件信息,创建新文件;包括以下步骤:
a.检查文件名,进行文件名非法自处纠正;
b.判断是否存在同名文件,如果不存在同名文件,转入步骤f,否则转入步骤c;
c.判断是否“自动追加”模式,如果是转入步骤d,否则创建失败;
d.判断是否文件个数已满,如果已满,则转入步骤f,否则转入步骤e;
e.对文件名自动追加后缀序号后,创建添加“后缀序号”的文件;
f.判断是否是循环模式,如果是循环模式,则删除最老的文件;
g.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表;
h.创建完成;
4)采用顺序地址方式将数据从NandFlash的Sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;
5)将数据从分区读取到NandFlash的Sdram存储器中,然后从Sdram存储器中取走,完成文件读取。
进一步的,步骤4)将数据写入分区前,还包括将数据缓冲至NandFlash的Nvram非易失存储器中,并随时做好断点保护的步骤;
在写入文件时,同时将文件的日志记录到NandFlash的一片Nvram存储器中;
在写入文件时若掉电,当重新上电时,读取Nvram存储器中的日志数据,通过读取该部分数据追朔至掉电前数据记录物理地址,查询到最后写入的数据的内容,将未写入至nand存储器的数据从Nvram非易失存储器中重新写入到nand的某分区中。
步骤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.1)首先将数据从坏块拷贝出,并进行校验修正,存入Sdram存储器;
7.2)从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
7.3)标记新产生的坏块b,并放入BadTable表中;
7.4)建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是坏块,需要通过访问块b获取正确的数据;
7.5)保存新的分区表;
坏块记录表BadTable为记录坏块的位置的记录表,坏块替换表SubstiTable为记录被映射到坏块位置的好块的位置的记录表。
进一步的,步骤3)中文件创建流程图如图3所示。文件创建的步骤是:
1.进行文件名非法自处纠正;
因为文件名只能是字符或数字,不允许超过20字符,故需要对文件名进行合法性检测,去除非法字符;
2.判断是否存在同名文件,如果不存在同名文件,转入步骤6,否则转入步骤3;
3.判断是否“自动追加”模式,如果是转入步骤4,否则创建失败;
4.判断是否文件个数已满,如果已满,则转入步骤6,否则转入步骤5;
5.创建添加“后缀序号”的文件;
6.需要判断是否是循环模式(可删除文件),如果是循环模式,则删除最老的文件;
7.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表;
8.创建完成。
本方法的高可靠性主要表现在防掉电设计中,即任意时刻掉电保证文件不丢失,数据损失最少。完成异常掉电文件的处理需要在写入文件时,同时记录文件的日志到一片Nvram存储器中。Nvram存储器掉电后数据能保存,下次再上电后仍可读取日志数据,通过读取该部分数据即可追朔至掉电前数据记录至何处,从而保证数据丢失最少(保证只要数据被记录到物理存储器中即可被找到)。在本发明的实时记录模式下,数据缓冲为非易失的Nvram存储器,掉电后该部分缓冲的数据也不会丢失,重新上电后该部分数据可以被识别,并记录到nand阵列的文件中,可以保证数据不会发生任何字节丢失。
如图4所示,若写入文件时掉电,重新上电后,进入以下处理流程:
从Nvram存储器读取日志数据,判断日志是否正常(校验码是否正确),若正常则进入步骤2,否则进入灾难恢复流程(通过扫描文件***的特殊区域实现恢复),如果恢复成功,则进入步骤2,否则重新生成一个日志记录(可能造成部分数据丢失);
删除被标记需要删除的文件,删除完成进入步骤3。为了保证文件访问的实时性,文件的删除工作在文件记录阶段是不运行的,否则会造成一定时间(2ms)内文件***不响应命令,影响***的实时性。在循环写入模式下,需要自动删除“最旧”的文件,但删除动作只是在Nvram日志中做标记,等下次上电初始化时再删除;
找到断电未关闭的文件,并找到文件断电时的“断点”,进入步骤4;
判断是否实时写入,如果是则进入步骤5,否则进入步骤6;
读取在Nvram中缓冲的数据,写入到nand阵列中。因为实时模式下,Nvram是作为缓存的,掉电后缓存的数据仍然可用,需要将数据写入到nand阵列中,为了尽量不丢失数据;
处理文件末尾字段,记录文件末尾的地址,写入文件***分区表中;
计算文件大小、总使用大小、下个可用空间等信息;
更新分区表,即保存分区表到nand阵列中,计算校验码,并保存分区表的三个备份;
更新Nvram中的日志信息。
当写入文件时,Nvram会记录当前访问的位置信息,即断点信息,当掉电后,通过读取该断点信息,可知道最近一次访问的位置,继而对断电的文件继续进行操作。PartitionInNvStruct是Nvram中记录的某一个分区正在使用的情况,包括:当前访问的单元(raidpage)、单元内的偏移位置、当前访问的文件序号、是否进入循环的标志等信息。
由于Nvram记录的数据是非常重要的数据,它的正确性要求非常高。本方法为Nvram设计了ecc校验机制与多备份机制。Ecc校验可纠1bit错;多备份可弥补ecc无法纠正的情况,从设计角度可将Nvram出现错误的概率降至最低。
坏块替换步骤,根据好块/坏块替换表替换无效数据块;
坏块记录表的结构如图7所示,坏块记录表BadTable记录了坏块的位置,坏块替换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文件***保留的处于NandFlash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生的坏块。替换表SubstiTable保留了总有效块的3%的区域作为替换块。当写入过程中出现记录错误、擦除、读出校验等错误,需要进行块替换时,操作步骤如下:
首先将数据从坏块拷贝出,并进行校验修正,存入Sdram存储器;
从替换表SubstiTable中取出的第一个块a,将数据拷入其中;
标记新产生的坏块b,并放入BadTable表中;
建立块a与块b的映射关系,当访问地址处于块a时,会通过查找表,发现块a是坏块,需要通过访问块b获取正确的数据;
保存新的分区表。
本方法还设计了循环写入功能,用于分区空间满时,自动删除最旧文件并写入新文件;但在要求实时性非常高的应用中,删除文件时如果擦除文件所占的空间会造成较长时间无法记录数据。解决该问题的方法是删除文件时,只是将它从分区表中删除,在数据记录到删除的文件所占的空间时再进行擦除,即“边写边擦”。循环写入从原理上看很简单,但由于nand存储器的特性,擦除是非常耗费时间的,即使是删除文件这种简单操作,也需要花费若干毫秒(ms)的时间,这对实时***是不能允许的。本文件***使用了一种方法,在非易失存储器(Nvram)中记录着需要更新的分区表的简要信息(类似索引信息)以及需要被删除的文件索引号,当***不繁忙时或重新初始化时,根据Nvram中记录的简要信息,完成分区表的更新、文件的删除,从而不影响***的实时性,保持数据吞吐的稳定性。
文件循环写入的工作流程图如图11,工作步骤为:
创建文件,步骤流程为“文件创建子模块”工作流程;
判断写入模式(文件创建时由输入参数确定写入模式),如果是实时写入模式,则修改缓冲区指针,指向Nvram区,写入的数据可保证不丢失;如果是普通模式,则将缓冲区指针指向Sdram。由于Sdram访问速度快,容量大,适合批量数据的存储,Nvram容量小,速度稍慢,可保证数据不丢失;
判断nand阵列中是否有空间可写入。如果没有空间可写入,在进入步骤4;
判断是否是循环写入模式,如果不是循环写入模式,则直接返回,丢弃数据;如果是循环模式,则对最旧的文件进行删除,腾出空间,继续写入,进入步骤5;
判断缓冲区是否已满,如果已满则将缓冲区数据写入nand阵列,并释放缓冲区;如果未满直接将数据写入缓冲区;
更新文件指针、更新将断点日志记录,存入Nvram存储器。
本方法还设计了文件实时写入功能,用于将数据写入分区前先缓冲至Nvram非易失存储器中,实时将数据写入分区中;
文件的实时写入与普通缓冲式写入的区别在于记录数据的缓冲不同,并且掉电后的处理方法不同。由于NandFlash不同于普通的随机存储器(SRAM),对NandFlash的基本存储单元page的访问是有次数限制的,一般厂家规定擦除page后,对page内最多进行4次写入操作。对于比较重要的数据,一般不希望数据有任何的丢失发生,希望数据随时被记录到存储器中,然而又有“对page内最多进行4次写入操作”的限制,不可能随时写入,这两者就存在了矛盾。解决矛盾的方法就是采用缓存,而普通的随机存储器SRAM做缓存掉电后数据就会丢失,本文件***采用了Nvram缓存数据的方式,并随时做好断点保护,以便断电后能将数据的损失降至最低。文件的缓冲存于非易失的Nvram存储器中,当掉电重新上电时,初始化函数根据未关闭的文件“日志”记录,可以查询到最后写入的数据的内容,将未写入至nand存储器的数据重新写入到nand的某分区中。
文件实时写入的工作步骤为:
1、将数据写入分区前先缓冲至Nvram非易失存储器中,并随时做好断点保护;
2、将数据写入分区中;
3、若掉电,当重新上电时,根据未关闭的文件“日志”记录,可以查询到最后写入的数据的内容,将未写入至nand存储器的数据从Nvram非易失存储器中重新写入到nand的某分区中。
进一步的,本方法还可以加入重名文件处理功能,用于在同一分区中创建同名文件的处理。
本方法还设计了文件名自动追加功能。在常见的文件***中,在一个目录下创建同名的文件是不被允许的,而本方法中可以允许创建同名文件,其处理方法是在文件名后自动加上如“_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,依此类推可连续读取若干文件。这种读取方式下,固化好的用户代码不需要改动,即可每次重新上电创建一个新文件记录数据,读取数据时可选择读取某个文件或是连续读取所有的文件。
进一步的,本发明采用的NandFlash为多个NandFlash组成的多片并行NandFlash。
通常NandFlash是8bit位宽的存储器,而CPU处理器通常是16bit、32bit、64bit处理器,可以通过将多个NandFlash拼在一起的方式,提高***的性能。
本实施例的“分区表”设计:
分区表分为三个部分:
1.包含指定分区的文件信息的数据结构PartitionDescription;
2.包含坏块信息以及替换查找表的BadTable;
3.记录其它分区整理信息的DiskDetail;
分区文件信息分2个部分,分区概况信息与每个文件信息。分区表与文件关系如图5所示。分区概况信息记录着分区的起始地址、分区大小、使用大小、结束标志、擦除标志、当前访问文件序号等信息。通过分区的概况信息,可获得以下信息:可在哪里创建新文件、上次写入的文件是否正常关闭等信息,以便进行创建新文件、掉电保护等操作。
文件信息的数据结构PartitionDescription包含了某个分区的全部文件的信息,包括该分区的始末地址,分区大小、文件个数、使用空间、未用空间、文件指针等信息,如图6所示。
坏块记录表的结构如图7所示,坏块记录表BadTable记录了坏块的位置,坏块替换表SubstiTable记录了被映射到坏块位置的好块的位置。坏块替换表SubstiTable是文件***保留的处于NandFlash末尾的一些好块,被用于替换出厂坏块以及后续运行时产生的坏块。
文件整体描述信息表如图8所示,该信息表记录了存储区的大小、已使用大小、分区个数、总坏块个数、是否掉电、分区完整标志等信息。
如图9所示,文件分区表多备份方法如下:
分区表存储在从固态盘开始的128block中查找好的3块,作为3备份分区的存放。分区表的存放规则是3备份分开存放:0备份放置在0~39,1备份放置在40~79,2备份放置在80~127。0备份只能放在0~39,当出现某分区表异常时,根据出错情况判断是出现记录bit错误或是记录时断电,当出现记录bit错误时,标记为坏块并自动向后替换。在初始化找分区表时,根据备份区的坏块标记,找到分区表。根据找到的三个分区表的“新旧状况”找到最新、校验正确的分区表。
对于记录分区表的存储单元,每个分区表都有一段ECC校验值(每512字节生产1个ecc校验码),并与分区表存放在一起。分区表更新方法如图10所示,当出现ECC校验错误时,判断是否能纠正,若能纠正则使用该分区表,并将该block标记为坏块,以防出现不可纠正的错误。对于出现ECC校验错误时就标记为坏块的做法的原因,是考虑到本文件***是使用在高可靠***中,任何数据都可能是非常重要的。分区表更新方法如图10所示。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
Claims (7)
1.一种基于NandFlash的高可靠线性文件存取方法,其特征在于,包括以下步骤:
1)初始化分区表;通过初始化获得芯片的属性信息,并对芯片中坏块做好替换准备;
2)初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;
3)根据初始化文件信息,创建新文件;包括以下步骤:
a.检查文件名,进行文件名非法自处纠正;
b.判断是否存在同名文件,如果不存在同名文件,转入步骤f,否则转入步骤c;
c.判断是否“自动追加”模式,如果是转入步骤d,否则创建失败;
d.判断是否文件个数已满,如果已满,则转入步骤f,否则转入步骤e;
e.对文件名自动追加后缀序号后,创建添加“后缀序号”的文件;
f.判断是否是循环模式,如果是循环模式,则删除最老的文件;
g.在分区表中找到一个位置,创建文件信息,并返回指向该位置的文件指针,并根据文件的大小更新分区表;
h.创建完成;
4)采用顺序地址方式将数据从NandFlash的Sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;
5)将数据从分区读取到NandFlash的Sdram存储器中,然后从Sdram存储器中取走,完成文件读取。
2.根据权利要求1所述的基于NandFlash的高可靠线性文件存取方法,其特征在于,所述步骤1)初始化分区表包括以下步骤:
1.1)通过初始化获得芯片的属性信息:向NandFlash发出读ID的命令,将读取到的NandFlashID信息与已支持的芯片类型ID进行比对,如果符合则通过初始化得到芯片的特性信息:block的个数和每block的page数,否则停止后续操作,防止对芯片进行异常访问;
1.2)识别nand芯片中的所有坏块:读取nand芯片的任意一个block的前2个page的spare区,若该spare区的信息不为0xff,则该block为坏块;扫描nand芯片的每一个block,直至识别出所有的坏块,即完成坏块信息的扫描;
1.3)建立坏块到好块的物理位置的映射关系:建立一张坏块表,即无效块到保留区的映射表,当访问到无效块时,通过查表访问被映射的好块的物理位置;保留区设置在nand芯片的末尾3%的区域,因为nand芯片的坏块率基本在1%以下,保留3%的区域可保证所有的坏块均可被替换,还有一定的余量供后续使用中发现的坏块进行替换;在运行中发现新的坏块时,标记坏块,并从保留区找到一个好块,将数据拷贝至该好块中,坏块计数器加1;
1.4)按照分区时的参数进行分区大小划分。
3.根据权利要求1所述的基于NandFlash的高可靠线性文件存取方法,其特征在于,步骤4)将数据写入分区前,还包括将数据缓冲至NandFlash的Nvram非易失存储器中,并随时做好断点保护的步骤。
4.根据权利要求1或3所述的基于NandFlash的高可靠线性文件存取方法,其特征在于,所述步骤4)中,在写入文件时,同时将文件的日志记录到NandFlash的一片Nvram存储器中。
5.根据权利要求4所述的基于NandFlash的高可靠线性文件存取方法,其特征在于,所述步骤4)中,在写入文件时若掉电,当重新上电时,读取Nvram存储器中的日志数据,通过读取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为记录被映射到坏块位置的好块的位置的记录表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310541024.3A CN103577121B (zh) | 2013-11-05 | 2013-11-05 | 一种基于Nand Flash的高可靠线性文件存取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310541024.3A CN103577121B (zh) | 2013-11-05 | 2013-11-05 | 一种基于Nand Flash的高可靠线性文件存取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103577121A CN103577121A (zh) | 2014-02-12 |
CN103577121B true CN103577121B (zh) | 2016-07-06 |
Family
ID=50048987
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310541024.3A Active CN103577121B (zh) | 2013-11-05 | 2013-11-05 | 一种基于Nand Flash的高可靠线性文件存取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103577121B (zh) |
Families Citing this family (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105335463B (zh) * | 2015-09-23 | 2018-09-25 | 广州市中崎商业机器股份有限公司 | 一种用于收款机的数据存储方法和快速读取方法 |
CN105306569B (zh) * | 2015-10-20 | 2018-07-17 | 红石阳光(北京)科技股份有限公司 | 一种基于Flash(闪存)的数据下载方法 |
CN105589767B (zh) * | 2015-12-21 | 2018-07-31 | 北京时代民芯科技有限公司 | 一种用于nand flash的***掉电保护实现方法 |
CN106246168B (zh) | 2016-08-29 | 2017-09-19 | 中国科学院地质与地球物理研究所 | 一种近钻头钻具姿态随钻测量装置及测量方法 |
CN106246169B (zh) | 2016-08-31 | 2017-09-01 | 中国科学院地质与地球物理研究所 | 一种适用于井下近钻头无线短传发射的机械装置 |
CN106246167B (zh) | 2016-08-31 | 2017-07-14 | 中国科学院地质与地球物理研究所 | 近钻头恒功率无线短传方法及装置 |
CN106223937B (zh) | 2016-08-31 | 2017-09-29 | 中国科学院地质与地球物理研究所 | 一种适用于井下近钻头无线短传的接收装置 |
CN106246163B (zh) | 2016-08-31 | 2017-07-14 | 中国科学院地质与地球物理研究所 | 近钻头动态井斜测量方法及装置 |
CN106527969B (zh) | 2016-09-21 | 2017-09-19 | 中国科学院地质与地球物理研究所 | 一种寿命均衡的NandFlash存储器读写方法 |
CN106522925B (zh) | 2016-11-21 | 2018-04-13 | 中国科学院地质与地球物理研究所 | 一种随钻方位声波信号接收换能器封装装置 |
CN106640055B (zh) | 2016-11-21 | 2017-11-17 | 中国科学院地质与地球物理研究所 | 一种适用于随钻方位声波测井的接收装置 |
CN108614743A (zh) * | 2016-12-09 | 2018-10-02 | 北京京存技术有限公司 | 基于NAND flash的超级数据块处理方法和装置 |
CN106844583B (zh) * | 2017-01-10 | 2022-03-25 | 厦门雅迅网络股份有限公司 | 一种在NOR Flash上建立FAT文件***的优化方法 |
US10578754B2 (en) | 2017-01-19 | 2020-03-03 | Institute Of Geology And Geophysics, Chinese Academy Of Sciences | Sinusoidal excitation method and apparatus for multi-pole acoustic logging while drilling |
CN106869907B (zh) | 2017-01-19 | 2019-08-06 | 中国科学院地质与地球物理研究所 | 基于电场理论的近钻头无线短传地面环境下标定方法 |
CN114089915B (zh) * | 2017-03-27 | 2022-12-20 | 珠海极海半导体有限公司 | 基于flash存储器的文件追加写操作方法及装置 |
CN107220001A (zh) * | 2017-05-18 | 2017-09-29 | 记忆科技(深圳)有限公司 | 一种固态硬盘缓存实现方法及固态硬盘 |
KR20190019675A (ko) * | 2017-08-18 | 2019-02-27 | 에스케이하이닉스 주식회사 | 메모리 시스템 및 그의 동작방법 |
CN107526674A (zh) * | 2017-08-31 | 2017-12-29 | 郑州云海信息技术有限公司 | 一种嵌入式***日志记录的方法与装置 |
CN107818269B (zh) * | 2017-11-27 | 2020-03-17 | 杭州中天微***有限公司 | 一种基于Flash的文件保存方法及*** |
CN108089971B (zh) * | 2017-11-27 | 2021-03-16 | 上海华元创信软件有限公司 | 基于嵌入式实时***的日志服务方法和*** |
CN109712653B (zh) * | 2018-02-27 | 2021-08-31 | 上海安路信息科技股份有限公司 | 芯片初始化方法 |
CN109189772B (zh) * | 2018-08-21 | 2021-09-28 | 华清瑞达(天津)科技有限公司 | 用于无文件***存储介质的文件管理方法及*** |
CN109710181A (zh) * | 2018-12-11 | 2019-05-03 | 成都嘉泰华力科技有限责任公司 | 一种提高nand flash器件文件存取速度的方法及*** |
CN110895496A (zh) * | 2018-12-26 | 2020-03-20 | 研祥智能科技股份有限公司 | 硬件看门狗重启信息的记录及读取方法 |
CN110795040A (zh) * | 2019-10-28 | 2020-02-14 | 浙江互灵科技有限公司 | 简易文件管理***及其实现方法 |
CN110928890B (zh) * | 2019-11-08 | 2023-01-24 | 广州华多网络科技有限公司 | 数据存储方法、装置、电子设备及计算机可读存储介质 |
CN111159114A (zh) * | 2019-12-30 | 2020-05-15 | 中国科学院寒区旱区环境与工程研究所 | 文件存储方法、装置及服务器 |
CN111241039A (zh) * | 2020-01-07 | 2020-06-05 | 天津麒麟信息技术有限公司 | 一种文件***断电保护方法、模组、可读存储介质及电子设备 |
CN112363909B (zh) * | 2020-09-17 | 2022-09-09 | 南京国电南自电网自动化有限公司 | 一种继电保护装置中文件***可靠性的自动测试方法 |
CN112162936B (zh) * | 2020-09-30 | 2023-06-30 | 武汉天喻信息产业股份有限公司 | 一种动态增强flash擦写次数的方法及*** |
CN112596670B (zh) * | 2020-12-04 | 2024-06-07 | 北京自动化控制设备研究所 | 一种大容量Flash存储器读写操作的设计方法 |
CN113434438B (zh) * | 2021-06-15 | 2023-03-14 | 武汉天喻信息产业股份有限公司 | 一种提高智能卡flash写入寿命的方法 |
CN113419680A (zh) * | 2021-06-28 | 2021-09-21 | 南京新联电能云服务有限公司 | 一种存储方法及*** |
CN113625964B (zh) * | 2021-07-16 | 2024-01-26 | 浙江鸿泉电子科技有限公司 | 基于NandFlash的顺序存储方法、电子设备和存储介质 |
CN113934371B (zh) * | 2021-10-08 | 2024-04-12 | 福建星网视易信息***有限公司 | 一种存储器及其数据管理方法和计算机存储介质 |
CN115576783B (zh) * | 2022-12-12 | 2023-03-14 | 湖南博匠信息科技有限公司 | 一种vpx机箱的刀片服务器带外日志存储方法及*** |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043651A (zh) * | 2009-10-22 | 2011-05-04 | 鸿富锦精密工业(深圳)有限公司 | Nand闪存及其数据更新管理方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009064263A (ja) * | 2007-09-06 | 2009-03-26 | Toshiba Corp | メモリ装置 |
JP2009266125A (ja) * | 2008-04-28 | 2009-11-12 | Toshiba Corp | メモリシステム |
JP2009301264A (ja) * | 2008-06-12 | 2009-12-24 | Mitsubishi Electric Corp | Nand型フラッシュメモリアクセス装置及びnand型フラッシュメモリアクセスプログラム及び記録媒体 |
JP5391370B2 (ja) * | 2011-05-20 | 2014-01-15 | ルネサスエレクトロニクス株式会社 | メモリモジュールとコントローラ |
-
2013
- 2013-11-05 CN CN201310541024.3A patent/CN103577121B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043651A (zh) * | 2009-10-22 | 2011-05-04 | 鸿富锦精密工业(深圳)有限公司 | Nand闪存及其数据更新管理方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103577121A (zh) | 2014-02-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103577121B (zh) | 一种基于Nand Flash的高可靠线性文件存取方法 | |
CN103577574B (zh) | 一种基于nand flash的高可靠线性文件*** | |
US7761655B2 (en) | Storage system and method of preventing deterioration of write performance in storage system | |
US8122193B2 (en) | Storage device and user device including the same | |
CN101539891B (zh) | 一种嵌入式快闪存储器、存储***及其数据掉电保护方法 | |
KR100843543B1 (ko) | 플래시 메모리 장치를 포함하는 시스템 및 그것의 데이터복구 방법 | |
US7363540B2 (en) | Transaction-safe FAT file system improvements | |
CN101425041B (zh) | 在nand flash存储器上建立fat文件***的优化方法 | |
CN101446921B (zh) | 一种Flash存储器的动态存储方法 | |
US7174420B2 (en) | Transaction-safe FAT file system | |
CN100498796C (zh) | 逻辑日志生成方法、数据库备份/恢复方法与*** | |
CN103544110A (zh) | 一种基于固态盘的块级连续数据保护方法 | |
US11030092B2 (en) | Access request processing method and apparatus, and computer system | |
CN102033793A (zh) | 快照方法和固态硬盘 | |
CN105718206A (zh) | 能够感知raid的闪存转换层及其实现方法 | |
CN106598493A (zh) | 一种固态硬盘地址映射表管理方法 | |
CN101546294A (zh) | 一种Flash存储器的数据存储方法 | |
CN106104515A (zh) | 利用非易失性存储器的文件***设计和故障恢复方法 | |
CN116088770B (zh) | 数据管理方法及装置、***、电子设备、存储介质 | |
CN105786721A (zh) | 一种内存地址映射管理方法及处理器 | |
KR101077901B1 (ko) | 로그 블록 단위 매핑 기법을 이용한 플래시 메모리 관리 장치 및 방법 | |
KR100995546B1 (ko) | 낸드 플래시 메모리와 비휘발성 램을 사용하는 하이브리드 저장 장치 기반의 데이터베이스 시스템 및 데이터베이스 시스템에서 데이터를 업데이트하는 방법 | |
CN100470677C (zh) | 提高闪存盘数据写入速度的方法 | |
US9535796B2 (en) | Method, apparatus and computer for data operation | |
CN111580757A (zh) | 数据写入方法、***和固态硬盘 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |