TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
8 i7 }+ L. _4 }2 x
; w' Z3 n* g1 V1 \- u一个NAND FLASH内部存储组织结构是这样的:一个Device有若干个DIE(或者叫LUN),每个DIE有若干个Plane,每个Plane有若干个Block,每个Block有若干个Page。每个Page对应着一个Wordline,由成千上万个存储单元构成。
3 k3 [/ S# z5 Z! x: a" | 4 r" i3 c! t) o3 H) ^: j/ V& t
DIE/LUN是接收和执行FLASH命令的基本单元。上图中,LUN0和LUN1可以同时接收和执行不同的命令。但在一个LUN当中,一次只能执行一个命令,你不能对其中的某个Page写的同时,又对其他Page进行读访问。
9 C* i& H; M. _* \" d9 h0 V: ~) ]: A0 J8 @
一个LUN又分为若干个Plane,一般为1个或者2个,现在也有4个Plane的NAND了。每个Plane都有自己独立的Cache Register或者 Page Register,一般情况下,两个Register内容都是一样的,其大小等于一个Page的大小。Host在写某个Page的时候,它是先把数据从Host传输到该Page所对应Plane的Cache Register当中,然后再把整个Cache Register当中的数据写到NAND FLASH阵列;读的时候类似,它先把这个Page的数据从FLASH阵列读取到Page Register,然后再按需传给host。这里按需是什么意思?就是我们读取数据的时候,没有必要把整个Page的数据都传出来给Host,按需选择数据传输。但要记住,无论是从FLASH 阵列读数据到Page Register,还是把Page Register的数据写入FLASH阵列,都是以Page为单位!+ n# N% E0 @, h4 `6 x
5 M. r$ R9 I' C- X1 ~我们通常所说的FLASH读写时间,是不包含数据从NAND与HOST之间的数据传输时间。FLASH写入时间指是一个Page的数据从Cache Register 当中写入到FLASH阵列的时间,FLASH读取时间是指一个Page的数据从FLASH阵列读取到Page Register的时间。对现在的MLC NAND FLASH来说,写入时间一般为几百个微秒甚至几毫秒,读取时间为几十微秒。 NAND FLASH一般都支持Multi-Plane或者说Dual-Plane操作。那么什么是Dual-Plane操作呢?对写来说,HOST先把数据写入到上第一个Plane的Cache Register当中,数据hold在那里,并不立即写入到FLASH阵列,等HOST把同一个LUN上的另外一个或者几个Plane上的数据传输到相应的Cache Register当中,再统一一起写入FLASH阵列。假设写入一个Page的时间为1.5ms,一个Page的传输时间为50us:如果按原始的Single Plane操作,写两个Page需要至少3ms+20us;但如果按照Dual-Plane操作,由于隐藏了一个Page的写入时间,写入两个Page只要1.5ms+20us,缩减了几乎一半的时间,写入速度几乎翻番。对读来说,使用Dual-Plane操作,两个不同Plane上的Page数据会在一个NAND读取时间加载到各自的Page Register当中,这样用一个读取时间读取到两个Page的数据,读取速度加快。考虑读取时间和数据传输时间相当,假设都是50us,Single Plane读取传输两个Page需要50us*4=200us,Dual-Plane则需要50us*2+50us=150us,时间为前者的75%,读取速度也有大的提升。 NAND FLASH的擦除是以Block为单位的。为什么呢?那是因为在组织结构上,一个Block当中的所有存储单元(Cell)是共用一个衬底的(Substrate)。当你对某衬底施加强电压,那么上面所有浮栅极的电子都被吸出来了。每个NAND Block都有擦写次数的限制,当超过这个次数时,该Block可能就不能用了:浮栅极充不进电子(写失败),或者浮栅极的电子很容易就跑出来(比特翻转,0->1),或者浮栅极里面的电子跑不出来(擦除失败)。这个最大擦写次数按SLC,MLC,TLC依次递减:SLC的擦写次数可达十万次,MLC一般为几千到几万,TLC降到几百到几千。随着NAND FLASH工艺的不断进步(现在已进入1Xnm时代),NAND FLASH容量不断加大,但性能与可靠性却在变差。要克服NAND FLASH的这些不利因素,对SSD固件算法带来了更多更大的挑战。 FLASH Block不一定要达到寿命才不能用。一块FLASH,刚出厂的时候就会有坏块,这些坏块叫出厂坏块。有些厂商会在该Block的某几个Page当中加入坏块标记(如下图所示),用户在使用前,应该按照FLASH DATASHEET把这些坏块挑出来建立坏块表,避免以后使用这些坏块。8 I9 D8 c) |4 c% ^
! K9 ]# E5 I" u- @8 m) F也有一些FLASH厂商会直接告诉你哪些块是出厂坏块,这些信息存储在FLASH的某个地方,用户只需读取这些信息即可,无需对整个FLASH的所有Block进行坏块扫描。6 j- M4 q6 q4 y
* @0 K" L" Q& o+ Q( h& e& L5 W" y+ ~
用户在时候过程中,一个Block,即使未达到最大使用寿命,也有可能变坏。FLASH是允许有一定的坏块率的。质量好的FLASH,坏块率是很小的;质量差的FLASH,坏块产生频繁。所以在挑选SSD的时候,尽量挑选知名主流的FLASH厂商生产的FLASH,质量有保证。. {# [+ k% y$ y5 ]$ V8 A7 n
& ^' q9 G# p) e# X对MLC来说,擦除一个Block的时间大概是几个毫秒。 NAND FLASH的读写则是以Page为基本单元的。一个Page大小主要有4KB,8KB,16KB。对MLC或者TLC来说,写一个Block当中的Page,应该顺序写:Page0,Page1,Page2,Page3,…;禁止随机写入,比如:Page2,Page3,Page5,Page0,…,这是不允许的。但对读来说,没有这个限制。SLC也没有这个限制。 HOST是通过一系列FLASH命令与NAND通讯的。每个FLASH,都定义了其支持的命令,以MICRON 某型号的FLASH为例,它定义了如下命令:
6 Q& c1 w. Z$ n% t$ N& g) A& Z
" j3 G& g& b$ u$ E; n0 m* B$ J不同的FLASH,所支持的命令有所差异。用户应该严格按照FLASH DATASHEET与FLASH通讯。
' |/ l% ^; A* Y- C. h2 k
; H9 t! H2 Z( G, u+ e谈谈NAND FLASH的一些特点,或者说它作为存储介质面临的挑战。
/ b9 Y. |2 S6 A- k8 J& ]+ h6 NBlock具有一定的寿命,不是长生不老的。前面提到,当一个Block接近或者超出其最大擦写次数时,导致存储单元的永久性损伤,不能再使用。随着NAND工艺不断向前,这个擦写次数也变得越来越小。 Y! K0 a2 f" h5 i* @# a. `
3 ?- I) ?- k) Q
- 在NAND当中的存储单元中,先天就有一些是坏掉的,或者说不稳定的。并且随着NAND的不断使用,坏的存储单元越来越多。所以,用户写入到NAND的数据,必须有ECC保护,这样即使其中的一些比特发生反转,读取的时候也能通过ECC纠正过来。一旦出错的比特超过纠错能力范围,数据就丢失,对这样的Block,我们应该废弃不再使用。
- FLASH先天有坏块,也就是说有出厂坏块。并且,用户在使用的时候,也会新添坏块,所以用户在使用FLASH的时候,必须有坏块管理机制。
- 读干扰(Read Disturb)。什么意思?从NAND读取原理来看,当你读取一个Page的时候,Block当中未被选取的Page控制极都会加一个正电压,以保证未被选中的MOS管是导通的。这样问题就来了,频繁的在一个MOS管控制极加正电压,就可能导致电子被吸进浮栅极,形成轻微的Program。从而最终导致比特翻转。但是,这个不是永久性损伤,重新擦除Block还能正常使用。注意的是,Read Disturb影响的是同一个Block中的其它Page,而非读取的Page本身
/ Z( t$ Y1 ~# `# M, t, S
% p# r& _/ [( k: K L) Y& i
- o* [/ `/ ~) W# L, J$ X
4.写干扰(Program Disturb)。除了Read Disturb会导致比特翻转,Program Disturb也会导致比特翻转。还是要回到FLASH内部的Program原理上来。
, B. `6 H, g7 x5 S, U% ?0 `$ E" B * S& s! \+ a; J3 s& t: F" w* l
# [# g$ w" a1 y7 j2 B+ ~# G8 S& o$ F
我们写一个Page的时候,数据0和1混合的。由于对擦除过的Block,其所有的存储单元初始值就 是1,所以Program的时候,只有写0的时候才真正需要Program。如上图所示,绿色的Cell是写0,需要Program的,红色的代表写1,并不需要Program。我们这里把绿色的Cell称之为Programmed Cells,红色的Cell叫Stressed Cells。写某个Page的时候,我们是在其 WordLine的控制极加一个正电压(上图是20V),对于Programmed Cells所在的String,它是接地的,不需要Program Cell所在的String,它是接一正电压(上图为10V)。这样最终产生的后果是,Stressed Cell也会被轻微Program。与Read Disturb不同的是,Program Disturb 影响的不仅是同一个Block当中的其它Page,自身Page也受影响。相同的是,都是不期望的轻微 Program导致比特翻转,都非永久性损伤,经擦除后,Block还能再次使用。
- z9 N9 \; a0 k9 y 5.电荷泄漏。存储在NAND FLASH存储单元的电荷,如果长期不使用,会发生电荷泄漏。不过这个时间比较长,一般十年左右。同样是非永久性损伤,擦除后Block还能使用。" z4 D& Q& ~! W; F7 R& h3 ^
上面说的这些,是所有NAND面临的问题,包括SLC,MLC和TLC。对MLC来说,又有其特有的 一些问题。6 v$ B+ s$ j! i0 X' v" n, d' j
- 正如前面提到的,MLC最大擦写次数变小。这样,就更需要Wear Leveling技术来保证整个存储介质的使用寿命。
- 对MLC来说,一个存储单元存储了两个比特的数据,对应着两个Page:Lower Page和Upper Page。假设Lower Page先写,然后再写Upper Page的过程中,由于改变了整个Cell的状态,如果这个时候掉电,那么之前写入的Lower Page数据也丢失。一句话,写一个Page失败,可能会导致另外一个Page的数据损坏。
- 前面说到,不能随机写。不能先Program Upper Page,然后再Program Lower Page,这点就限制了我们不能随意的写。
- 写Lower Page时间更短,写Upper Page时间更长。所以会看到有些Page写入速度快,有些Page写入时间慢。读取时间对Lower Page和Upper Page来说都差不多。9 {; x' S6 T. |% A9 f% ?
|
9 A1 x6 y8 L1 m5 P" v1 ]+ T- x- Y |
|