《闪存问题之READ DISTURB》总结
来自 http://www.ssdfans.com/?p=1778
闪存存在几个问题,影响着数据可靠性:
1.擦除次数,闪存擦除次数增多,会使隔离栅极的电化学键变弱。
2.data retention问题,随着时间的流逝,存储在闪存中的数据会消失,原因是浮栅极里面的电子跑出来了。电子跑出来的速度是跟擦除次数成正比的,也就是,闪存擦写次数越多,电子跑得越快,也就是数据消失得越快。
3.program disturb和read disturb,顾名思义,就是读写闪存的时候,会影响数据。
还是这张图,基本存储单元结构图,浮栅极被上下绝缘层(黄色标示)包裹,电荷就存储在里面。牢记这张图,这是闪存的根。
闪存由Block组成,是擦除的基本单元。一个Block包含若干个Page,上图以256个Page为例。一个Wordline(上图黄色所示)对应着一个Page或几个Page,取决于SLC, MLC和TLC:对SLC来说,一个WordLine对应一个Page;MLC则对应2个Page,这两个Page是一对:Lower Page 和Upper Page;TLC对应3个Page。(关于上述论断,是按单个Plane来说的,而且是2D闪存的)一个Page有多大,那么WordLine上面就有多少个存储单元(Cell),即有多少个Bitline。上图示例有71488个bitline,表明该闪存Page大小是71488/8 = 8936 bytes。
以MLC为例:
我们知道,要使一个晶体管导通,在控制极必须加一个大于晶体管阈值电压的控制电压。对浮栅极晶体管来说,往浮栅极里面注入不同数量的电子,将改变晶体管的阈值电压。由于不同的状态有不同的阈值电压,我们可以通过在控制极加不同的参考电压来判断当前存储单元数据。以上图为例,低比特数据代表lower Page数据,高比特数据代表Upper Page数据。 如果我们要读Upper Page数据,要区分0还是1,只需在控制极加个参考电压V2:如果晶体管导通,说明是1 (因为不管11还是10状态,其阈值电压都小于V2);否则就是0 (因为不管01还是00,阈值电压都大于V2)。如果要读取Lower Page数据,要区分0和1的话,就稍微复杂了:我们首先得在控制极加个参考电压V1,如果导通,说明数据是1(因为11状态阈值电压小于V1);如果截止,没有办法说明是0和1,因为10,01,00三个状态阈值电压都比V1大,这个时候我们需要改变控制极的参考电压为V2,再看晶体管的导通状态,如果导通,说明数据是0 (10状态阈值电压小于V2),如果晶体管截止,还是无法判断数据是0和1,因为01和00状态阈值电压都大于V2。这个时候,我们需要再次改变控制极的电压为V3,这个时候,导通说明是1,截止说明数据是0。从中我们看出,读lower page需要尝试多次参考电压,才能获得最后的数据,而读upper page时,只需一次,所以对MLC来说,读lower page和读upper page的时间是有所差异的。
在上图中,如果我们把00和01状态调换一下,如下图所示:
如果我们还是读lower Page数据。首先,我们在控制极加个参考电压V1,如果晶体管导通,说明数据是1;如果截止,这个时候我们在控制极直接加参考电压V3,如果导通,说明是0,因为不管10还是00,低比特都是0;如果截止,就是1。我们最多经过两次电压尝试就把数据区分出来了,比前面少了一次电压尝试。有些闪存厂家采取前面那种编码方式,而有些闪存厂家采取后面那种编码方式。所以,不同商家的闪存特性存在差异。
如上图所示,先看左边(a)部分,如果我们要读取一个Block当中的某个Page,需要在其它所有Wordline控制极上加一个Vpass电压,这样保证了其它晶体管都是导通的;对被读取的Page,需要在其所在Wordline的控制极上加参考电压Vref,可能加一次参考电压就能把数据读出来,也可能需要几次,具体做法如前面描述。
再看右半部分(b)。读操作时,衬底加电压是0,读取的page,控制极上的电压是Vref,而对其他Page,控制极上加的电压是Vpass。问题来了,由于其他Page上加了一个Vpass,相对来说是一个比较大的电压,这样就会在浮栅极和衬底形成一个较强的电场,可能就把一些电子吸入浮栅极,有点轻微Program的意思。随着该Block上Page数据读的次数越来越多,无辜的page(没有被读到的)中的浮栅极电子进入越来越多,导致里面数据状态发生变化,也就意味着数据出错。
这就是Read Disturb。同一个block上page读,自己没事,导致其他没有被读的page数据出错。
Read Disturb会导致浮栅极进入电子,跟Data Retention浮栅极电子流失不同。由于有额外的电子进入,会导致晶体管阈值电压右移(Data Retention问题导致阈值电压左移),如下图所示:
由于晶体管阈值电压偷偷的发生了变化(变大了),闪存内部逻辑如果还是按照之前的参考电压加在控制极上,然后去判断数据的话,肯定会发生误判,也就是读到错误的数据。 阈值电压右移的速度,也就是Read Disturb影响数据的程度,一方面与你读该Block上数据的次数有关,读的越多,右移越多,影响越大,另一方,还跟你block的擦除次数有关,擦写次数越多,绝缘效果越差,电子进入浮栅极就越容易,read Disturb的影响也就越大。
闪存使用者如何对付Read Disturb呢?
一般做法就是记录每个Block读的次数,赶在这个数值达到阈值(闪存厂家提供)之前,把block上所有的数据刷新一遍(读出来,擦除,然后在写回),或者把数据搬到别的地方。回到开头那个问题,Read Disturb为什么会导致SSD性能下降?就是因为一个Block上的数据读的次数太多了,固件需要赶在UECC出现之前,把整个Block数据刷新或者搬移,占用底层带宽,导致Host读写性能下降。
还有人研究发现,减小Vpass可以缓解Read Disturb。因为Vpass变小,电场减弱,吸入电子的能力减弱,能缓解read Disturb影响。一方面,现在闪存厂商都没有开放调Vpass电压的接口给用户;另一方面,过低的Vpass会导致读失败。该方法只能缓解,不能从源头上杜绝Read Disturb的影响。
《闪存问题之READ DISTURB》总结的更多相关文章
- 《FLASH PROGRAMMING 那些事》总结
注明来自 http://www.ssdfans.com/?p=5589 以MLC为例: 对FGF(Floating Gate Flash)技术的,MLC programming一般分两步走:先prog ...
- Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors
Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...
- [原创] Keil uVision5 下载程序 add flash programming algorithm选项缺少需要的算法解决办法
MDK开发环境从V4升级到V5后,支持包不再是集成到开发环境当中,而是封装在PACK中,需要自行安装,比较麻烦. 搭建MDK开发环境以及破解的方法,在前面的文章中有详细说明,这里不再赘述,有兴趣的可以 ...
- Turtelizer 2 provide JTAG Flash programming and debugging of ARM based boards via USB
http://www.ethernut.de/en/hardware/turtelizer/ Introducing Turtelizer 2 Overview Turtelizer 2 had be ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...
- Programming Internal Flash Over the Serial Wire Debug <SWD> Interface -- EFM32
1 Debug Interface Overview 1.1 Serial Wire Debug Serial Wire Debug (SWD) is a two-wire protocol for ...
- Error:Flash Download Failed-"Cortex-M3"
Error:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/H ...
- STM32F4读写内部FLASH【使用库函数】
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...
- Flash Download Failed-"Cortex-M3"
rror:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/HW ...
- Stm32_调试出现 Error:Flash Download Failed-"Cortex-M3"
rror:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/HW ...
随机推荐
- 详解 Go 语言中的 time.Duration 类型
swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...
- [velocity] velocity详解
(1)为什么要使用模版语言? 在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTML.XML等).这和 JSP 技术的目标非常接近.但是,JSP 模型可以毫无阻碍地访问底层的 Ser ...
- MyBatis 是一款优秀的持久层框架
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- AJAX解惑篇(转)
这篇文章会使你对AJAX有一个基本了解,并给出两个容易上手的例子. 什么是AJAX AJAX是一个新的合成术语,隐含了两个已经存在多年的JavaScript特性,但是直到最近,随着一些诸如Gmail. ...
- (转)java泛型
转自:http://blog.csdn.net/lonelyroamer/article/details/7868820 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 参考:j ...
- linux基础教程---内容操作
一.寻找文件里的指定内容 寻找文件里的指定内容,输出内容所在行的所有信息 grep 被搜索内容 文件路径名 >grep var passwd //在 ...
- winform 递归循环阻止机构
private void GetTree() { DataTable dt = new DataTable(); var sql = @" select OUID,ParentOUID,OU ...
- openssl之EVP系列之8---EVP_Digest系列函数具体解释
openssl之EVP系列之8---EVP_Digest系列函数具体解释 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作 ...
- 编程之美 set 12 快速找出故障机器
题目 1. 所有的 ID 都出现 2 次, 只有一个例外, 找到那个例外的 ID 2. 所有的 ID 都出现两次, 只有两个例外, 找出例外的那两个 总计 1. 剑指 offer 上有这两道题的解法, ...
- iOS开发之 -- 获取设备的唯一标示符
各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...