CN103577574B - 一种基于nand flash的高可靠线性文件*** - Google Patents
一种基于nand flash的高可靠线性文件*** Download PDFInfo
- Publication number
- CN103577574B CN103577574B CN201310541079.4A CN201310541079A CN103577574B CN 103577574 B CN103577574 B CN 103577574B CN 201310541079 A CN201310541079 A CN 201310541079A CN 103577574 B CN103577574 B CN 103577574B
- Authority
- CN
- China
- Prior art keywords
- file
- data
- module
- submodule
- block
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/172—Caching, prefetching or hoarding of files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/1847—File system types specifically adapted to static storage, e.g. adapted to flash memory or SSD
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- 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存储阵列;该文件***包括硬件抽象层和软件层,所述硬件抽象层用于实现对硬件IO的访问,所述软件层通过访问硬件抽象层的接口实现对文件的操作,所述软件层包括分区表初始化模块、文件管理模块和文件存取模块。本发明实现了对基于nand flash的设备的文件管理,具有可移植性高、效率高、以文件方式实现数据存取、自动循环记录、断电保护文件等特点。
Description
技术领域
本发明涉及计算机存储领域,尤其涉及一种基于nand flash的高可靠线性文件***。
背景技术
nand flash是一种大容量的存储芯片,其特点是容量密度大,制造成本低,访问速度快,通常作为U盘、固态盘、存储卡等设备上的存储芯片,但其也存在一些不足:它属于地址、数据共用类型访问方式,访问相对麻烦,它由于本身出厂是就存在坏块,需要“跳过”坏块进行访问,需要专门的管理方法进行块的管理。目前对数据的管理主要分以下两种方式:
(1)无文件***方式访问,使用者需调用函数对存储单元进行直接操作,实现难度低,但使用难度高;
(2)文件***方式访问,使用者以文件的方式对存储***进行访问,实现难度高,但使用难度低。
文件***的优点在于不需要使用者关注数据的存放位置,文件***来管理数据,屏蔽了物理介质的不同。由于文件***对使用者实现数据管理的透明,完全接管数据的存储,一旦文件***崩溃会导致数据丢失,所以对文件***的可靠性要求较高,能经受长时间的考验。
本发明涉及一种基于nand flash的高可靠线性文件***的软件。用于由nandflash组成的存储阵列中实现以文件的方式进行访问管理。本文件***与windows上使用的文件***不同,windows等操作***上使用的文件***属于“基于页表结构”形式,而本文件***属于线性文件***。所谓“线性文件***”是指数据记录在顺序的地址单元中,而常见的文件***都是“基于页表结构”形式,即数据记录在不连续的地址单元中,各地址单元通过一个链表相连接。线性文件***的特点是管理简单,记录效率高,而常见页表形式的文件***管理页表较复杂,无掉电保护特性,效率稍低。本发明非常适合于需要一种高可靠性、高效率、方便使用的记录设备的环境下。
发明内容
本发明要解决的技术问题在于针对上述现有技术中的缺陷,提供一种基于nandflash的高可靠线性文件***及线性文件存取方法。
本发明解决其技术问题所采用的技术方案是:
本发明提供了一种基于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组成的多片并行nandflash。
典型的多片并行的硬件设计原理框图如图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所示。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
Claims (7)
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个备份。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310541079.4A CN103577574B (zh) | 2013-11-05 | 2013-11-05 | 一种基于nand flash的高可靠线性文件*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310541079.4A CN103577574B (zh) | 2013-11-05 | 2013-11-05 | 一种基于nand flash的高可靠线性文件*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103577574A CN103577574A (zh) | 2014-02-12 |
CN103577574B true CN103577574B (zh) | 2017-02-08 |
Family
ID=50049350
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310541079.4A Active CN103577574B (zh) | 2013-11-05 | 2013-11-05 | 一种基于nand flash的高可靠线性文件*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103577574B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103902741B (zh) * | 2014-04-22 | 2018-04-27 | 北京华力创通科技股份有限公司 | 一种Flash存储文件*** |
CN104376099A (zh) * | 2014-11-25 | 2015-02-25 | 贵州电力试验研究院 | 一种基于闪存的文件***的实现方法和实现装置 |
CN106445398B (zh) * | 2015-08-04 | 2019-05-31 | 深圳市中兴微电子技术有限公司 | 一种基于新型存储器的嵌入式文件***及其实现方法 |
CN105550329A (zh) * | 2015-12-21 | 2016-05-04 | 国电南瑞科技股份有限公司 | 适用于电力二次设备的快速录波文件***的建立方法 |
CN105760113B (zh) * | 2016-02-04 | 2019-03-22 | 西安科技大学 | 基于nand闪存的高速存储设备及文件管理方法 |
CN107092440B (zh) * | 2017-03-22 | 2020-07-24 | 深圳市中航世星科技有限公司 | 一种基于fpga的irig106高速数据存储*** |
CN107145507B (zh) * | 2017-03-23 | 2020-02-18 | 北京空间飞行器总体设计部 | 一种面向NandFLASH的多相机多图像并行处理的图像文件*** |
CN107193751B (zh) * | 2017-05-19 | 2020-12-08 | 浪潮集团有限公司 | 一种Nandflash阵列的文件信息存储方法 |
CN108038024B (zh) * | 2018-01-04 | 2021-03-02 | 西安锐益达风电技术有限公司 | 一种面向NandFlash的可靠型静态规划文件*** |
CN108491402B (zh) * | 2018-01-17 | 2021-09-21 | 艾体威尔电子技术(北京)有限公司 | 一种轻量级文件***的实现方法 |
CN108376121B (zh) * | 2018-03-01 | 2021-10-22 | 曲阜师范大学 | 一种Flash存储器的数据存储方法 |
CN109634919A (zh) * | 2018-10-16 | 2019-04-16 | 西北铁道电子股份有限公司 | 一种文件管理*** |
CN109857718A (zh) * | 2019-02-01 | 2019-06-07 | 广州亚美信息科技有限公司 | 一种应用于嵌入式***的日志式文件*** |
CN110109872B (zh) * | 2019-04-29 | 2021-12-07 | 北京空间飞行器总体设计部 | 一种遥感卫星异构数据统一存储管理装置 |
CN110795040A (zh) * | 2019-10-28 | 2020-02-14 | 浙江互灵科技有限公司 | 简易文件管理***及其实现方法 |
CN111209132B (zh) * | 2019-12-31 | 2023-07-28 | 航天信息股份有限公司 | 嵌入式***、掉电保护方法、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1822230A (zh) * | 2006-03-02 | 2006-08-23 | 浙江大学 | 基于NAND Flash存储器文件***的实现方法 |
CN101796495A (zh) * | 2007-09-06 | 2010-08-04 | 株式会社东芝 | 存储器设备和文件*** |
CN102981965A (zh) * | 2012-11-07 | 2013-03-20 | 江苏乐买到网络科技有限公司 | 一种nand flash文件*** |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20090082784A (ko) * | 2008-01-28 | 2009-07-31 | 삼성전자주식회사 | Nvram 셀을 채용한 플래쉬 메모리 장치 |
US7768817B2 (en) * | 2008-03-20 | 2010-08-03 | Intel Corporation | VCC control inside data register of memory device |
-
2013
- 2013-11-05 CN CN201310541079.4A patent/CN103577574B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1822230A (zh) * | 2006-03-02 | 2006-08-23 | 浙江大学 | 基于NAND Flash存储器文件***的实现方法 |
CN101796495A (zh) * | 2007-09-06 | 2010-08-04 | 株式会社东芝 | 存储器设备和文件*** |
CN102981965A (zh) * | 2012-11-07 | 2013-03-20 | 江苏乐买到网络科技有限公司 | 一种nand flash文件*** |
Non-Patent Citations (2)
Title |
---|
Flash文件***研究综述;阎航;《现代计算机》;20060930(第二四三期);63-67 * |
嵌入式***中的线性Flash文件***设计;吴雨俊;《单片机与嵌入式***应用》;20031031;9-11,17 * |
Also Published As
Publication number | Publication date |
---|---|
CN103577574A (zh) | 2014-02-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103577574B (zh) | 一种基于nand flash的高可靠线性文件*** | |
CN103577121B (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 | |
JP3708047B2 (ja) | フラッシュメモリの管理方法 | |
US8621139B2 (en) | Data writing method for writing data into block of multi-level cell NAND flash memory by skipping a portion of upper page addresses and storage system and controller using the same | |
US8312204B2 (en) | System and method for wear leveling in a data storage device | |
KR100843543B1 (ko) | 플래시 메모리 장치를 포함하는 시스템 및 그것의 데이터복구 방법 | |
CN101425041B (zh) | 在nand flash存储器上建立fat文件***的优化方法 | |
US8166258B2 (en) | Skip operations for solid state disks | |
JP4633802B2 (ja) | 不揮発性記憶装置及びデータ読み出し方法及び管理テーブル作成方法 | |
US8386698B2 (en) | Data accessing method for flash memory and storage system and controller using the same | |
TWI408551B (zh) | 快閃記憶體儲存系統及其控制器與資料處理方法 | |
CN102981963B (zh) | 一种固态盘的闪存转换层的实现方法 | |
CN111752487B (zh) | 一种数据恢复方法、装置及固态硬盘 | |
US20090222643A1 (en) | Block management method for flash memory and controller and storage sysetm using the same | |
KR101077904B1 (ko) | 페이지 단위 매핑 기법을 이용한 플래시 메모리 관리 장치 및 방법 | |
CN110362499B (zh) | 电子机器及其控制方法、计算机***及其控制方法以及主机的控制方法 | |
CN103544110A (zh) | 一种基于固态盘的块级连续数据保护方法 | |
TWI459198B (zh) | 記憶體儲存裝置、其記憶體控制器與有效資料識別方法 | |
CN106598493A (zh) | 一种固态硬盘地址映射表管理方法 | |
US20090172269A1 (en) | Nonvolatile memory device and associated data merge method | |
KR100995546B1 (ko) | 낸드 플래시 메모리와 비휘발성 램을 사용하는 하이브리드 저장 장치 기반의 데이터베이스 시스템 및 데이터베이스 시스템에서 데이터를 업데이트하는 방법 | |
JP3808842B2 (ja) | 書き換え可能な不揮発性メモリを備えた記憶装置及び記憶装置用不揮発性メモリの制御方法 | |
CN111142792B (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 |