Nand Flash坏块管理, OOB, ECC, BBT

本文介绍了NAND Flash的工作原理,特别是坏块的产生、分类、管理和纠正方法。包括坏块表(BBT)的作用和ECC校验机制,以及如何通过特定的标记位识别和处理坏块。

0.NAND的操作管理方式

NAND FLASH的管理方式:以三星FLASH为例(不同型号的Flash, 其block, page, obb的size是不同的),

一片Nand flash为一个设备(device)

1 (Device) = xxxx (Blocks)

1 (Block) = xxxx (Pages)

1(Page) =528 (Bytes) = 数据块大小(512Bytes) + OOB 块大小

OOB大小16Bytes,除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码)。



关于OOB区,是每个Page都有的。Page大小是512字节的NAND每页分配16字节的OOB;如果NAND物理上是2K的Page,则每个Page分配64字节的OOB。如下图:

不同型号的flash一个page的大小也不同, pagesize或者为512+16字节, 或者为2048+64字节; 

以pagesize=2048+64的为例:2048字节是数据区,也被称为main area; 后面的64字节是OOB(out of band), 也可以被成为spare area;

OBB区域用于存储ECC, 每个block第一个page的obb区的第6个字节是坏块标志(非0xff表示坏块);

1 Page = (2K + 64)Bytes
1 Block = (2K + 64)B x 64 Pages = (128K + 4K) Bytes




1.为什么会出现坏块 ?
    由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。坏块的特性是:当编程/擦除这个块时,会造成Page Program和Block Erase操作时的错误,相应地反映到Status Register的相应位


2.坏块的分类 
   总体上,坏块可以分为两大类:(1)固有坏块:这是生产过程中产生的坏块,一般芯片原厂都会在出厂时都会将每个坏块第一个page的spare area的第6个byte标记为不等于0xff的 值。(2)使用坏块:这是在NAND Flash使用过程中,如果Block Erase或者Page Program错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现的坏块的第一个page的 spare area的第6个Byte标记为非0xff的值。


3.坏块管理 
    根据上面的这些叙述,可以了解NAND Flash出厂时在spare area中已经反映出了坏块信息,因此, 如果在擦除一个块之前,一定要先check一下第一页的spare area的第6个byte是否是0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除,以免将坏块标记擦掉。 当然,这样处理可能会犯一个错误―――“错杀伪坏块”,因为在芯片操作过程中可能由于 电压不稳定等偶然因素会造成NAND操作的错误。但是,为了数据的可靠性及软件设计的简单化,还是需要遵照这个标准。


可以用BBT:bad block table (坏块表),即坏块表来进行管理。各家对nand的坏块管理方法都有差异。

比如专门用nand做存储的,会把bbt放到block0,因为第0块一定是好的块。

但是如果nand本身被用来boot,那么第0块就要存放程序,不能放bbt了。 有的把bbt放到最后一块,当然,这一块坚决不能为坏块。 bbt的大小跟nand大小有关,nand越大,需要的bbt也就越大。


OOB是每个页(512~2048字节不等)都有的数据,里面存的有ECC(当然不仅仅ECC,还有坏块标记);

针对每个BLOCK的坏块识别则是该块第一页spare area的第六个字节。 

BBT(坏块表)是一个FLASH才有一个;




4.坏块纠正

     ECC: 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区出错;其他情况均表示出现了无法纠正的错误。 


5.补充 
(1)需要对前面由于Page Program错误发现的坏块进行一下特别说明。如果在对一个块的某个page进行编程的时候发生了错误就要把这个块标记为坏块,首先就要把块里其他好的面的内容备份到另外一个空的好块里面,然后,把这个块标记为坏块。当然,这可能会犯“错杀”之误,一个补救的办法,就是在进行完块备份之后,再将这个坏块擦除一遍,如果Block Erase发生错误,那就证明这个块是个真正的坏块,那就毫不犹豫地将它打个“戳”吧! 
(2)可能有人会问,为什么要使用每个块第一页的spare area的第六个byte作为坏块标记。这是NAND Flash生产商的默认约定,你可以看到Samsung,Toshiba,STMicroelectronics都是使用这个Byte作为坏块标记的。

     (3)为什么好块用0xff来标记?因为Nand Flash的擦除即是将相应块的位全部变为1,写操作时只能把芯片每一位(bit)只能从1变为0,而不能从0变为1。0XFF这个值就是标识擦除成功是好块。



### NAND Flash OOB区域的作用 NAND Flash中的OOB(Out Of Band)区域主要用于存储额外的信息,这些信息不包含在主要的数据区内。每一除了拥有用于存储实际数据的空间之外,还配备了一小部分空间即OOB区[^1]。 #### ECC校验码 OOB的主要功能之一是用来存放ECC(Error Correction Code)校验码。由于NAND Flash存在一定的位翻转概率,在读取或写入过程中可能会引入错误。因此,通过计算并保存ECCOOB中可以实现对数据的检错和纠错能力,从而提高数据可靠性[^2]。 #### 坏块标记 另一个重要应用是在坏块管理方面。当发现某个区块(Block)出现了不可修复的错误时,则将其标记为坏块,并记录于BBT(Bad Block Table)[^3]。具体来说,可以通过检查每个面的第一个Spare Area(即OOB的一部分)内的特定位置来判断该块是否已经被标记为坏块。如果某一块被判定为坏块,则不应再对其进行任何操作以免造成更大范围的数据丢失风险。 ### 使用方法 对于开发者而言,访问OOB通常涉及到以下几个方面: - **编程接口**:大多数嵌入式操作系统提供了专门API函数来进行带OOB的操作,比如Linux下的`mtd_oob_ops`结构体允许指定如何处理与主数据流相伴随传输的小量元数据。 - **驱动层支持**:底层硬件抽象层(HAL)负责确保每次执行读/写命令的同时能够正确地获取或设置相应的OOB字段值。这往往由芯片制造商提供的固件库完成初始化配置工作。 下面给出一段简单的Python伪代码展示如何利用MTD(Memory Technology Device)机制读取带有OOB信息的一个Page: ```python import mtdlib as mtd def read_page_with_oob(mtd_device, page_num): data_buffer = bytearray(512) oob_buffer = bytearray(16) ops = { 'mode': mtd.MTD_OPS_AUTO_OOB, 'len': len(data_buffer), 'retlen': 0, 'ooblen': len(oob_buffer), 'oobretlen': 0, 'datbuf': data_buffer, 'oobbuf': oob_buffer } result = mtd.read_oob(mtd_device, page_num * 512, ops) return data_buffer, oob_buffer if result == 0 else None ``` 此段代码展示了如何定义一个函数去调用MTD库以从给定编号的Page中同时提取其主体内容以及关联的OOB数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值