当前位置:首页 期刊杂志

大容量存储中NAND Flash坏块的管理方法★

时间:2024-08-31

宁飞

(中北大学 电子测试技术国家重点实验室,山西 太原 030051)

0 引言

随着数字时代的迅猛发展,数据采集、电子自动化等领域得到了广阔的发展,存储系统作为数据采集系统的重要组成部分,也得到了较快的发展。随着各种应用对存储容量的要求不断增加,NAND Flash以高密度、大容量、高数据存储速率以及更多的擦除次数等特点,逐渐成为大容量存储的主要存储介质。但由于工艺和使用环境中NAND Flash存储器经常进行读写和擦除的操作,不可避免地会出现无效块,由此引发数据丢失、对一些扇区过分磨损而导致NAND Flash寿命缩短等问题。为了能更好地使用NAND Flash,本文针对坏块出现的原因,对其进行分类讨论,以便以后能更好地使用NAND Flash[1]。

1 NAND Flash的物理结构

图1 NAND Flash的结构图

以三星公司的K9F4G08U0A为例,它以页为基本单位进行存储,以块为单位进行擦除,所以具有较快的写入与擦除速度,这正是它适合于大容量存储的原因之一[2]。如图1所示,K9F4G08U0A由4096个块组成,每一个块包含64个页,而一个页是2k + 64 = 2048 +64 = 2112字节。对于一个页, 0~2047个字节为主存储区即通常所说的用户可设定地址区,用来存储数据; 2048~2111共64个字节为扩展存储区(SpareArea) ,用来存储页的信息。扩展区的第一个16字节用于描述主存储区的一个512个字节,第二个16字节用于描述第二个512个字节,以此类推,共64个字节,用于描述前面的2048个字节。

2 坏块出现的原因

由于NAND Flash的工艺不能保证NAND Flash的存储区域里每个块都是好块,因此,在NAND Flash生产及使用过程中都有可能产生坏块。坏块的特性是:当编程/擦除这个块时,不能将其里面的数据置‘1’,这会造成页编程和块擦除操作时的错误,这种错误可以通过状态寄存器的值反映[3]。在存储数据时,文件系统的系统数据被反复更新的频率非常高。如果不对存储方式和区域进行有效的管理,将使NAND Flash很快因为某一部分扇区被频繁擦除和写入而损坏,从而出现坏块。

3 坏块的分类

坏块分为两大类:固有坏块和使用坏块。固有坏块是指生产过程中产生的坏块,一般原厂都会保证第0块是好块,从而可以将一些重要的文件信息存储在第0块中,对于生产中产生的坏块厂商会对第一页列地址的第2048个字节进行标记为不等于0xff的值。使用坏块是指在NAND Flash频繁的使用过程中,出现块擦除错误、页编程错误、读操作中单个位失效等状况时都可以认为该块在使用中变成了坏块,这个时候需要对坏块作标记,例如可将第一页列地址的第2048字节标记为0x00[4]。

4 坏块管理

坏块通常包含一个或多个无效位(也就是通常所说的错位) , NAND Flash不能保证无效位的可靠性。有无坏块对Flash的整体性能没什么影响,有坏块存在Flash照样可以继续使用,只是在存储数据时必须跳过坏块。在Flash中块与块之间是相互独立的,坏块不会影响好块的性能。在Flash设备中硬件适应层管理Flash,包括坏块管理和较错代码两部分;其中坏块管理又包括坏块识别、坏块跳过、坏块替换和坏块存储。通常,对于一个NAND Flash设备来说,坏块管理首先是通过第一页扩展区信息识别坏块,然后在使用过程中跳过固有坏块或使用过程中产生的坏块,其次是根据坏块列表和对应关系表把坏块中的信息转存到好块中即坏块替换,最后对坏块进行存储,重新映射坏块地址[5]。

4.1 坏块识别

如果块中第一页或第二页扩展区的第1个字节标记为非0xff,那么这个块就是坏块。第一次使用NAND Flash时,擦除之前先要读取坏块信息,否则将会擦除初始化的坏块信息即固有坏块信息。如果使用块管理程序,系统将根据初始化信息辨别固有坏块(见图2) ,读Flash所有扩展区识别坏块,创建无效块表并保存在第0块中,以便在进行坏块跳过和替换时读取无效块表信息[6]。

图2 坏块识别流程

4.2 坏块跳过

