nand flash块,坏块,页,oob等解释
http://blog.csdn.net/seasonyrq/article/details/51510965 本文针对nand flash坏块部分进行简单的记录 什么是坏块 我们先来看一下nand flash的存储结构? nand flash的存储结构为:一个flash由许多个block组成,一个block又是有许多个page组成,一个page又是由有效的数据区和spare area区(即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的值用作标记。另外在使用过程中如果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校验的详细分析见http://www.cnblogs.com/bcxx_qin/archive/2009/06/11/1501271.html OOBOOB(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个字节中。 一般在uboo中识别坏块是通过oob区直接判断的,进入kernel会创建坏块表,相当于把各个block的第一page的oob区的坏块标记统一整理到一个表格里存放,下次直接查这个表格就可以知道具体的坏块信息,这个表格就是bbt BBTBBT(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来表示,即已标记的四个坏块。 /* Generic flash bbt descriptors */
static uint8_t bbt_pattern[] = {'B','b',0);">'t',0);">'0' };
static uint8_t mirror_pattern[] = {'1',0);">'B' };
CFE> nand showbad bad blocks offset address: 0xb80000? 参考? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |