nand flash 坏块

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


什么是坏块

我们先来看一下nand flash的存储结构
这里写图片描述

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的值用作标记。另外在使用过程中如果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个字节中。

一般在uboo中识别坏块是通过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来表示,即已标记的四个坏块。

/* Generic flash bbt descriptors */
static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };

CFE> nand showbad

bad blocks offset address:

0xb80000
0xba0000
0xbc0000
0xbe0000
bad block number: 4
* command status = 0
CFE> nand read 0x80000000 0x7fc0000 0x200
reading flash…
reading: offset=0x7fc0000, ptr=0x80000000, size=0x200
done. 512 bytes readed
* command status = 0
CFE> d 0x80000000 0x50
80000000 42627431 FFFFFF01 FFFFFFFF FFFFFFFF 1tbB…………
80000010 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFF00 …………….
80000020 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF …………….
80000030 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF …………….
80000040 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF …………….
* command status = 0
CFE> nand read 0x80000000 0x7fe0000 0x200
reading flash…
reading: offset=0x7fe0000, ptr=0x80000000, size=0x200
done. 512 bytes readed
* command status = 0
CFE> d 0x80000000 0x50
80000000 30746242 FFFFFF01 FFFFFFFF FFFFFFFF Bbt0…………
80000010 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFF00 …………….
80000020 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF …………….
80000030 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF …………….
80000040 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF …………….
* command status = 0


参考
http://blog.csdn.net/su_linux/article/details/11766413
http://blog.csdn.net/sdustliyang/article/details/6569448
http://www.cnblogs.com/bcxx_qin/archive/2009/06/11/1501271.html

  • 15
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
FATFS是一个用于嵌入式系统中的文件系统,而NAND Flash是一种闪存存储器。在使用FATFS和NAND Flash组合的过程中,可能会遇到坏块的问题。 NAND Flash是一种基于电子存储的闪存技术,与传统的磁盘驱动器不同,它是以页(Page)为单位进行读写操作的。而坏块则是由于长时间使用或其他因素导致NAND Flash中存在某些页的数据读写错误或擦除失败的现象。 当FATFS在使用NAND Flash的过程中遇到坏块时,可能会导致文件读写失败、数据丢失或无法正常访问文件等问题。因此,我们需要对坏块进行管理和处理。 针对NAND Flash坏块的处理方法有以下几种: 1. 坏块检测与标记:对于新的NAND Flash,我们可以在初始化时进行坏块检测和标记,将坏块的信息存储到特定的位置,以便在后续的文件访问中进行屏蔽。 2. 坏块替换与映射:当文件系统进行数据写入时,如果发现目标页是坏块,则会对该页进行替换,将数据写入到一个正常的页中,并在一个特定的映射表中记录其对应关系。 3. 坏块回收与擦除:当NAND Flash中存在大量坏块时,可以进行坏块回收与擦除操作。通过特定的算法,将有效数据移到其他可用的页中,并进行擦除操作以恢复新的可用空间。 综上所述,FATFS和NAND Flash组合使用时可能会遇到坏块的问题。我们需要采取相应的方法来进行坏块检测、标记、映射、回收和擦除等处理,以确保文件系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值