闪存基本原理
如下图所示浮栅晶体管,当判断是0或1的时候,是在源极加电,当源极和漏极能导通则为1,否则为0;源极和漏极能导通的前提是源极和漏极之间充满电子。
假如在控制极加电(电子具有向电性),衬底的电子就会被吸到浮栅极,源极和漏极之间就无法导通了,此时就为0,即浮栅极充满电子为0;如在衬底加电,电子又会从浮栅极吸出,源-漏极之间就能导电,即为1。这就是浮栅晶体管能标识0/1的原理。
当随着控制极-衬底之间加电次数的增多,隧道氧化层会变得越来越薄,导致浮栅极-衬底之间电子可以相互逃逸,次数晶体管的状态就不稳定了,也就坏了。
在初始状态下,电子都集中在衬底,也就是说晶体管初始表示为1;如果向晶体管写1,则无需操作,如果写0,则要控制极加压。
另外一旦晶体管被写入后,如果再想表示为1,就需要衬底加压,这就是擦除操作;而读的话只涉及源-漏极之间的加压,不会影响电子状态,故可以直接读。
如上所述,擦除操作会影响到隧道氧化层,所以晶体管是有寿命的,当擦除到一定次数,晶体管就不稳定了。
事实上在组成闪存时,固定数量的晶体管使用同一个衬底,这个固定数量的晶体管称为一个块,即闪存是按块擦除的。
闪存类型
用一个存储单元有无电子来区分0和1,即一个存储单元只能存储1位数据,这样的闪存称为SLC (Single Level Cell)。通过提升存储密度,用一个存储单元存储多位数据,先后出现了MLC、TLC、QLC等类型的闪存,即在控制极加不同的电压,浮栅极就会存储不同数量的电子,以此来表示不同的数据。
假如一个存储单元共有100个电子,用0~5、20~40、50~70、80~100个电子分别表示四种状态,这四种状态就可以用两位编码,这就是MLC的概念;同理TLC是三位编码,能表示2^3次方个数据,QLC是四位编码,能表示2^4次方个数据。这样 相同数量的晶体管就能存储更多的数据。
但是存储密度提高的一个代价就是写性能会变差,因为表示的状态越多,越需要对电子数量精细化的控制,而且少量电子的流失就可能导致数据发生变化。
比如在SLC,用0~10个电子数量表示0,50~100个电子数量表示1,即使浮栅层逃逸了20个电子,也不会进入0~10表示的“1”的状态,而对于MLC,同样流失20个电子,可能就从"00"变成“01”了,当然电子的流失跟隧道氧化层相关,如果隧道氧化层越强,越会不发生电子流失,但是随着擦除次数的越来越多,隧道氧化层的能力越来越弱,比如对SLC来说擦除10万次内,对电子流失都不是那么敏感,但对MLC来说,可能擦除数千次就隧道氧化层的损伤导致的电子流失就接受不了了。所以闪存密度的提高另外的代价就是闪存的寿命和稳定性都会变差。
闪存的组织结构
闪存芯片的基本组成单元从小到大依次是:cell(单元)、page(页)、block(块)、plane(平面)、Die(核心)、NAND flash(闪存芯片)。
页是读写的基本单元,块是擦除的基本单元;页和块是两个常用的单位;但此处的页跟操作系统中文件系统的页不是同一个。
Die等同于SCSI中的LUN的概念;在HDD中一般一个盘只有一个LUN,但SSD的闪存中一般一个盘都有多个Die,以支持更大的并发。
一个Die又分为若干个Plane(一个Plane包含若干块),每个Plane都有独立的Page Register(页缓存)和Cache Register(闪存缓存),这里页缓存的大小等于闪存的页大小(可见页大小在闪存出厂时就确定了,而文件系统的页大小是可改的),这些闪存缓存和页缓存就是闪存内部的RAM。
Q:闪存的一个闪存块共用一个衬底,也就是说擦除的单位是块,但闪存的写入是以页进行的,为什么不是以块进行?
A:由于闪存的特性,即使只擦除很少的数据,也需要对整块进行擦除,这就需要先缓存块中的原有数据,并在原有数据上进行更新,介质擦除后,再把数据写入,此时的写入是以页进行的,但实际上整个块都需要写入,这就是写要经过“读-擦除-写”的过程,所以写的效率是很低的。
但闪存实际读写的单位是页,这是为了从逻辑上能更加精细化的控制写入的部位;实际上当多个I/O操作同一个块时,可以合并成对块的一次I/O的操作,此时以页来划分块更容易控制;当然以块为单位写,我认为也是没问题的,也可以把对此块的多个I/O合并成一此操作,只是以页为单位在逻辑上更好控制而已。