NAND 坏块管理

NAND的操作管理方式

     NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 (Block) = xxxx (Pages),1(Page) =528 (Bytes) = 数据块大小(512Bytes) + OOB 块大小(16Bytes,除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码)。

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

            

以HYNIX为例,图中黑体的是实际探测到的NAND,是个2G bit(256M)的NAND。PgSize是2K字节,PgsPBlk表示每个BLOCK包含64页,那么每个BLOCK占用的字节数是 64X2K=128K字节;该NAND包好2048个BLOCK,那么可以算出NAND占用的字节数是2048X128K=256M,与实际相符。需要注意的是SprSize就是OOB大小,也恰好是2K页所用的64字节。

 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是每个页都有的数据,里面存的有ECC(当然不仅仅);而BBT是一个FLASH才有一个;针对每个BLOCK的坏块识别则是该块第一页spare area的第六个字节。
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这个值就是标识擦除成功,是好块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js备忘录模式——实现分页点击已经请求过上一页的数据(读js设计模式)

例子:新闻数据实现分页||点击下一页后又点击上一页后不用再次请求数据,避免资源浪费,网速不好,用户体验效果差 备忘录模式:在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以方便日后对…

运放的典型电路举例与计算仿真

运放电路的计算,通过记各种公式很难记住,但是掌握其两个重要概念,所有计算均可迎刃而解。 那就是运放的两个重要特性: 虚断:运放本质特性,输入阻抗大,两个输入端视为等效开路; 虚…

【SPOJ 694】Distinct Substrings (更直接的求法)

【链接】h在这里写链接 【题意】 接上一篇文章【题解】 一个字符串所有不同的子串的个数∑(len-sa[i]-height[i])【错的次数】 0【反思】 在这了写反思【代码】 #include<bits/stdc.h> using namespace std;const int N 2e3; const int MAX_CHAR 300;//每个数字的最大…

HTML-锚点

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>锚点</title> <style> .box1,.box2{ height: 600px; border:1px solid; } </style> </head> <body> <a h…

/dev/mtdN和/dev/mtdblockN的区别

1、/dev/mtdn是linux中的MTD架构中&#xff0c;系统自己实现的mtd分区所对应的字符设备&#xff0c;其里面添加了一些ioctl&#xff0c;支持很多命令&#xff0c;如MEMGETINFO&#xff0c;MEMERASE等。 而mtd-util中的flash_eraseall等工具&#xff0c;就是以这些ioctl为基础而…

#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019独角兽企业重金招聘Python工程师标准>>> 对于不同的计算机体系结构&#xff0c;设备可能是端口映射&#xff0c;也可能是内存映射的。如果系统结构支持独立的IO地址空间&#xff0c;并且是端口映射&#xff0c;就必须使用汇编语言完成实际对设备的控制&#xff…

三极管基本参数介绍与放大电路分析

全称为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导器件&#xff0c;作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。 两个PN结的排列方式有两种&#xff1a;PNP和NPN。 三个端点依序称为射极&#…

Nand分区及nand erase简解

我的nand flash 32M&#xff0c;kernel 2.6.18, rootfs is emb linux, cramfs.nand flash分区如下&#xff1a;static struct mtd_partition nand_partitions[] {/* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */{.name "bootloader",.offset 0,.size 32…

eclipse启动了tomcat,但是浏览器打不开欢迎页

tomcat在eclipse中启动成功&#xff0c;主页却打不开 症状&#xff1a; tomcat在eclipse里面能正常启动&#xff0c;而在浏览器中访问http://localhost:8080/不能访问&#xff0c;且报404错误。同时其他项目页面也不能访问。 关闭eclipse里面的tomcat&#xff0c;在tomcat安装目…

洛谷1011 车站

水题。题目描述有坑&#xff0c;可以先根据样例手算试一试//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn50; int f[50],…

三极管放大电路三种类型

根据三极管三个电极与输入输出端子的连接方式&#xff0c;可归纳为三种&#xff1a;共发射极电路、共基极电路和共集电极电路&#xff1b; 三种电路的共同点&#xff1a;各有两个回路&#xff0c;一个输入回路一个输出回路&#xff0c;两个回路有一个公共 端&#xff0c;而公…

ImportError: No module named 'chardet'

1.使用requsets出现这个错误&#xff0c;ImportError: No module named chardet 原因&#xff1a;requests依赖其他一些模块 解决&#xff1a;依次使用pip安装即可 pip install certifi pip install chardet pip install idna pip install urllib3转载于:https://www.cnblogs.c…

各种组件的js 获取值 / js动态赋值

jQuery获取Select选择的Text和Value:语法解释&#xff1a;1. $("#select_id").change(function(){//code...}); //为Select添加事件&#xff0c;当选择其中一项时触发2. var checkText$("#select_id").find("option:selected").text(); //获取…

Linux下/proc目录简介

1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统&#xff0c;在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统&#xff0c;它只存在内存当中&#xff0c;而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。 用户…

Mysql带返回值与不带返回值的2种存储过程

过程1&#xff1a;带返回值&#xff1a; 1 drop procedure if exists proc_addNum; 2 create procedure proc_addNum (in x int,in y int,out sum int) 3 BEGIN 4 SET sum x y; 5 end 然后&#xff0c;执行过程&#xff0c;out输出返回值&#xff1a; 1 call proc_addNum(2,3,…

MOS管的米勒效应简介

一、米勒平台介绍 Mos管的三极都会存在以下 的三个电容,分别是:Cgs,Cgd,Cds。 米勒电容指的是Cgd。米勒效应在MOS驱动中臭名昭著,他是由MOS管的米勒电容引发的米勒效应,在MOS管开通过程 中,GS电压上升到某一电压值后GS电压有一段稳定值(图中t2~t3阶段),过后Vgs电压…

PopupWindow 使用详解(二) Popwindow 制作常见花哨效果

帝都几日降温&#xff0c;终于被撂倒了。but 只要一息尚存就得不断进步&#xff01;于是&#xff0c;写出 《PopupWindow 使用详解》的第二篇 笔记&#xff0c;先奉上 第一篇链接: 《PopupWindow 使用详解&#xff08;一&#xff09; 中文API 文档 赠送 ListPopupWindow 中文 A…

hbase replication原理分析

本文只是从总体流程来分析replication过程&#xff0c;很多细节没有提及&#xff0c;下一篇文章准备多分析分析细节。replicationSource启动过程org.apache.hadoop.hbase.regionserver.HRegionServer#startServiceThreads ->org.apache.hadoop.hbase.replication.regionserv…

8168

http://blog.csdn.net/crushonme/article/details/10287693 http://blog.csdn.net/yangxueble/article/details/10138763

Mysql查询结果只有一条的情况下把值赋值给变量,再用if else 流程判断

1 BEGIN 2 set n(SELECT count(day) from log where dayCURDATE()); 3 IF n0 THEN 4 call m_LogInsert(); 5 ELSE 6 call m_LoginCheck(); 7 end if; 8 end 转载于:https://www.cnblogs.com/mengms/p/7629486.html