您好,欢迎光临力浦电子(北京)有限公司!

咨询热线:010-62652592

新闻中心

nand flash相关名词oob等解释

发布日期:2022-12-01

本文针对nand flash坏块部分进行简单的记录

什么是坏块

我们先来看一下nand flash的存储结构

01

nand flash的存储结构为:一个flash由许多个block(块)组成,一个block又是有许多个page(页)组成,一个page又是由有效的数据区和spare area区(即oob区)组成。

如上图flash有1024个block,一个block有64个page,一个page有2Kbytes的有效数据+64bytes的oob数据。

我们通常计算nand flash容量大小为:总共的block数 * 一个block中的page数 * 一个page中的有效数据区。oob区为特殊数据,用作硬件纠错和坏块管理的。

注:按照读、写、擦除的操作,擦操作小的单位为一个block,读写操作小单位为一个page

坏块是指在nand flash中出现某些flash区域不能进行擦写操作,我们称这样的一个单位区域为一个坏块。而由于nand flash中的读和写操作是以page为单位,擦除是以block为单位,且写操作之前必须要先进行擦除操作,因此,一个小的可操作单位即为一个block, 整个block中产生任何不可修复的位错误,我们就认为这个块是坏块。

坏块的产生

由于nand flash的工艺不能保证nand的memory array在其生命周期中保持性能的可靠性,因此在生产和使用过程中会产生坏块,nand flash在出厂阶段就会有某些概率出现坏块的现象,我们称为固有坏块,一般都会在出厂时将每个坏块第一个page的spare area区第6个byte标记问不等于oxff的值用作标记(根据IC型号不同,标记位的位置也可能会不同,需要参考IC手册资料)。另外在使用过程中如果block erase或page program错误,就可以将这个块作为坏块处理,需要把坏块标记起来,标记方式和固有坏块标记位置和方式统一。

坏块的管理

每个块都会在一个page的oob区第6个字节标记这个块是否为坏块的信息,如果在擦除一个块之前,check到第一个page的oob区的第6个字节非oxff,就表示为坏块不能进行擦除操作,以免将坏块标记擦除。如果在操作过程中出现新的坏块,应及时标记坏块,更新坏块表。

ECC

ECC的全称是Error Checking and Correction, NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出 错。一般使用一种比较专用的校验——ECC。ECC能纠正单比特错误和检测双比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的 错误不保证能检测。

ECC一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个比特置1。(512生成两组ECC,共6字节)

当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC校验和,称之为原ECC校验和,保存到PAGE的OOB (out- of-band)数据区中。其位置就是eccpos[]。校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和新ECC校验 和按位异或,若结果为0,则表示不存在错(或是出现了ECC无法检测的错误);若3个字节异或结果中存在11个比特位为1,表示存在一个比特错误,且可纠 正;若3个字节异或结果中只存在1个比特位为1,表示OOB区出错;其他情况均表示出现了无法纠正的错误。

其中对于ECC校验的详细分析见http://www.cnblogs.com/bcxx_qin/archive/2009/06/11/1501271.html

OOB

OOB(out of band),即通常所说的spare area区,nand flash中每个page后都有一个oob区域,用于存放硬件ecc校验码、坏块标记、和文件系统的组织信息,主要用于硬件纠错和坏块处理。一般page大小为512字节的nand 每页分配16字节的oob;如果为2k的page,则每个page分配64字节的oob.

oob区中用1或2个字节来标志一个block是否为坏块,如果这1或2个字节的内容是0xff,就说明这个block是好块,否则为坏块。对于small page(每页512字节)的芯片,坏块信息存储在每个block的第一个page的oob的第6个字节中,而big page(每页2k个字节)的芯片,坏块信息存储在每个block的第一个page的oob的第1和第2个字节中。

一般在uboot中识别坏块是通过oob区直接判断的,进入kernel会创建坏块表,相当于把各个block的第一page的oob区的坏块标记统一整理到一个表格里存放,下次直接查这个表格就可以知道具体的坏块信息,这个表格就是BBT.

BBT

BBT(bad block table),各家对坏块管理方法都有差异,比如专门用nand做存储的,会把bbt放到block0,因为第0块一定是好块,但是如果nand本身是被用来boot,那么第0块就要存放程序,不能存放bbt了,有的把bbt放到最后一块,当然,这一块坚决不能为坏块。bbt的大小跟nand的大小有关,nand越大,需要的bbt也越大。在查找bbt的位置时,系统不会查找所有的block,而是查找maxblocks(linux driver定义在nand_bbt_descr结构体中),一般默认从最后一个block开始查。而且通常会有另外一个block用作bbt备份

注:oob是每个页都有的数据,而bbt是一个flash才有一个,针对每个block的坏块识别则是通过该块第一页oob区第6个字节。

如,在boot中标记坏块系统重建坏块表后,通过查看nand flash最后两个block,发现这两个block中会将已有的坏块标记出来,一个用做副本保存,如FFFFFF00,这个00即代表了二进制0000 0000,一个坏块用2个bit来表示,即已标记的四个坏块。


分享到: