《闪存问题之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 ...
随机推荐
- BZOJ 3922 - Karin的弹幕
Karin的弹幕 Problem's Link ---------------------------------------------------------------------------- ...
- CSS3制作文字半透明倒影效果
效果如图.Ps.背景线条是背景图勒,和本文效果无关... html代码如下: <div class="content"> <h3 title="专业 ...
- C++ 类中的静态成员变量,静态成员函数
//类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* ...
- TF Boys (TensorFlow Boys ) 养成记(三): TensorFlow 变量共享
上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生 ...
- 基于docker部署的微服务架构(四): 配置中心
原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理 ...
- hdu 1520(简单树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 思路:dp[u][0]表示不取u的最大价值,dp[u][1]表示取u的最大价值,于是有dp[u] ...
- Mock利器:PowerMock
powerMock不仅支持接口mock,final类.静态类.静态方法.私有方法都支持mock,还是很强大的: 1.gradle引用: myonlycompile('org.powermock:pow ...
- WPF 的拖拽操作(DragDrop)
在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样.如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化.重要的区别是用于拖放操作的方法和事 ...
- windows性能监视器的使用
https://blog.csdn.net/ab7434588/article/details/53023799 一般在客户端通过LoadRunner对服务器进行压力测试,都需要实时监控服务器端的系统 ...
- MySQL------存储过程的使用
如图: 1.创建存储过程 create procudure userAdd(na varchar(20),pass varchar(20)) select * from user where name ...