Nand Flash 中,一个块中含有 1 个或多个位是坏的,就称为其为坏块 Bad Block。
坏块的稳定性是无法保证的,也就是说,不能保证你写入的数据是对的,或者写入对了,读
出来也不一定对的。与此对应的正常的块,肯定是写入读出都是正常的。
坏块有两种:
(1) 出厂时就有存在的坏块:
一种是出厂的时候,也就是,你买到的新的,还没用过的 Nand Flash,就可以包含了坏块。
此类出厂时就有的坏块,被称作 factory (masked) bad block 或 initial bad/invalid
block,在出
厂之前,就会做对应的标记,标为坏块。
(2) 使用过程中产生的坏块:
第二类叫做在使用过程中产生的,由于使用过程时间长了,在擦块除的时候,出错了,说明
此块坏了,也要在程序运行过程中,发现,并且标记成坏块的。具体标记的位置,和上面一
样。这类块叫做 worn-out bad block。即用坏了的块。
坏块的标记
具体标记的地方是,对于现在常见的页大小为 2K 的 Nand
Flash,是块中第一个页的 oob 起
始位置(关于什么是页和 oob,下面会有详细解释)的第 1 个字节(旧的小页面,pagesize
是 512B 甚至 256B 的 Nand Flash,坏块标记是第 6 个字节) 如果不是
0xFF, 就说明是坏块。
相对应的是,所有正常的块,好的块,里面所有数据都是 0xFF 的。
不过,对于现在新出的有些 Nand Flash,很多标记方式,有些变化,有的变成该坏块的第一
个页或者第二个页,也有的是,倒数最后一个或倒数第二个页,用于标记坏块的。
具体的信息,请参考对应的 Nand Flash 的数据手册,其中会有说明。
对于坏块的标记,本质上,也只是对应的 flash 上的某些字节的数据是非 0xFF 而已,所以,
只要是数据,就是可以读取和写入的。也就意味着,可以写入其他值,也就把这个坏块标记
信息破坏了。对于出厂时的坏块,一般是不建议将标记好的信息擦除掉的。
uboot 中有个命令是“nand scrub”就可以将块中所有的内容都擦除了,包括坏块标记,不论
是出厂时的,还是后来使用过程中出现而新标记的。一般来说,不建议用这个。
不过,在实际的驱动编程开发过程中,为了方便起见,我倒是经常用,其实也没啥大碍,呵
呵。不过呢,其实最好的做法是,用“nand erase”只擦除好的块,对于已经标记坏块的块,
不要轻易擦除掉,否则就很难区分哪些是出厂时就坏的,哪些是后来使用过程中用坏的了。
坏块的管理
对于坏块的管理,在 Linux 系统中,叫做坏块管理(BBM,Bad Block
Management) ,对应
的会有一个表去记录好块,坏块的信息,以及坏块是出厂就有的,还是后来使用产生的,这
个表叫做坏块表(BBT,Bad Block Table) 。在 Linux 内核 MTD 架构下的 Nand Flash
驱动,
和 Uboot 中 Nand Flash 驱动中,在加载完驱动之后,如果你没有加入参数主动要求跳过坏
块扫描的话,那么都会去主动扫描坏块,建立必要的 BBT 的,以备后面坏块管理所使用。
坏块的比例
而关于好块和坏块,Nand Flash 在出厂的时候,会做出保证:
1.关于好的,可以使用的块的数目达到一定的数目,比如三星的
K9G8G08U0M,整个 flash
一共有 4096 个块,出厂的时候,保证好的块至少大于 3996 个,也就是意思是,你新买到这
个型号的 Nand Flash,最坏的可能, 有 3096-3996=100 个坏块。不过,事实上,现在出
厂时的坏块,比较少,绝大多数,都是使用时间长了,在使用过程中出现的。
2.保证第一个块是好的,并且一般相对来说比较耐用。做此保证的主要原因是,很多 Nand
Flash 坏块管理方法中,就是将第一个块,用来存储上面提到的 BBT,否则,都是出错几率
一样的块,那么也就不太好管理了,连放 BBT 的地方,都不好找了,^_^。
一般来说,不同型号的 Nand Flash 的数据手册中,也会提到,自己的这个 Nand Flash,最多
允许多少个坏块。就比如上面提到的,三星的 K9G8G08U0M,最多有 100 个坏块。
转自:http://hi.baidu.com/weizhiyuan420/item/506c4cac1b6fefa928ce9df2