码迷,mamicode.com
首页 > 其他好文 > 详细

Nand flash的OOB管理

时间:2016-06-19 20:01:00      阅读:434      评论:0      收藏:0      [点我收藏+]

标签:

  通过上节,对于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的第六个字节。

 

Nand flash的OOB管理

标签:

原文地址:http://www.cnblogs.com/ken-song2016/p/5598473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!