DSP

Nand Flash 中的坏块(Bad Block)

2019-07-13 14:37发布

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.保证第一个块是好的,并且一般相对来说比较耐用。做此保证的主要原因是,很多 NandFlash 坏块管理方法中,就是将第一个块,用来存储上面提到的 BBT,否则,都是出错几率一样的块,那么也就不太好管理了,连放 BBT 的地方,都不好找了,^_^。

一般来说,不同型号的 Nand Flash 的数据手册中,也会提到,自己的这个 Nand Flash,最多允许多少个坏块。就比如上面提到的,三星的 K9G8G08U0M,最多有 100 个坏块。内容转自DSP工程师社区-www.logicdsp.com