NAND Flash文件系统方案及其可靠性设计

来源:互联网 发布:windows live3.2下载 编辑:程序博客网 时间:2024/04/29 05:00

NAND Flash文件系统方案及其可靠性设计 

随着嵌入式系统在消费电子,数据采集和工业控制等领域得到越来越广泛的应用。各个领域都对嵌入式系统提出了更高的要求。作为嵌入式系统中最重要的组成部分,存储系统呈现出了较快的发展速度。NAND FLASH作为一种安全、快速的存储体,具有体积小、容量大、成本低、以及更多的擦除次数等一系列优点,已成为嵌入式系统中数据和程序最主要的载体。由于NAND FLASH在结构和操作方式上与硬盘、E2ROM等其他存储介质有较大区别,使用NAND FLASH时必须根据其自身特性,对文件系统进行特殊设计,以保证系统的性能达到最优。同时由于工艺和使用环境的问题,NAND Flash存储器中不可避免的会出现坏块,因此必须提出有效的坏块处理方法,以解决坏块问题,实现存储系统的高可靠性。
  
  1 NAND FLASH特点
  
  1.1 区块结构
  NAND Flash存储器内部分为若干个存储单元块(block),每个存储单元块又分为若干个页(page),存储单元块是最小的擦除单位,页是写入数据的最小单位。
  1.2 先擦后写
  由于FLASH的写操作只能将数据位从1写成0,不能从0写成1,所以在对存储器进行写入之前必须先执行擦操作,将预写入的数据位初始化为1。擦操作的最小单位是一个区块,而不是单个字节。
  1.3 操作指令
  NAND FLASH的操作不能像RAM那样,直接对目标地址进行总线操作。比如执行一次写操作,它必须完成一段时序才能将数据写入到FLASH中。
  1.4 坏块
  NAND FLASH的坏块是随机分布的,可能在出厂时就存在坏块,也可能在使用过程中,导致某些区块的损坏。区块一旦损坏,将无法进行修复。如果对已损坏的区块进行操作,可能会带来不可预测的错误。
  
  2 NAND Flash 文件系统的设计
  
  将整个文件系统分为两个层次,第一层,直接和物理硬件接触,管理Flash物理存储器,第二层,在基层之上,实现文件管理,如实现FAT。
  2.1 第一层
  2.1.1 物理地址到逻辑地址的映射
  为了在NAND Flash物理地址和FAT操作的逻辑地址之间建立一个好的映射关系,须对NAND Flash的存储空间在逻辑上进行了重新定义。物理上整个Flash划分为若干存储单元块,每个存储单元块内部分成若干物理页,每个物理页又可以分为基本的数据区和其它信息保留区(如安全性)。逻辑上将整个存储器划分为若干簇,以簇作为最小存储单位。确定好簇和物理页及物理区块的对应关系后,物理地址到逻辑地址的映射也就确定了。
  2.1.2可靠性设计
  一个完善的文件系统需要有良好的可靠性。笼统的讲,可靠性的实现,需要存储器信息的支持。
  2.1.3 均衡擦写次数
  由于NAND Flash有一定的使用寿命,所以要尽量避免频繁地对同一块地址操作,以免造成局部单元提前损坏,可以设计算法,将NAND Flash中要更新的数据直接写入一个空块中,降低由于NAND Flash先擦除后写入的特性带来的对块的频繁擦除。
  2.2 FAT设计
  在NAND Flash上,建立了FAT文件系统来对文件操作进行管理。将FAT文件系统具体分为以下四部分:
  2.2.1 FAT的引导区
  该引导区存放代码所需的信息及最重要的文件系统信息。这些信息包括了NAND Flash存储器的类型、容量以及划分成多少个簇;每个簇包含多少扇区、FAT表数目、保留扇区数、根目录的首簇号及根目录入口数、版本信息等等。引导扇区是在格式化NAND Flash时生成的。


