linux nandflash oob

对于Nand Flash,每一个页,对应一个空闲区域(OOB),这个区域是基于Nand Flash的硬件特性,数据在读写的时候容易出错,为了保证数据的正确性,就产生了这样一个检测和纠错的区域,用来放置数据的校验值。OOB的读写操作,一般都是随着页的操作一起完成,也就是在读写页的时候,对应的OOB就产生了,那么OOB有什么用途呢?
1). 标记是否存在坏块
2). 存储ECC校验
3). 存储一些与文件系统相关的信息,对于ramfs/jffs2文件系统映像文件中没有OOB的内容,需要根据OOB的标记略过坏块,然后将一页的数据写入,然后计算这一页数据的ECC校验码,然后将它写入到OOB区;而对于yaffs文件系统,因为本身包含有OOB区的数据(里面纪录有坏块标记,ECC校验码,其他信息),所以首先需要检查坏块,如果是,则跳过,然后写入数据,最后写入OOB数据。

1. ECC校验
  ECC(Error Checking and Correction),是一种用于Nand Flash的差错检测和修正的算法。由于操作的时序和电路稳定性等原因,常常会出现一些bit出错,也就是原来的某个位,本来是0而变成了1,或者本来是1而变成0。从现象来看,问题其实看起来并不是特别的严重,但是如果恰好某个重要的文件的某一位发生了变化,那么问题就大了,可能会导致此时文件不能运行,如果这个文件是一个影响系统的程序,那么直接将导致系统会出现问题,所以对于Nand Flash就出现了这样一个机制。它能纠正1个bit的错误和检测出2个bit的错误,对于1bit以上的错误无法纠正,而对于2bit以上的错误不能保证能检测。对于ECC其纠错算法是什么样的呢?
  1)当往Nand Flash写入数据时候,每256个字节生成一个ECC校验,针对这些数据会生成一个ECC校验码,然后保存到对应的page的OOB数据区。
  2)当读取Nand Flash的数据时候,每256个字节就会生成一个ECC校验,那么对于这些数据就会计算出一个ECC校验码,然后将从OOB中读取存储的ECC校验和计算的ECC校验想比较,

2. 坏块处理  
  对于Nand Flash,比较严重的是坏块,也就是说一个块中包含有一个或者多个位是坏的,而现在对于坏块有两种分类
  1) 出厂的时候就存在坏块:在出厂之前,就会做对应的标记,标记为坏块,一般芯片厂商会将每个坏块第一个page的spare erea的第6个byte标记为不等于0xff。
  2) 使用过程中产生的坏块,就需要将这个块作为坏块来处理,为了与固有的坏块信息保持一致,也需要将新发现的坏块的第一个page的spare eare的第6个Byte标记为非0xff的值。

  对于上面的处理方式,如果我们需要擦除一个块之前,必须先要检查下第一个page的spare eare的第6byte是否为0xff,如果是就证明是一个好块,是可以擦除;如果不是,就证明这是一个坏块,那么就不能擦除,对于这种方法,难免会出现一些错误操作,所以Nand Flash专门设计了一个BBT(bad block table)的坏块表用来进行管理。各个Nand的坏块管理的方法还不尽一样,有的会将bbt放到block0,因为block0一定是好块,但是block0一般是用来作为boot,那么也将导致不能放bbt,也有的会将bbt放到最后一个分区。

  从上面可以看出,OOB是每一个页都会有的数据,里面存放的的有ECC,而BBT是一个flash才会有的,针对每个block的坏块识别是第一个spare erea的第六个字节。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值