闪存单元与传统CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体器件)单元相比,增加了一层浮栅(Floating Gate),如图2.9所示。浮栅与衬底(Subtrate)之间有一层氧化物绝缘层,称为隧穿层。闪存单元通过施加电压将电子充入浮栅。由于隧穿层的存在,电子不容易逃逸,因为浮栅可以较为稳定地保持电子的状态,从而表示闪存单元的状态。
图2.9 闪存单元的结构 [ 2 ]
闪存单元通过感应和改变浮栅中电荷的多少对数据进行读写。写入数据时向浮栅注入电荷形成电荷势阱,以表示数据“0”;浮栅中未注入电荷表示数据“1”。读数据时通过感知位线上的电平高低来识别“0”和“1”。
闪存单元可根据每个存储单元存储比特的多少分类,包括SLC(Single Level Cell,单级单元)、MLC(Multi Level Cell,多级单元)、TLC(Triple Level Cell,三级单元)和QLC(Quad Level Cell,四级单元)等,如图2.10所示。SLC表示一个存储单元只存储1比特。这时候只需要区分浮栅上是否存有一定量的电荷即可。MLC表示一个单元存储2比特。这时候不但要区分该单元是否存储了电荷,还需要判断其存储了多少电荷,且需要控制对浮栅编程的电荷数量。TLC表示一个存储单元存储3比特。QLC表示一个存储单元存储4比特。以TLC模式举例,将TLC存储的比特,分为Lower Bit、Upper Bit和Extra Bit,读取Lower Bit需要一个读电压即可,读取Upper Bit和Extra Bit则需要多个读电压。
图2.10 闪存多比特单元 [2]
闪存具有如下特性。
写前擦除: 在闪存中,闪存单元的编程为单向编程,即仅支持从状态“1”写为状态“0”,而不支持从状态“0”写为状态“1”。闪存在重写一个页前,需要进行擦除操作。闪存以页为单位读写,以块为单位擦除。
读写粒度与擦除粒度不同: 闪存的读、写及擦除操作的延迟差异较大。单个闪存页的读平均延迟为十微秒量级,写平均延迟为百微秒量级,而擦除的平均延迟在毫秒量级。
磨损问题: 闪存单元具有有限次的P/E(Programming/Erase,擦/写)操作,即每个闪存单元具有有限的寿命。闪存单元在接近擦写次数极限时,无法可靠存储数据状态。这被称为闪存的耐久性(Endurance)问题。尽管存储密度得以提升,单位容量价格降低,但闪存的耐久性问题却愈加严峻。每个SLC闪存单元可承受100000次P/E操作,每个MLC闪存单元可承受10000次P/E操作,而每个TLC闪存单元可承受的P/E操作次数仅为1000次。
为避免P/E操作引入的延迟,闪存采用异地更新的策略进行页重写,即将新的页重定向到空闲闪存页,并标记当前页为无效页,以进行后续回收。
在SSD内部,闪存芯片通过不同的通道连接到闪存控制器,如图2.11所示。在闪存芯片中,单个芯片封装了多个颗粒,每个颗粒可独立执行指令。每个颗粒包含多个闪存片,每个闪存片拥有独立的寄存器,可提供多闪存片之间的流水指令执行。
注:FTL即Flash Translation Layer,闪存转换层。
图2.11 SSD内部结构示意
NAND芯片内部结构如图2.12所示,该图展示了一个Target的结构。一个封装的NAND芯片内部可能包含多个Target,每个Target都由一个独立的片选信号CE#控制,每个Target可能包含多个LUN(Logic Unit Number,逻辑单元号)/芯片(Die),通常为1个、2个、4个或8个等,LUN是执行指令的最小单元,不同的LUN可以并行地执行指令。每个LUN内,可以被划分为一个或者多个平面,每个平面对应一组闪存块和一个缓存。闪存块是执行P/E操作的最小单位,由若干个WL(Word Line,字线)控制的存储单元组成。页(Page)是执行读/写操作的最小单位,对于TLC而言,一个WL对应3个页,包括数据部分和冗余部分(带外数据)。除了不同LUN之间可以并行执行指令外,同一个LUN内部的不同平面也可以并行执行一些操作。
图2.12 NAND芯片内部结构
通过不同级别的并发,SSD可提供充足的访问带宽。这一特性被称为SSD的内部并发特性。表2.1给出了SSD与磁盘的性能比较。
表2.1 SSD与磁盘的性能比较 [3]