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