资讯详情

闪存的工作原理

转载自:https://zhuanlan.zhihu.com/p/35115499

https://zhuanlan.zhihu.com/p/26944064

https://zhuanlan.zhihu.com/p/27328255

闪存价格上涨,三星赚了很多钱。事实上,它的基本原理在20世纪80年代以后基本上没有改变。其组成和场效应管(MOSFET)十分类似:

它由:源极(Source)、漏极(Drain)、浮动栅(Float Gate)和控制栅(Control Gate)组成。相对于场效应管的单栅极结构,闪存是双栅极结构。浮动由氮化物夹在二氧化硅材料中(Insulator)之间构成。

我们的写作操作(Program)是这样:

将电子(带负电)吸入浮动栅加正电压。此后,由于浮动栅上下的二氧化硅材料不导电,这些电子被囚禁(Trap)在浮动格栅中,你不能出去。这样,无论未来是否控制格栅电压,这种状态都会保持下去,因此闪存可以断电以保存数据。注意,在操作完成后,闪存单元存储,以后我们会介绍为什么。

我们的擦除操作(Erase)刚好相反:

在源极加正电压极之间的隧道效应,将注入浮空栅的负电荷吸引到源极,排空浮动栅的电子。此时,读取状态为1。

那为什么电子是0,没有电子是1呢?我认为读取时需要给控制栅增加一个低读取电压。对于被子Program对于闪存单元,被囚禁的电子可以抵消读取电压,导致源极和漏极处于关闭状态:

相反,在控制栅的低电压作用下,源极和漏极处于导通状态:

也就是说,如果闪存单元的状态是通过向控制栅添加读取电压来判断漏极-源极之间是否处于导通状态来读取的,Program是关闭了OFF状态,0;被子Erase它处于导通状态ON,为1。

理论上,闪存可以单独擦除和编程每个单元。但为了节省成本,控制栅上的擦除电压实际上是整个块(Block)连接在一起,这就是为什么擦除要以块为单位。

每次电子进出浮动栅周围的二氧化硅,都会导致其老化:

从长远来看,浮动格栅不能很好地定电子,电子会丢失,导致泄漏电极-源极之间是否处于导向状态错误,然后数据读取错误。闪存控制器将在校准后标记为不可用的错误OP找一个空间来代替它,在那里FTL表里改变对应关系。

老狼:杂谈闪存三:FTLzhuanlan.zhihu.com

而 SLC(Single-Level Cell)的省钱版:MLC(Multi-Level Cell) 和 TLC(Triple-Level Cell) 引入使这个问题更加严重。SLC只有ON/OFF两种状态,现在TLC有8种状态:

浮动栅内的电子主要通过精确控制来实现,老化会使这种控制容易出错。这就是为什么MLC和TLC相比SLC,生命周期较短的原因:

注意图中的P/E Cycle。

闪存单元的损坏是一个不可逆转的过程。如果它坏了,它就坏了。如果人们死了,他们就不能复活。悲伤和改变。几个块不会有太大问题,OP空间可以完全覆盖。问题是,只要产生碎片,就会有越来越多的碎片,写作放大也会越来越严重,读写错误也会慢慢产生,或者速度会严重下降。此时,我们必须考虑更换块SSD了。

一个典型的Flash芯片由Package, die, plane, block和page组成如下图所示:

: 也就是chip即Flash芯片就是我们经常在那里M.2的SSD上看到的NAND flash颗粒:

: 一个NAND颗粒由一颗或多颗组成Die封装在一起,可以是平排层叠。die内部可通过3D 三星等堆叠技术扩展容量V-NAND每层容量为128Gb(16GB),通过3D堆叠技术最多可达24层,这意味着24层的总容量将达到384层GB!就像盖楼一样:

Die也是最小的单位,可以单独执行命令并返回状态。

: 一个die可以包含几个Plane.

: 重要的概念,除操作的最小单位。

:也很重要,它是写入动作的最小单位。

当我们有一块干净的时候Flash,我们想做的第一件事就是写点东西,不管我们写什么byte还有很多东西一定要用page为单位写一个byte上去写一个page。当我们满意地写东西时,如何修改?你能再写一遍吗?不幸的是,我们的program操作只能把bit 1改为0,不能从0改为1. 也就是说,我们可以将1110000改为110000,但不能改为111111111。也就是有点像逻辑and操作(我们可以通过NAND联想记住这个名字)。那怎样把0改回1呢?这取决于擦除操作,但擦除操作只能在block以上操作,如果我们把整个操作block上的所有page都读回RAM,修改后再擦掉再写回去(也叫read-modify-write),问题似乎得到了完美的解决。但别忘了,我们前面提到的,NAND flash由其擦写次数决定的寿命(P/E数 (Program/Erase Count)测量),频繁擦拭会慢慢产生碎片。那么,我们如何平衡整个部分呢?flash整个擦写次数呢?这就是我们的FTL登场了。

FTL简单地说,系统维护逻辑Block地址(LBA,logical block addresses )和物理Block地址(PBA, physical block addresses)对应关系, 如图:

有了这种映射关系,当我们需要修改时,我们不需要更改原始的物理块。我们只需要将原块标记为废块,并在原始逻辑块上找到一个无用的新物理块。问题解决了!实际情况比这稍微复杂一些。我们需要解决以下问题:

