本文还在作者博客发表,详见:这里
1 SSD简介
SSD (`Solid State Drive`),即固态硬盘,是一种以半导体闪存(`NAND Flash`)作为介质的存储设备。和传统机械硬盘(`Hard Disk Drive,HDD`)不同,SSD以半导体存储数据,用纯电子电路实现,没有任何机械设备,这就决定了它在性能、功耗、可靠性等方面和HDD有很大不同。
2 SSD 协议与接口
2.1 PCIe协议
2.1.1 PCIe带宽
PCIe GEN1在链路上的传输速率为2.5Gb/s。PCIe在GEN1和GEN2采用了8b/10b编码方式,也就是说链路上传输10b数据,实际传输的有效数据只有8b。对于GEN1 x1的PCIe链路,传输的有效带宽为:
2.5Gb/s * 2 * 8b/10b * B/8b = 0.5GB/s
2代表TX和RX
2.1.2 PCIe拓扑结构
PCIe主要的组件有RC(`Root Complex`),SW(`Switch`),EP(`Endpoint`)。RC可以和所有device进行通信,一个EP也可以和一个PCIe系统中的EP来通信(Peer-to-Peer)。协议规定SW需要支持Peer-to-Peer,但对于有多个port的RC并没有要求。也就是说下图中 PCIe4 和 PCIe5 可以进行数据通信,但 PCIe4 和 PCIe6 就不一定能进行数据传输。
`RC`是指连接CPU和存储器子系统以及PCIe结构的设备,可以支持一个或多个PCIe Port,下图中RC支持3个PCIe Port,每个Port连接EP或者SW,SW形成一个子层,又可以挂接其他PCIe设备。
RC上的port可以进行数据交互,但协议并没有规定必须支持。
`SW`是PCIe链路上进行转接的一类设备,拥有一个upstream prot和多个downstream port。可以将SW当作多个PCIe桥组成的设备。
`EP`是PCIe链路的末端,有两种类型:Legacy Endpoint 和 PCIe Endpoint。传统EP支持IO事务,而且还需要能接收锁定事务。而PCIe EP不必支持IO事务和接收锁定事务,但必须支持MSI中断。
upstream port:在一个PCIe 设备上靠近RC方向的port。
downstream port:在一个PCIe 设别上远离RC方向的port。
Ingress port(入端口):接收数据包的端口。
Egress port(出端口):发送数据包的端口。
在一个PCIe系统中,`upstream port` 和 `downstream port`是固定的,但是`Ingress port` 和 `Egress port` 是不固定的,和数据包的传输方向相关。例如:图中RC发起 MWr 事务到PCI-XP 4,那么SW上的upstream就是`Ingress port`,downstream就是`Egress port`。而当PCI-XP4发起 MWr到 RC时,那么SW的downstream就是 `Ingress port`,upstream就是 `Egress port`。
2.1.3 PCIe Transaction
事务:Transaction指 requester 和 completer 之间完成一次信息传送时所需要完成的一系列或多个数据包传送的过程。
PCIe支持的事务类型与PCI、PCI-X支持的事务类型相同,包括存储器读和存储器写,IO读和IO写,配置读和配置写,此外还增加了一种新事务:消息(message)。
PCIe事务可以分为Non-Posted 和 Posted。Non-Posted指 requester 发送TLP请求包给completer时,completer需要返回一个TLP完成数据包给requester。Posted指requester 发送TLP请求事务包给 completer时,completer不需要回复TLP完成数据包给requester。
PCIe的数据传输以数据包的形式进行传输,通信涉及一种称为处理层数据包(Transaction Layer packet, TLP)的数据包发送和接收。TLP包可以分为TLP请求的数据包和TLP完成的数据包。TLP请求的数据包依据PCIe事务的不同而不同,对于Non-Posted事务,需要completer 返回 TLP完成包给requester。TLP完成包带数据信息的称为CPLD,不带数据信息的称为CPL。
更为具体的PCIe协议细节在此就不再赘述了,感兴趣可以在网上搜索更多技术细节
2.2 NVMe介绍
2.2.1 NVMe综述
非易失性内存表达(`Non-Volatile Memory Express,NVMe`)是一种通过 PCI Express 接口访问非易失性存储设备(如固态硬盘)的技术。相较于使用 SATA 接口和 AHCI 标准的传统机械硬盘(HDD),NVMe 的数据访问速度获得了极大提升。NVMe 技术正是为了利用 PCI Express 的高带宽、低延迟等优势而开发的。以往 PCI Express 接口主要应用在显卡、声卡等扩展卡上,现在也应用到了高速存储接口上。
在 NVMe 驱动器面市之前,SSD 和 HDD 基本都使用 SATA 接口。但是,SATA 通信标准自身的性能瓶颈局限着 SSD 的发展空间,因此迫切需要一种新的接口标准。最初,开发者通过直接将 SSD 插在 PCI Express 插槽上来绕过这一瓶颈,但这种做法并不符合标准规范。
NVMe 为所有制造商提供了一个统一的标准。现在,大多数现代 NVMe SSD 都采用了 M.2 接口规格,而 M.2 接口有多种尺寸规格。
当然,除了消费级SSD,企业级SSD通常采用另一些接口来满足生产环境的需求,比如U.2、E1.S、E1.L、E3.S、E3.L等等规格。
配套的还有主板上对应的接口,图中包含了U.2(SFF8639)、SATA以及eSATA接口。
以下是一个不是很完全的总结:
3 SSD 主控与闪存
SATA SSD主控板实例:
3.1 主控概述
3.2 NAND Flash概述
NAND 闪存的数据存储方法
NAND 闪存是一种通过在氮化硅的内部补集点捕获电子或空穴来存储信息的设备。在这种设备中,工作区和栅极间会留有通道供电流通过硅晶片表面,而根据浮置栅极中存储的电荷类型,便可进行存储编程 (“1”) 和擦除 (“0”) 信息的操作。同时,在一个单元内存储 1 个比特的操作被称为单层单元 (SLC)。氮化硅内部捕获的电子数量与单元晶体管的阈值电压成正比,因此,当俘获大量电子时,即实现了高阈值电压;捕获少量电子会造成低阈值电压。
通过将捕获的电子数量分成三份,并将每份的中间电压施加到单元栅极上,可以检查电流的流通状态,从而确定所捕获的电子数量。在这种情况下,存在四种状态,其中包括擦除状态:这就是 2 比特多层单元 (`2 bit-MLC`)。2 比特多层单元的这四种状态可以描述为“11”、“10”、“01”和“00”,每个单元可以存储 2 个比特的信息。从定义而言,多层单元指的是一种状态,在这种状态下,一个单元具有多层的 2 个比特或更多比特;然而在本文中,多层单元是相对于单层单元(`SLC,Single Level Cell`)( 而言的。方便起见,本文将存储 2 个比特信息的多层单元(`MLC,Multi Level Cell`)称为 2 比特多层单元。
在相同的方法下,若产生八单元状态并存储 3 个比特的信息时,此类状态则被称为三层单元 (`TLC,Triple Level Cell`);同样,当产生十六单元状态并存储 4 个比特的信息时,则称为四层单元 (`QLC, Quadruple Level Cell`)。单元状态越密集,一个单元内便可储存更多信息。举例来说,与单层单元(SLC) NAND 闪存相比,四层单元(QLC) NAND 闪存能够以 67.5% 的芯片尺寸存储相同数量的信息;但若想进行更多运行和读取的操作,就要增大单元状态的密度。相应地,由于单元状态之间的空间狭窄,更大的密度会使性能降级并出现读取错误的可能性,从而导致设备寿命缩短。因此,重要的是,首先要根据NAND闪存的应用领域决定是否优先考虑信息量,性能和寿命,然后选择适当的编程方法。
3D/4D-NAND 与 NAND 闪存行业的发展趋势
当前,NAND 闪存正在从 2D 发展到 3D 和 4D。对于 2D-NAND,如果在同一区域实现更多的单元数量,形成更小的工作区和栅级,便能增大存储容量。直至 2010 年初,2D-NAND 中的扩展一直是这项技术的主要焦点所在;然而,由于精细图案结构的限制,且储存数据会随时间推移而丢失导致使用寿命缩短,该技术已无法再实现扩展。因此,3D-NAND逐渐取而代之,成为业界关注焦点,现在所有 NAND 制造商都在开发和制造 3D-NAND 产品。
在 3D-NAND 的结构中,存储容量会随着三维叠层中堆叠层数的增加而变大。3D-NAND 使用了堆叠多层氮氧化物的方法,形成一个被称为“塞子”的垂直深孔,在其中形成一个由氧化物-氮化物-氧化物制成的存储设备。通过这种方法,仅需少量工艺即可同时形成大量单元。在 3D-NAND 中,电流通过位于圆柱单元中心的多晶硅通道,便能根据存储在氮化硅中的电荷类型实现存储编程和擦除信息。虽然2D-NAND 技术发展的目标是实现形成较小的单元, 3D-NAND 的核心技术却是实现更多层数的三维堆叠。
近年来,为了在 3D-NAND 的基础上进一步增大存储容量,SK 海力士开发了 4D-NAND技术,使得芯片尺寸进一步缩小。4D-NAND 在 3D-NAND 单元下方形成外围电路,减少了外围电路所占的面积,从而实现存储容量的最大化并降低 NAND 闪存的成本。经过几代技术的发展,当前的半导体行业已实现了用更多层数存储更多信息,包括 SK 海力士在内的业界领先企业完成了多达 128 层的产品开发和投产准备,甚至正在研发更多层的产品设备。
3.3 NAND Flash 数据存储单元整体架构
3.4 NAND Flash 封装
随着目前产品小型化的需求越来越多,且可穿戴设备的逐渐普及,工程师们对于芯片小型化的需求也越来越强烈,这个就涉及到了芯片的封装工艺。这次,我们只针对NAND flash的封装进行介绍。
芯片常用封装有:DIP、QFP、PFP、PGA、BGA、TSOP、COB等封装。这里主要介绍NAND FLASH常用的三种封装(TSOP、BGA、COB)。
3.4.1、TSOP封装
TSOP是“`Thin Small Outline Package`”的缩写,意思是薄型小尺寸封装。TSOP内存是在芯片的周围做出引脚,采用SMT技术(表面安装技术)附着在PCB板的表面,装配高度不到1.27mm。具体到FLASH这类型芯,工艺主要是把FLASH晶圆固定在钢板框架上,然后通过打线把晶圆上的点连接到框架的PIN脚上,再对表面进行注胶。
目前的最高的封闭技术能把四颗晶圆封闭在一个TSOP的FLASH内。此种TSOP封装的FLASH相对较厚。TSOP特点:电流大幅度变化时,引起输出电压较小,适合高频应用,操作比较方便(如方便手工贴片或拆片及反复利用),可靠性也比较高。同时TSOP封装具有成品率高。价格相对COB高,因此得到了极为广泛的应用。
3.4.2、COB封装
COB(chip on board) 板上芯片封装,是裸芯片贴装技术之一。半导体芯片交接贴装在印刷线路板上,芯片与PCB板是通过邦定连接的方法实现。NAND FLASH行业使用COB的封装方式主要是节省成本考虑。工程师先把外围电气走线画好,然后在PCB板上点红胶,把晶圆按指定方向及位置贴好。
然后使用邦定机对晶圆进行邦定。确认邦定电气性能良好后,对晶圆表面及PCB板部分进行树脂覆盖固定。COB 是最简单的裸芯片贴装技术,但它的封装密度远不如TSOP和BGA技术。
3.4.3、BGA封装
BGA(ball grid array) 球形触点陈列,表面贴装型封装之一。在印刷基板的背面按陈列方式制作出球形凸点用以 代替引脚,在印刷基板的正面装配NANDflash 芯片,然后用模压树脂或灌封方法进行密封。封装本体也可做的比QFP(四侧引脚扁平封装)小。
BGA主要特点:1、I/O引脚数虽然增多,但引脚之间的距离远大于QFP封装方式,提高了成品率 2、虽然BGA的功耗增加,但由于采用的是可控塌陷芯片法焊接,从而可以改善电热性能 3、信号传输延迟小,适应频率大大提高 4、组装可用共面焊接,可靠性大大提高。此封闭应用在NAND FLASH方面,主要影响是:1、可针对一些大尺寸晶圆进行封装。2、减小NAND flash封装片的面积,适用于对于主板尺寸要求严格的产品,特别是近些年来的可穿戴设备,对于产品尺寸的要求相当严格。3、此封闭大部分为原装片使用。黑片相对较少使用BGA。
4 FTL简介
FTL是`Flash Translation Layer`(闪存转换层)的缩写,
完成主机(或者用户,Host)逻辑地址空间到闪存(Flash)物理地址空间的翻译(Translation),或者说映射(Mapping)。SSD每把一笔用户逻辑数据写人闪存地址空间,便记录下该逻辑地址到物理地址的映射关系。当主机想读取该数据时,SSD便会根据这个映射,从闪存读取这笔数据然后返回给用户。
4.1 基本功能
完成逻辑地址空间到物理地址空间的映射。
闪存的特性:
(1) 闪存块(Block)不能覆盖写,需要维护一张逻辑地址到物理地址的映射表,FTL需要做垃圾回 收,即使GC (Garbage Collection, 垃圾回收)
(2) 闪存块有一定寿命,FTL需要做Wear Leveling,让数据写入均摊到每个闪存块上,即让每个块磨损都差不多,从而保证SSD具有最大的数据写入量。
(3) 闪存块读的次数有限,次数过多会有读干扰(具体见第三章),FTL需要处理读干扰问题,当某个闪存块读的次数将要达到一定阈值时,FTL需要把这些数据从该闪存块上搬走,从而避免数据出错。
(4) 数据的保存问题,必须上电,FTL才有效,好的FTL,就需要有处理数据保持问题的能力。
(5) 坏块问题,FTL管理坏块。
(6) 对MLC或TLC来说,存在`Lower Page corruption`的问题。即掉电异常问题。好的FTL,应该有机制避免这个问题。
(7) MLC或TLC的读写速度都不如SLC,但它们都可以配成SLC模式来使用。好的FTL,会利用该特性去改善SSD的性能和可靠性。
4.2 映射管理
分类:
(1)块映射:块映射有好的连续大尺寸的读写性能,但小尺寸数据的写性能是非常糟糕的。
(2)页映射:闪存页远比闪存块多,因此需要更多的空间来存储映射表。但它的性能更好,尤其体现在随机写上面。为追求性能,SSD一般都采用页映射。
(3)混合映射:块内采用页映射的方式。
```
映射表大小=SSD大小/逻辑页大小
```
(准确来说,映射表大小是SSD容量大小的1/1024。前提条件是:映射页大小为4KB,物理地址用4Byte表示。).
映射表存储在DRAM中,
HMD ( Host Memory Buffer,主机高速缓冲存储器):主机在内存中专门划出一部分空间给SSD用,SSD可以把它当成自己的DRAM 使用。因此,映射表完全可以放到主机端的内存中去。
4.3 垃圾回收
垃圾回收就是把某个闪存块上的有效数据读出来,重写,然后把该闪存块擦除,就得到新的可用闪存块了。
随机存取时候,如何挑选要回收的内存块,挑垃圾比较多的闪存块来回收,因为有效数据少,要搬移的数据少,这样腾出空闪存块的速度快。
4.4 写放大(WA)
写放大 = 写入闪存的数据量 / 用户写的数据量
写放大越大,意味着额外写人闪存的数据越多,一方面磨损闪存,减少SSD寿命,另一方面,写人这些额外数据会占用底层闪存带宽,影响SSD性能。
解决方法:
顺序写(不可控)
增大OP(预留空间)(可控)
OP比例 = (闪存空间 - 用户空间)/ 用户空间
OP越大,写放大越小:(很好理解,OP越大,每个闪存块有效数据越少,垃圾越多,因此需要重写更少的数据,因此写放大越小。同时,由于GC需要重写的数据越少,SSD满盘写性能也越好。)
4.5 垃圾回收
垃圾回收可以简单地分为三步
1 )挑选源闪存块。(BPA算法)
2 )从源闪存块中找有效数据。
3)把有效数据写人到目标闪存块。
4.6 垃圾回收时机
(1)当用户写人数据时,如果可用的闪存块小于一定阈值,这时就需要做GC,以腾出空间给用户写。这时做的GC,叫作Foreground GC (前台垃圾回收)。(被动)
(2)`Background GC` (后台垃圾回收),它是在SSD空闲(Idle)的时候,SSD主动去做的GC,这样在用户写人的时候就有充裕的可用闪存块,不需要临时抱佛脚(做`Foreground GC`),从而改善用户写人性能。但是,出于功耗考虑,有些SSD可能就不做后台垃圾回收了,当SSD空闲后,直接进入省电模式,或者做少量的GC,然后进人省电模式。(主动)
`Trim`(移除):新增的ATA命令(`Data Set Management`), 专为SSD而生
在没有Trim之前,SSD无法知道那些被删除的数据页是否无效,必须等到系统要求在相同的地方(用户空间、逻辑空间)写人数据时才知道那些数据是无效的,进而放心删除。
一般FTL都有这3个表:
(1)FTL映射表记录每个LBA对应的物理页位置;
(2)`Valid Page Bit Map (VPBM)`记录每个物理块上哪个页有有效数据;
(3)`Valid Page Count (VPC)`则记录每个物理块上的有效页个数。
通常GC会使用VPC进行排序来回收最少有效页的闪存块; VPBM则是为了在GC时只读有用的数据,也有部分FTL会省略这个表。
SSD收到Trim命令后,为了实现数据删除,固件要按顺序做以下的事情:
5~7是Trim命令处理后,GC的处理,不是Trim命令处理的部分。Trim命令不触发GC。
4.7 磨损平衡
磨损平衡,就是让SSD中的每个闪存块的磨损(擦除)都保持均衡。
冷数据(`Cold Data`): 不经常更新的块
热数据(`Hot Data`): 更新频繁的数据
年老的(`Old`)块: 擦写次数较多的块
年轻的(`Young`)块: 擦写次数较少的块 EC(擦除次数)
SSD一般有动态磨损平衡(`Dynamic WL`)和静态磨损平衡(`Static WL`)两种算法。
动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的;
静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。
4.8 掉电恢复
正常掉电:
异常掉电:
为防止异常掉电导致的数据丢失,一个简单的设计就是在SSD上加电容,SSD一旦检测到掉电,就让电容开始放电,然后把RAM中的数据刷到闪存上面去,从而避免数据丢失。
4.9 重构
SSD在把用户数据写到闪存的时候,会额外打包一些数据,我们叫它元数据,(`Meta Data`)
映射表恢复原理:
只要全盘扫描整个闪存空间,就能获得所有的映射关系,最终完成整个映射表的重构。(time过长)
4.10 坏块管理
坏块主要来源于:
1、出厂坏块(Factory Bad Block)
2、增长坏块(Grown Bad Block)
坏块管理策略:
一是略过(Skip) 策略,
二是替换(Replace)策略。(用户空间与预留空间)采用替换策略,SSD内部需维护一张重映射表(`Remap Table`) ;
4.11 SLC Cache
SLC相对MLC和TLC来说,有更好的读写性能和更长的寿命。这里所说的SLC Cache是把MLC或者TLC里面的一些闪存块配置成SLC模式来访问。
优点:
(1) 性能考虑
(2) 防止Lower Page数据被带坏
(3) 解决闪存的缺陷
(4) 更多的数据写入量
强制写人策略能保护Lower Page数据,而后者不能。非强制SLC写入策略,具有更好的后期写入性能。
4.12 RD&DR
RD指的是`Read Disturb`(读打扰),DR指的是`Data Retention`(数据保留)。 两者都能导致数据丢失,但原理和固件处理方式都不一样。
Host Based FTL:
`Device Based`存在以下缺点:
(1)FTL架构通用,不能针对具体应用做定制化。
(2)控制器芯片功能复杂,设计难度大,研发成本高。
(3)闪存更新很快,一般每年闪存厂商都会推出新一代产品,有新的使用特性,需要控制器芯片做出修改,但是芯片改版成本很高。
(4)企业级应用需要高性能、大容量,通用控制器芯片支持的最大性能和容量有限制。
(5)企业级市场需求多种多样,有些需求需要控制器提供特殊功能支持,这些是通用SSD主控芯片无法提供的。
4.13 Host Based FTL架构
Host Based SSD一般的模式是把闪存的读写接口直接开放给驱动程序,这样驱动程序就能自行管理闪存内部资源。控制器大都采用可编程逻辑器件FPGA,功能比较简单,主要实现ECC纠错和闪存时序控制。如图所示,主机驱动直接管理闪存阵列,控制器只是起到ECC纠错算法和物理协议转换的作用。