引 言
随着嵌入式系统在数码相机、数字摄像机、移动电话、MP3音乐播放器等移动设备中越来越广泛的应用,Flash存储器已经逐步取代其他半导体存储元件,成为嵌入式系统中主要数据和程序载体。Flash存储器又称闪存,是一种可在线多次擦除的非易失性存储器NVM(Non-Volatile Memo-ry),即掉电后数据不会丢失。Flash存储器还具有体积小、功耗低、抗振性强等优点,是嵌入式系统的首选存储设备。
世面上常用的Flash存储设备有两种:NOR Flash和NAND Flash。根据存储容量,NOR一般为1~16 MB,而NAND为8~512 MB,现在的大容量NAND已经可以达到4 GB;读取速度NOR较NAND快,写入速度NOR比NAND慢一些;擦除速度NOR需要2~5 s,而NAND仅仅需要2~5 ms;NAND的价格比NOR低很多。由于种种原因,较常用的是NAND Flash。但是由于NANDFlash的工艺不能保证NAND的存储阵列(memory ar-ray)在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。其表现是:当编程/擦除这个块时,不能将某些位拉高,这会造成页编程(page program)和块擦除(block erase)操作时的错误;相应地,反映到状态寄存器(status register)的相应位。
总体上,坏块可以分为两大类:第一类为固有坏块,这是生产过程中产生的坏块,一般芯片原厂都会在出厂时将坏块第一个页的扩展区域(Spare Area)的第6个字节标记为不等于0xff的值;第二类为使用坏块,这是在NANDFlash使用过程中,如果块擦除或者页编程错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现坏块的第一个页的扩展区域的第6个字节标记为非0xff的值。由于Flash写入数据的时候是先擦除块,这样这个块里面的数据将全部变成0xff,写入1时,该位不变;写入0时,该位由1变为0。如果将扩展区域的第6个字节标记为非0xff之后,将不可能再恢复为0xff,除非格式化有可能恢复。
我们已经了解到,坏了的块是无法擦除和写人数据的,而在嵌入式系统中,启动的第一步就是将Flash里面的前4KB数据自动复制到SRAM里面去运行。如果仅仅Flash的第一块坏了,而导致引导程序无法下载进去,那么这个块不是不能读取数据,而是读不出我们想再要放入的数据,这样这个Flash设备就报废了。本文就这个问题作了深入的讨论,用一种基于Flash的地址重映射的方法解决这个问题。本文采用三星(Samscrag)公司的S3C2440 ARM处理器和NAND Flash存储设备K9F1208UOM讨论地址重映射的思想。
1 S3C2440使用NAND Flash引导系统的方法
自动启动模式顺序:
①复位完成;
②当设置为自动启动模式,NAND Flash的开始4 KB被拷贝到Steppingstone的4 KB内部缓冲器;
③Steppingstone映射到nGCS0;
④CPU开始在Steppingstone执行启动代码程序。
由系统引导顺序看出,如果Flash的第一块坏了,那么读出的数据不一定是引导程序,这样,系统将无法启动。而在这种情况下,就只能换一块完好的Flash了,这样就造成了很大的浪费。
2 Flash存储器的内部结构
K9F1208UOM型Flash芯片内部存储器结构如图1所示。
典型的NAND Flash由4 096块组成,每一个块包含32页,而每页是512+16=528字节。对于一个页,0~511字节为主存储区,即通常所说的用户可设定地址区,用来存储数据;512~527共16字节为扩展存储区,用来存储页的信息。扩展区的16字节用于描述主存储区的512字节。而对于坏块,也仅仅是将这16字节的第6字节设置为不等于0xff,来标示坏块。
在NANDFlash使用过程中可能会出现这样的问题:产生坏块或坏页、由此引发的数据丢失、对一些扇区或块的过分磨损导致NANDFlash寿命缩短等。为了能更好地使用NAND Flash,在其损坏时使损失最小化,需要一种方法,使用相同的地址可以屏蔽掉坏了的块,而指针指向好块。即使第一块坏了,还可以使用O地址去操作一个好块。