LBA和PBA究竟是对应page还是block?

如何平衡寿命?

废块什么时候回收?

这个逻辑对应表存储在哪里?

如果我们把LBA和PBA都设置成page这也叫大小page-level mapping,这与我们写的颗粒一致,非常灵活。但是这么小的粒度会带来一个问题:逻辑对应表太大!想象一下,我们有一个64GB的Die,每个page只有4KB,我们的对应表需要64*1024*1024 * 4 /4 = 64MB!这是绝对不能接受的。那么按照block,也就是block-level mapping呢? 会更好吗?至少占用空间要好得多,但因为写作不清楚page在这种情况下,通常需要整体擦除,效率会大大降低。有没有更好的办法?常用于实际使用log-block mapping,它来自我们现代log文件系统中学到经验,也充分利用了page和block不同的特点。它更复杂,我们在这里按下不表。

LBA/PBA映射本身会对寿命平衡产生积极影响。就如我们SD卡上的FAT文件系统和文件分配表将经常修改,但由于逻辑块被修改,我们可以让每个物理块不同,以避免经常擦拭相同的物理块,这本身确保没有物理块经常擦拭。但是,有一种情况是无法处理的,即冷数据块(cold block),它们被写入后,一直占据着一些物理块,它们的使用寿命仍然很长,而其他热块正在迅速损失。这种情况怎么办呢?我们只能在合适的时间帮助他们改变自己的位置。如何选择这个时间很重要,这个移动动作本身就会失去寿命本身。各有各的策略FTL算法的精髓。

废物需要找到回收的机会,这需要垃圾回收(GC,Garbage Collection)机制。

到处都是GC,各种高级语言都在炫耀自己GC,不像C /C手动回收内存。这里的GC是指废块的回收,但时机很重要,没有人想看到一个存盘,SSD硬盘固件发现没有干净的块,开始整个盘子GC,就像开始了一个没有进度条的磁盘整理,系统完全卡住了。聪明的固件往往采取预防措施,在我们不知不觉中在后台悄悄做垃圾回收,许多固件也同时进行Wear Levelling。

这个表可以随时更改。我们把它存放在哪里?你也找到了吗?page存起来呢?事实上,在大部分的NAND Flash还有一些空闲块,我们叫它OP(Over Provisioning)。如下图:

这些空闲块可以极大地帮助我们改进NAND flash性能,可:

处理坏块。如果发现坏块,这些后备件可以立即使用上,因为有映射机制,上层软件完全感受不到。

 存储LBA/PBA表

 给GC和Wear Levelling留下极大的腾挪空间。

 . 减少写入放大(Write Amplification)

事实上,现在几乎所有主流SSD等NAND die上都有OP。譬如我们拿到标称容量240GB的SSD,实际空间可能有256GB甚至更高(一般>7.37%),只不过这些多余的空间我们用不到,感受不到,它完全被SSD固件藏做私用而已。

现在能生产NAND芯片的厂家在Wikipedia上能查出11家,而能生产主控芯片和固件的就四家。他们各自的绝活都在FTL中的各种调优上,再加上Trim等等特性,这也就决定了SSD硬盘性能的好坏。

 

 

OS在删除一个文件时并不是把内容写0,而是把索引和文件存储空间标记为作废。这也是一些所谓安全删除软件有所作为之时(如何优雅的删除你的"秘密"文件 - 知乎专栏)。但是SSD主控并不知道这个情况,它还认为文件存储空间是有用的数据,在写放大和GC的过程中不停的搬来搬去,造成性能和寿命的下降。我们举个例子,如下图:

 

以OS的观点看是第一栏,第一列有四个文件,第二列删掉了文件C,第三列加入了文件E。

以OS的LBA的观点看是第二列,C文件被删掉后,E文件被直接覆盖到了C文件的位置。

以主控的PBA观点看是第三列,C文件被删掉后,主控并不知道,它还认为和第一列一样C1/C2是有价值的内容,在写放大和GC的时候被搬动。直到第三列OS在LBA原位置写了E文件后,主控才知道C1/C2是废物,才被标记为GC(垃圾收集)。

这种OS和固件的脱节在Trim命令引入后得到改善,OS在C文件被删除后会利用Trim命令告诉主控:“C1/C2没用了,你看着办吧。”,主控可以立刻标记它们为废块,不再搬动,并在合适的时机进行垃圾收集(GC)。这样极大的减小了写放大和提高了SSD的寿命。

Trim是好,但是要OS和主控都支持才行。那么如何打开Trim呢?

Windows在Win7之后就支持了Trim。

OS X在10.6.8之后支持了Trim。

我们的手机OS,Android在4.3之后才支持Trim。

不同的SSD厂商支持Trim的时间不同,如果你是在最近三年买的SSD,那么你的SSD很可能是支持Trim的,具体请阅读SSD说明。

Trim并不能消灭手机或者SSD的写放大,但是能部分减缓它。还有些别的优化的方法,这些方法是不同的SSD厂商的独家绝活。要用好它们,你最好安装各个厂家的Optimizer工具,并立刻使用它们,对于手机来说,只有选择>4.3的安卓,并保证剩余空间>25%。

标签: mlc连接器1尾罩连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台