BBM(Bad Block Management)坏块管理
不管WL算法如何高明,在使用中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制。何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦时数据的准确性。

坏块分出厂坏块和使用过程中出现的坏块,SSD有坏块表来管理坏块。出厂坏块在上面会有标记,所以很容易就能被识别,而使用中出现的坏块就要靠主控的能力了。一般来说,越到闪存生命的后期(P/E数开始接近理论最大值),坏块就会开始大量出现。
一般来说闪存出厂都包含坏块,不过厂商有个最小有效块值(NvB-minimum number of valid blocks),以Intel的34nm MLC L63B来说,1个die(裸晶,详细解释见备注)上4,096个块里至少要有3,936个块是好的。从这上面可以知道,虽然出厂的闪存可能有坏块,但是厂商保证在正常的生命周期里,好块数量不会低于3936个块。而且每个die的第一个块地址(00h)在出厂时是必须保证完好的。(ECC后,这个块必须有效,ECC相关知识后面会有介绍)。闪存出厂前都会被执行擦除操作,厂商会在出货前会把坏块标记出来(厂商会在坏块的第一个页的SA区打上标记,SA区知识将在后面ECC部分介绍)这样坏块管理软件就能靠监测SA区标记来制作坏块表。由于在使用中会产生坏块,所以SSD的主控在每次写入/擦除/复制等操作后都要检查块的状态。对颗粒的ECC要求也要达到厂商的标准以上(主控强不强,看ECC能力也是一个参考)。坏块管理算法是必须的,坏块并不会影响好块的性能。
坏块的标记和管理: 刚出厂的颗粒内部已经被完全擦除过(全盘区块数据为FFh),坏块在出厂时也被标记上了。以MLC来说,颗粒内任何块里最后页的SA区首个字节数据非FFh的话,那就是坏块。
主控必须在每次擦除前读取一下坏块信息,因为坏块信息是可以被擦除的并且不能在擦除后恢复,所以建议不要去擦除原始的坏块信息。在读取闪存内所有的SA区域后,坏块表就被建立。纯靠自己的坏块识别方法而不使用原厂提供的SA区域坏块信息创建的坏块表是不严谨的做法,因为在原厂测试中,坏块可能是在某些特定环境下才会出现,所以有可能在自行的检测中被遗漏掉。
当坏块表创建后,主控会把坏块表保存在某个好的块里,每次重启后,主控会从那个块里把表调用进缓存(RAM)里。坏块表中定义的地址是不能被访问的,所以当系统想去访问这个块的地址时,FTL会重新把它映射到好的块地址上去。
块的替换: 在闪存的生命周期中,坏块会逐渐增多。闪存设备上有个状态寄存器,它的作用就是检测操作是否正确完成。当进行写入或擦除操作,状态寄存器检测到错误时,即可判定当前的块为坏块。
鉴于闪存的写入是以页为单位操作的,操作时可能影响到整个块里其它页的数据,所以当状态寄存器发现写入出现错误时,坏块管理程序就能够用好的块替换这个坏块,重新在新的好块里写入这个数据,并把检测到的坏块里其余的有效页数据全部复制到新的块里去,标记老的块为坏块,更新坏块表里的地址,把原本坏块的地址重新映射到新的好块里。(坏块管理流程见下图)

备注:Die在集成电路上的表现是一小堆可以实现特定功能的半导体材料。通常集成电路是从电子硅晶圆(EGS)或其它半导体材料(例如砷化镓)通过光刻工艺批量生产。晶圆被切割成许多小片,每一片包括一个完整的电路。这些小片就叫做Die。
BBM(Bad Block Management)坏块管理的更多相关文章
- Nand Flash基础知识与坏块管理机制的研究
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- 坏块管理(Bad Block Management,BBM)
看了很多坏块管理的文章,加上自己的理解,把整个坏块管理做了个总结. 坏块分类 1.出厂坏块 又叫初始坏块,厂商会给点最小有效块值(NVB,mininum number of valid blocks) ...
- 【转】nand flash坏块管理OOB,BBT,ECC
0.NAND的操作管理方式 NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...
- nand flash 的oob 及坏块管理
0.NAND的操作管理方式 NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...
- NAND Flash大容量存储器K9F1G08U的坏块管理方法
转: http://www.360doc.com/content/11/0915/10/7715138_148381804.shtml 在进行数据存储的时候,我们需要保证数据的完整性,而NAND Fl ...
- nand flash坏块管理OOB,BBT,ECC
转:http://www.cnblogs.com/elect-fans/archive/2012/05/14/2500643.html 0.NAND的操作管理方式 NAND FLASH的管理方式:以三 ...
- STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析
最近因项目需要,做一个数据采集的单片机平台.需要移植 FatFs .现在把最后成果贴上来. 1.摘要 在 STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为 ...
- Oracle corrupt block(坏块) 详解
转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...
- Oracle current redo.log出现坏块后的不完全恢复案例一则
1异常出现 8月30日下午2时左右,接同事电话,说数据库异常宕机了,现在启动不了. 2初步分析 我让现场把alert.log发过来,先看看是什么问题. 关于ORA-00353和ORA-0 ...
随机推荐
- vb listview 的常用操作
常用操作:获取当前行数和列数: MsgBox "行数:" & ListView1.ListItems.Count & "列数:" & L ...
- GetMemory()函数
NO1 void GetMemory(char *p) { p=(char *)malloc(100); } void Test() { char * str=NULL; GetMemory(str) ...
- FAQ:Python 断点调试
Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2 step over ...
- android process bar 几种style
process bar 圆形style记录 1. style="?android:attr/progressBarStyleSmall" //根据主题变颜色 2. holo 主题下 ...
- Delphi 编码转换 Unicode gbk big5(使用LCMapString设置区域后,再用API转换)
原文:http://blog.dream4dev.com/article.asp?id=17 function UnicodeEncode(Str: string; CodePage: integer ...
- Centos 升级MySQL版本或者Yum安装Mysql5.6
Centos 升级MySQL版本或者Yum安装Mysql5.6 1.从MySQL Yum仓库下载最新的rpm文件:http://dev.mysql.com/downloads/repo/yum/Cen ...
- Pascal 线段树 lazy-tag 模板
先说下我的代码风格(很丑,勿喷) maxn表示最大空间的四倍 tree数组表示求和的线段树 delta表示增减的增量标记 sign表示覆盖的标记 delta,sign实际上都是lazy标志 pushd ...
- oracle中文支持
- 通过iframe在其父窗口中打开隐藏元素
先上代码 $(".login-box,#dl,.top_01 a:eq(1)").click(function(){ if(self!=top){ parent.$("# ...
- 利用KVO监视一个view的frame
首先,keyPath一定是frame,而不是frame.origin.x之类的路径,因为再点下去的话,就是访问结构体内部的值了,KVO是无法检测的,会报错找不到KeyPath. 代码如下: [_fun ...