2.2.2 FAT的文件分配表
  文件分配表存放文件所占用的存储空间簇链以及NAND Flash存储器的占用和空闲空间的情况。为了防止文件分配表损坏而引起文件的丢失,可以在系统中保存两个相同的文件分配表
  (下转第1324页)
  (上接第1320页)
  FAT1和FAT2,以改善其安全性。在文件系统的操作中,程序对FAT表结构的两个备份进行顺次修改,以此确保Flash存储器上总是存有一整套完好的文件分配表。系统对FAT表的访问原理如下:访问文件时先从要目录中找到该文件的目录项,从中读出首簇号。然后在FAT中找到从该首簇号开始的簇链,簇链上的簇号即为文件依次存放的位置,这样便可以进行数据读写了。
  2.2.3 FAT的根目录区
  FAT的根目录区是固定大小的紧跟在FAT表后的区域。FAT16中将从FAT区之后紧跟的32个扇区作为根目录区,可以保存512个目录项。每个目录项记录了该文件的文件名、文件属性、文件大小、文件创建的日期和时间以及文件在数据区中所占的首簇号,即该文件在FAT表中的入口等数据。
  
  2.2.4 FAT的数据区
  数据区存在文件的数据内容。文件系统对数据区的存储空间是按簇进行划分和管理的。
  
  3 NAND Flash可靠性设计
  
  由于工艺和使用环境的问题,NAND Flash 存储器中不可避免的会出现坏块,这一弱点长期影响存储的可靠性,带来不可预测的后果,因此如果能解决坏块问题,将大大提升NAND Flash 的可靠性。本文提出一种在文件系统底层解决坏块问题的方法,即利用Flash存储器上未使用的空间来代替坏块,同时在FAT表中标记出损坏的坏块信息,避免以后对坏块进行读写。具体方案如下。
  3.1 坏块发现
  NAND Flash对存储器的写入采用先擦后写的流程,擦除的最小单位为1个block,写入的最小单位为一个page。在写入数据时,先在内存中申请1个block大小的缓冲区,然后在存储空间找到要写入数据的page所在的block,将该block全部读入缓冲区,在缓冲区中将数据写入相应的page,写完后,将该block写入Flash,若在写入Flash时多次报错则判定该block为坏块
  3.2 坏块处理
  3.2.1 在内存里建立文件系统的反向簇链,方便进行坏块的替换。
  3.2.2 备份坏块对应簇的FAT表项,在FAT表中标记出该坏块的信息。
  3.2.3 寻找替换空间
  以1个block包含32个page,1个簇包含16个page,即1个block包含2个簇为例进行说明,坏块N包含x,x+1簇,首先从Flash的末尾处开始寻找空闲块,找到即进行整块的替换,见图1。
  图1 替代块
  若一直寻找到数据区的开头都没有空闲块,则重新寻找空闲簇,以簇为单位进行替换,如图2,假设Y,Z分别为X,X+1的替换簇,由于簇在物理空间上并不一定连续,因此在进行簇的替换时可能会出现3种情况:
  情况1:替换簇不在坏块中,即Y,Z不在坏块N中
  处理方法:直接进行簇的替换,将备份的索引号,直接赋值给替换簇的FAT表项,同时更新反向簇链。
  情况2:替换簇在坏块中,即Y或者Z也在坏块N中,这时要再分两种情况
  情况2.1 替换簇在被替换簇之前
  处理方法:因为替换簇自己在之前已经被替换,所以要备份之前更新FAT表时替换的新簇簇号,根据两坏簇间距离,到替换簇号备份中查找其应对应的簇号,来更新当前簇的链接,同时更新反向FAT表。
  情况2.2 替换簇在被替换簇之后
  处理方法:因为替换簇是坏簇,其替换的位置未知,所以只更新反向FAT表,其本身的FAT表项到更新替换簇的前续节点时再做更新。最后查询反向FAT表,将替换的各个新簇接回其前续节点。
  图2 替代簇
  如果FAT表中已经没有空闲簇则报错,该方案完成。
  使用一块32M的NAND Flash,将测试代码先写入一块数据,然后读出数据进行校验的方法对上述方案进行论证,通过两个星期反复的读写,结论为:在没有采用坏块处理程序之前,由于坏块的存在,导致写入的数据在大约12M之后全部丢失,采用坏块处理程序之后,运行的两周内没有任何校验错误。由此可见其可靠性得到很大提升。
  
  4 结语
  
  通过上述对NAND Flash文件系统的设计,使得NAND Flash的性能大大优化,能够满足各个领域对嵌入式存储器越来越高的要求,同时在面对NAND Flash所固有的坏块问题上,通过上述坏块处理的算法,很好的解决了在NAND Flash 存储介质上运用FAT文件系统的坏块问题,增加了整个嵌入式系统的存储可靠性。

原创粉丝点击