固态硬盘是一种典型的nand flash产品应用。与传统硬盘相化,固态硬盘内部没有移动的机械磁头,而是由固态电子存储芯片(闪存芯片)阵列级联组成,下图给出了固态硬盘的内部组成。现阶段,几乎所有基于闪存的固态硬盘都具有与此图类似的硬件逻辑结构,具有较强的普适性。
从上图可以看到一个典型的固态硬盘由主机接口逻辑单元(Host Interface Logic)、RAM(缓存)、主控芯片(SSD Controller)和多个闪存芯片组成。主机接口屏蔽了固态硬盘内部对闪存芯片的操作,并帮助存储系统无缝地对固态硬盘进行读写操作。主控制器中提供了各种处理操作、内存管理及组织和管理闪存芯片的方法(如地址映射、损耗均衡、垃圾回收、坏块管理等);闪存芯片通过总线并行级联组成,该组织方式可提供并行访问。固态硬盘内部的RAM则起到了缓存和加速的作用(有的SSD没有这个RAM)。主控芯片和闪存芯片是SSD中最为重要的两个元器件,也是影响SSD性能的主要因素。如果说主控芯片是SSD的大脑,则闪存芯片就是SSD的数据仓库。
下图给出了固态硬盘的体系结构。前三层主要功能是接口驱动,提供缓冲区存放读写请求的数据,并且提供请求队列,保存没有处理的请求和已经完成的请求,实现对固态硬盘的高效管理。通道控制层主要是控制数据的并行存储,将写数据分发到各个闪存控制器上。闪存转换层(Flash Translation Layer, FTL),是为了使固态盘存储系统对NANDFlash更好地支持,充分发挥NAND Flash存储介质的优势,主要实现逻辑/物理地址映射、坏块管理、垃圾回收和损耗均衡等功能。最底层是闪存接口层,即传统意义上的硬件抽象层(Hardware Abstract Layer,HAL)。
下图为三星某型号SSD的图片:
从上面的结构分析可知,在控制器和nand flash之间的FTL主要提供了四种功能,地址映射、垃圾回收、坏块管理和损耗均衡机制,是nandflash管理控制的重中之重。
为什么要有这个FTL来做这些事情呢?主要是由nand flash的物理特性决定的。相对于传统磁盘,nand flash具有如下独特的物理性质:
1)不能重复写(write-once)。闪存编程操作和擦除操作的最小单位不一致,闪存读、写操作的基本单位是页,而擦除操作的基本单位是块。且只能从1写为0,不能从0写为1,要写1必须通过擦除操作,编程操作是无法写1的,所以在写操作之前必须先执行擦除操作(erase-before-write)。
2)不可原地更新(out-of-place update)。由于闪存在编程之前必须擦除的物理特性,闪存中的数据若要实现原位置更新(in-place update)必须先将整个块内的有效页的数据读出,擦除此块后,再将有效页的数据与更新后的数据写回此块,这将导致写放大(Write Amplification),意思就是原本只要写一页中的部分位置,结果整个page都要写一遍。因此闪存中的数据采用非原位更新,即更新数据时,只是将新数据写到一个新的空闲页中,然后将原数据所在的物理页标记为无效页(invalid page)。这个无效页被称为“垃圾”,需要做“垃圾回收”,把这些无效页恢复成可写的空闲页。
3)闪存内的每一个块的擦写寿命(program/erase cycle)都是有限的。通常SLC类型的闪存中块的擦写寿命是十万次,而MLC类型的闪存中块的擦写寿命一般只有一万次。所以不能一直朝一个物理位置反复擦写,容易把这块区域擦坏。
4)闪存的数据保存与电荷息息相关。电荷会流失,虽然这个流失的时间在常温下可以长达十年,也可以短至几年或几个月,如果是在高温环境下,电荷流失的速度会加快,电荷流失会导致存储在闪存上的数据丢失。所以需要对闪存进行数据保持检测,若检测到有问题,则进行数据搬运回刷。
5)nandflash的一个page是一根字线上的所有存储单元,当对这一页进行读操作时,有可能影响相邻字线上的存储数据,造成读干扰问题。所以不能对某一个page多次读而不处理,应在当某个闪存块读的次数即将到预定的阈值时,便将这些数据从该物理位置搬走,挪到其他安全的闪存块上,从而避免数据出错。
6)nandflash运行中可能出现存储单元失效,需要尽可能减小失效的概率,出现了失效还需要做坏块管理。
7)在MLC或TLC闪存颗粒中,对Upper Page/ExtraPage(和Lower Page共享存储单元的闪存页)写入时,倘若发生异常掉电,那么可能会把之前LowerPage上成功写入的数据破坏,因此需要加入相应的处理机制来尽量避免发生这样的问题。
8)nandflash的类型分为SLC、MLC、TLC、QLC等,目前消费级的固态硬盘主流是TLC,TLC或MLC的读写速度比不上SLC,而通常硬盘在使用时并不是全部存满数据的,所以可以将部分TLC或MLC模拟成SLC模式来使用,来提升TLC或MLC固态硬盘的性能和可靠性。
上面说的这些特性是闪存的共性,不同的闪存间还会有各自的问题。FTL除了完成基本的地址映射,还需要处理垃圾回收(GC)、磨损平衡(Wear Leveling)、坏块管理、读干扰(ReadDisturb)处理、数据保持(Data Retention)处理等事情。随着闪存质量变差,FTL除了完成上述常规处理,还需要针对具体闪存特性,去做一些特殊处理以获得好的性能和高的可靠性。
FTL分为Host Based(基于主机)和DeviceBased(基于设备)。Host Based表示的是,FTL是在Host(主机)端实现的,用的是你自己计算机的CPU和内存资源,如下图:
相反,Device Based表示的是,FTL是在Device(设备)端实现的,用的是SSD上的控制器和RAM资源,如下图:
目前主流SSD都是Device Based FTL,就像上面那张三星的内存条那样。今天的分享就到这里,接下来主要分享FTL的几项关键技术。文章参考自《固态存储:原理、架构与数据安全 夏鲁宁 贾世杰 陈波》、《深入浅出SSD:固态存储核心技术、原理与实战 SSDFans》。