CN103577121B - 一种基于Nand Flash的高可靠线性文件存取方法 - Google Patents

一种基于Nand Flash的高可靠线性文件存取方法 Download PDF

Info

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
Application number
CN201310541024.3A
Other languages
English (en)
Other versions
CN103577121A (zh
Inventor
袁松
毛先俊
何冲
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CSIC (WUHAN) LINCOM ELECTRONICS Co Ltd
Original Assignee
CSIC (WUHAN) LINCOM ELECTRONICS Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by CSIC (WUHAN) LINCOM ELECTRONICS Co Ltd filed Critical CSIC (WUHAN) LINCOM ELECTRONICS Co Ltd
Priority to CN201310541024.3A priority Critical patent/CN103577121B/zh
Publication of CN103577121A publication Critical patent/CN103577121A/zh
Application granted granted Critical
Publication of CN103577121B publication Critical patent/CN103577121B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明公开了一种基于Nand Flash的高可靠线性文件存取方法,Nand Flash包括Sdram存储器,Nvram非易失存储器和Nand Flash存储阵列;存取方法包括以下步骤:初始化分区表;初始化文件信息,包括文件的始末地址、打开方式、文件名和文件大小信息;根据初始化文件信息,创建新文件;采用顺序地址方式将数据从Nand Flash的Sdram存储器中的缓冲区搬移至分区中文件指针指向的存储区域,完成文件写入;将数据从分区读取到Nand Flash的Sdram存储器中,然后从Sdram存储器中取走,完成文件读取。本发明实现了对基于Nand Flash的设备的文件存取管理,具有效率高、以文件方式实现数据存取等特点。<!-- 2 -->

Description

一种基于Nand Flash的高可靠线性文件存取方法
技术领域
本发明涉及计算机存储领域,尤其涉及一种基于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为记录被映射到坏块位置的好块的位置的记录表。
CN201310541024.3A 2013-11-05 2013-11-05 一种基于Nand Flash的高可靠线性文件存取方法 Active CN103577121B (zh)

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 (36)

* Cited by examiner, † Cited by third party
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 中国科学院地质与地球物理研究所 一种近钻头钻具姿态随钻测量装置及测量方法
CN106246167B (zh) 2016-08-31 2017-07-14 中国科学院地质与地球物理研究所 近钻头恒功率无线短传方法及装置
CN106246169B (zh) 2016-08-31 2017-09-01 中国科学院地质与地球物理研究所 一种适用于井下近钻头无线短传发射的机械装置
CN106246163B (zh) 2016-08-31 2017-07-14 中国科学院地质与地球物理研究所 近钻头动态井斜测量方法及装置
CN106223937B (zh) 2016-08-31 2017-09-29 中国科学院地质与地球物理研究所 一种适用于井下近钻头无线短传的接收装置
CN106527969B (zh) * 2016-09-21 2017-09-19 中国科学院地质与地球物理研究所 一种寿命均衡的NandFlash存储器读写方法
CN106640055B (zh) 2016-11-21 2017-11-17 中国科学院地质与地球物理研究所 一种适用于随钻方位声波测井的接收装置
CN106522925B (zh) 2016-11-21 2018-04-13 中国科学院地质与地球物理研究所 一种随钻方位声波信号接收换能器封装装置
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 中国科学院地质与地球物理研究所 基于电场理论的近钻头无线短传地面环境下标定方法
CN108664208B (zh) * 2017-03-27 2022-02-15 珠海极海半导体有限公司 基于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 郑州云海信息技术有限公司 一种嵌入式系统日志记录的方法与装置
CN108089971B (zh) * 2017-11-27 2021-03-16 上海华元创信软件有限公司 基于嵌入式实时系统的日志服务方法和系统
CN107818269B (zh) * 2017-11-27 2020-03-17 杭州中天微系统有限公司 一种基于Flash的文件保存方法及系统
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擦写次数的方法及系统
CN112596670A (zh) * 2020-12-04 2021-04-02 北京自动化控制设备研究所 一种大容量Flash存储器读写操作的设计方法
CN113434438B (zh) * 2021-06-15 2023-03-14 武汉天喻信息产业股份有限公司 一种提高智能卡flash写入寿命的方法
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)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102043651A (zh) * 2009-10-22 2011-05-04 鸿富锦精密工业(深圳)有限公司 Nand闪存及其数据更新管理方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
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 ルネサスエレクトロニクス株式会社 メモリモジュールとコントローラ

Patent Citations (1)

* Cited by examiner, † Cited by third party
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) 利用非易失性存储器的文件系统设计和故障恢复方法
CN105786721A (zh) 一种内存地址映射管理方法及处理器
KR101077901B1 (ko) 로그 블록 단위 매핑 기법을 이용한 플래시 메모리 관리 장치 및 방법
KR100995546B1 (ko) 낸드 플래시 메모리와 비휘발성 램을 사용하는 하이브리드 저장 장치 기반의 데이터베이스 시스템 및 데이터베이스 시스템에서 데이터를 업데이트하는 방법
CN111580757B (zh) 数据写入方法、系统和固态硬盘
CN100470677C (zh) 提高闪存盘数据写入速度的方法
CN116088770B (zh) 数据管理方法及装置、系统、电子设备、存储介质
US9535796B2 (en) Method, apparatus and computer for data operation

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