通常情况下,创建无效块表时创建一个坏块和好块的对应关系表并保存在Flash的第0块中。在存储数据时,先读出无效块表中的信息,然后根据无效块表中的信息跳过固有坏块进行存储[7](坏块跳过流程见图3);同样,在NAND Flash使用过程中产生的坏块,通过对应关系表,把坏块中的数据转存到与之对应的好块中,跳过此坏块,并将此坏块进行标记并更新无效块表的信息。

图3 坏块跳过流程图

4.3 坏块替换

NAND Flash使用过程中产生的块可由状态寄存器判断Flash运行是否成功来判断。编程或擦除块就绪,状态寄存器接收到块错误信息,那么这个块就被标记为坏块,同时编程或擦除操作被取消;ECC算法出现错误不少于两个时,也被标记为坏块,使用ECC标记坏块时,通过分配新块重新映射坏块地址。坏块一旦产生,就要使用好块对坏块进行替换,以此来保证坏块中的数据安全性,其具体操作如下。在同一块中页编程操作失效不影响其他页的数据,重新编程无效页的正确数据,和块中其他页的数据一并拷贝到一个可用的有效块。

流程介绍如下:

第一步,在擦、写的操作中块A的第n页发生了错误;

第二步,将第1到第n-1页中的内容拷贝到一个空闲的块B的相同位址;

第三步,拷贝缓冲器中第n个页的数据到块B的对应位址。

4.4 坏块存储

在创建无效块表的同时也要学会怎样保存坏块,保存坏块时不会跳过坏块,但管理程序会通过指引硬件适应层把坏块存储到已知的好块中。因此,块管理程序会在NAND Flash中创建两个区:用户可设定地址块区即主存储区和保留块区即通常所说的扩展区。硬件适应层使用用户可设定地址块区存储数据,使用保留区替换坏块。为了详细说明这两个区,必须确定保留区的开始地址和大小,通常有两种方法:一种是用户给定,另一种是块管理程序设定(通常保留区的大小是Flash容量的2%左右)[8]。例如一个256M的NAND Flash,用户可设定地址块区是2008块,保留区是从2009到2048块。硬件适应层每次写逻辑扇区时都要计算写的块的物理地址,但在写之前,块管理程序将检查块是坏的还是好的。如果是坏的,将返回好块地址重新映射的扇区。如果在使用过程中产生块坏,块管理程序将重新映射坏块地址,并把坏块上的数据拷贝到要替换的好块中。

5 实验与结论

图4所示为采用无效块管理后的大容量数据采集Flash的操作图,由图可见采集速度达到了10M/s。为了能够更好地利用Flash,延长NAND Flash每块的使用寿命,还可以使用均衡损耗算法。均衡损耗算法可以平均使用NAND Flash中每一个块,减少坏块出现的机率,这样不仅能够很好地管理和使用NAND Flash,也保障了数据的安全性和可靠性。

图4 采用无效块管理后的大容量数据采集Flash操作图

通过坏块管理,不仅可以及时准确地发现坏块,而且可以根据需要跳过坏块,替换坏块,并把替换的坏块存储在保留区中;同时为了某些特殊的需要还可以运用ECC算法将部分坏块修复。因此,通过坏块管理,不仅很好地管理了NAND Flash,而且还能保障NAND Flash中的数据安全,提高大容量存储的存储速率和数据的准确度,避免了因为产生坏块带给我们一些不必要的麻烦和损失。

[1]沈建华,罗悦怿. 基于NAND Flash的FFS设计与实现[J].计算机应用与软件, 2005,22 (6):87-88.

[2]段权顺. Nand Flash控制器的规格设计[J]. 电子产品世界,2006(2): 116-118.

[3]杨孝光. ECC校验的算法分析和程序实现[J]. 实验科学与技术, 2004(3): 13-16.

[4]Samsung Electronics Co. , L td. ECC Algorithm (512Byte)[EB /OL]. 2006年6月: 1-3.

[5]彭 兵,步 凯,徐 欣. NAND Flash坏块管理研究[J].微处理机, 2009(2).

[6]陈峰. 嵌入式系统中的Flash存储管理[J]. 单片机与嵌入式系统应用, 2003(2).

[7]沈建华. Flash文件系统的研究与设计[J]. 计算机应用研究,2004(12).

[8]潘玉华. NAND Flash的数据管理方法[J]. 苏南科技开发,2006(12).

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!