来自 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》总结的更多相关文章

  1. 《FLASH PROGRAMMING 那些事》总结

    注明来自 http://www.ssdfans.com/?p=5589 以MLC为例: 对FGF(Floating Gate Flash)技术的,MLC programming一般分两步走:先prog ...

  2. 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 ...

  3. [原创] Keil uVision5 下载程序 add flash programming algorithm选项缺少需要的算法解决办法

    MDK开发环境从V4升级到V5后,支持包不再是集成到开发环境当中,而是封装在PACK中,需要自行安装,比较麻烦. 搭建MDK开发环境以及破解的方法,在前面的文章中有详细说明,这里不再赘述,有兴趣的可以 ...

  4. 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 ...

  5. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...

  6. 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 ...

  7. Error:Flash Download Failed-"Cortex-M3"

    Error:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/H ...

  8. STM32F4读写内部FLASH【使用库函数】

    STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...

  9. Flash Download Failed-"Cortex-M3"

    rror:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/HW ...

  10. Stm32_调试出现 Error:Flash Download Failed-"Cortex-M3"

    rror:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/HW ...

随机推荐

  1. 快速开发 jQuery 插件的 10 大技巧(转)

    1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...

  2. MTP(Media Transfer Protocol(媒体传输协议))简介

    ---恢复内容开始--- 1,简单说明 MTP,微软公司规定的新的传输规则(字面本来应该是协议的,但是自己感觉更像是规则,制定了基本上的所有路线,剩下的是你想怎么选择罢了,使用者完全没有可能在它的框架 ...

  3. [WPF]实现密码框的密码绑定

    正如绑定TextBox控件的Text属性一样, 我们希望能够将PasswordBox空间的Password属性进行绑定, 比如在MVVM模式中,这似乎是必须的, 但可惜的是, Password属性是不 ...

  4. C++ map修改指定key的value

    对于修改C++指定key的value,网上查了很多,都说直接insert就会覆盖原来的值,是否是这样的呢?  C++ Code  12345678910111213141516171819202122 ...

  5. Android5.0新特性-Material Design

    概述 2014年,Google携Android5.X重装归来.全新的UI设计和更加优化的性能,令开发人员眼前一亮 安装和配置Android5.0开发环境 开发Android还得靠AS.下载地址 htt ...

  6. windows系统添加服务命令

    管理员身份进入cmd sc create TestSvr binPath= D:\Program Files\test.exe start= auto

  7. NSUserDefaults设置bool值重启后bool只设置丢失问题

    本文转载至 http://blog.csdn.net/cerastes/article/details/38036875   NSUserDefaultsbool同步synchronize无效 今天使 ...

  8. 写一个SingleTon,(饿最终、懒同步)

    1.饿汉式: public class SingleTon { private SingleTon(){ } private final static SingleTon instance = new ...

  9. 从远程(包括ftp,http等协议)地址获取文件流信息

    URL url = new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg&quo ...

  10. 【BZOJ2287】【POJ Challenge】消失之物 背包动规

    [BZOJ2287][POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了 ...