剖析NAND Flash的编程结构
分区(Partition)
定义分区的实质是定义数据会如何写入NAND Flash,不同内容的数据写到对应的地址中。一般用户会有多个区,比如boot、kernel、fs、user等分区。
分区的描述:分区的地址范围(起始块、结束块),镜像文件大小(Image Size)。
分区的数据存储:镜像文件是从分区的起始块开始存放,如果分区中有坏块,将使用坏块处理策略替换坏块,直到镜像文件结束,如果分区中不够好块存放镜像文件,则烧录失败。
如下图是跳过坏块的镜像文件分区烧写示意图:
备用区(OOB)的ECC
ECC 存在于NAND 每页的备用区(Spare Area)中,它允许外部系统发现主区的数据是否有误。在大多数情况下,ECC 算法可以纠正误码,NandFlash在使用中也可能会出现坏块,所以ECC是非常有必要的。
不同的用户会可能会使用不同的ECC算法,一般来说ECC算法由处理器供应商提供,如果编程器软件中无这个ECC算法,则需要用户提供ECC算法源代码。
如果用户不使用调入文件,而是使用读母片的方式烧录,并且无动态数据,则可以不考虑ECC算法,因为母片中的备用区已计算好ECC,直接将母片的备用区拷贝至其他芯片即可。
坏块管理(Bad Block Management)
坏块处理策略定义了在遇到坏块时算法应该如何处理,基本的坏块处理策略有:跳过坏块、替换表(预留块区Reserve BlockArea,RBA)等等。
硬拷贝
硬拷贝其实就是遇到坏块什么都不处理,不管好块还是坏块直接烧写,即使校验数据不一致也不报错;
跳过坏块
跳过坏块就是遇到坏块跳到下一个好块烧;
替换表
就是预留一些块作为保留块,是用于替换坏块用,当遇到坏块时,在保留区中选一个块来替换,将原来写到坏块的数据写到替换块中。
BBT(Bad block table)
其实就是使用跳过坏块,然后在Nand闪存指定位置写入一个坏块表(Bad block table),下图是BBT的结构图。