NAND Flash的坏块管理设计
2.2 坏块映射表的描述
在预留空间存在4种形式的块:空闲的好块、坏块、被映射的块、存放映射表的块。
存放映射表的块较为特殊,其中映射表不仅描述基本空间中的坏块映射相关信息,还描述预留空间占整个Flash空间的比例等。
设计中一张坏块表存于一个Flash块,表的信息存于块中最前面的相关页中。表的头部长度固定,表的整个长度可变,与坏块数目相关。
坏块映射表结构描述如下:本文引用地址://m.amcfsurvey.com/article/151348.htm
其中hdr_crc和tbl_crc用于检验表的完整性;rese_start_blk即预留空间的起始块号;version用于标识该表的版本;num_bad_blk用于描述已发现的坏块数,即坏块映射表项的数目;map_tbl为记录坏块映射表项内容的首地址。任何一个映射表项包括坏块块号及其映射的好块的块号。
由于使用过程中会产生新的坏块,映射表中的表项需要增加,从而要更新Flash中的映射表。为了防止系统意外掉电产生映射表不一致问题,采用日志技术。其中version版本号标识映射表的新旧,在更新Flash映射表的同时,版本号递增,同时Flash旧版本映射表并不立即擦除。只有出现预留空间不足的情况,擦除旧版本映射表的动作才执行。此方案还有利于调试,查看映射表的更改历史记录。
在出现坏块Bn后,通常包括两个动作:写映射表和标识坏块。标识坏块是通过在块的00B相应字节写非0xFF来实现。
为了支持意外掉电情形,每个版本的映射表必须在Flash里保存两份,如果发现最高的版本映射表没有两份,或者两份不一致,则属于非正常情况,必须重新建立映射表。
考虑如下情况:写完映射表Vn,接着标识坏块Bn,此时掉电,则下次系统启动后,出现映射表的坏快Bn,实际上并没有被标识,导致不一致问题。写2份Vn可以解决此问题:写第一份Vn后,标识坏块Bn,接着再写第二份Vn。这样即使在标识坏块Bn时掉电,下次系统加电时由于没有发现2份版本相同且最高的映射表,从而识别出此非正常情况。
同时,维护2份同版本坏块表可以处理存放映射表的块突然坏死而导致系统无法启动的异常,起到备份的作用。
2.2.1 坏块映射表的管理算法
系统初始化时读入坏块表的内容,在内存中建立所有坏块的映射信息。由于每次发现新的坏块而更新坏块表时,都会写入两个版本一样的坏块表,所以在读入坏块表时就要检查两个表是否有效和一致,可以分为以下情况:
①发现2张最高版本并且有效的坏块表Vn+1——系统按表Vn+1建立映射;
②只发现1张最高版本并且有效的坏块表Vn+1,并且有2张有效坏块表Vn——发生在上次写完一个Vn+1后突然掉电,使得第二个表Vn+1未写入或写入不完整,这时需要恢复,以建立完整映射,恢复算法如图3所示。
评论