从主机 PC 端开始,用户从操作系统应用层面对 SSD 发出请求,文件系统将读写请求经驱动转化为相应的符合协议的读写和其他命令,SSD 收到命令执行相应操作,然后输出结果,每个命令的输入和输出经协议标准组织标准化,这是标准的东西,和 HDD 无异,只不过 HDD 替换成 SSD 硬件存储数据,访问的对象变成 SSD。
 
图 1-13 SSD 系统调用
 
SSD 的输入是命令(Command),输出是数据(Data)和命令状态(Command Status)。SSD 前端(Front End)接收用户命令请求,经过内部计算和处理逻辑,输出用户所需要的数据或状态。
 
从图 1-13 可以看出,SSD 主要有三大功能模块组成:
 
1. 前端接口和相关的协议模块;
 
2. 中间的 FTL 层(Flash Translation Layer)模块;
 
3. 后端和闪存通讯模块。
 
SSD 前端负责和主机直接通讯,接收主机发来的命令和相关数据,命令经 SSD 处理后,最终交由前端返回命令状态或数据给主机。SSD 通过诸如 SATA、SAS 和 PCIe 等接口与主机相连,实现对应的 AHCI、SCSI 和 NVMe 等协议。
 
表 1-1 SATA/SAS/PCIe 接口协议
 
我们看看 SSD 是怎么进行读写的。
 
主机通过接口发送写命令给 SSD,SSD 接收到该命令后执行,并接收主机要写入的数据。数据一般会先缓存在 SSD 内部的 RAM 中,FTL 会为每个逻辑数据块分配一个闪存地址,当数据凑到一定数量后,FTL 便会发送写闪存请求给后端,然后后端根据写请求,把缓存中的数据写到对应的闪存空间。
 
由于闪存不能覆盖写,闪存块需擦除才能写入。主机发来的某个数据块,它不是写在闪存固定位置,SSD 可以为其分配任何可能的闪存空间写入。因此,SSD 内部需要 FTL 这样一个东西,完成逻辑数据块到闪存物理空间的转换或者映射。
 
举个例子,假设 SSD 容量为 128GB,逻辑数据块大小为 4KB,所以该 SSD 一共有 128GB/4KB = 32M 个逻辑数据块。每个逻辑块都有一个映射,即每个逻辑块在闪存空间都有一个存储位置。闪存地址大小如果用 4 字节表示,那么存储 32M 个逻辑数据块在闪存中的地址则需要 32M*4B = 128MB 大小的映射表。
 
正因为 SSD 内部维护了一张逻辑地址到物理地址转换的映射表,当主机发来读命令时,SSD 能根据需要读取的逻辑数据块,查找该映射表,获取这些逻辑数据在闪存空间所在位置,后端便能从闪存上把对应数据读到 SSD 内部缓存空间,然后前端负责把这些数据返回给主机。
 
由于前端接口协议都是标准化的,后端和闪存的接口及操作也是标准化的(闪存遵循 ONFI 或者 Toggle 协议),因此,一个 SSD 在前端协议及闪存确定下来后,差异化就体现在 FTL 算法上了。FTL 算法决定了性能、可靠性、功耗等 SSD 的核心参数。
 
其实,FTL 除了完成逻辑数据到闪存空间的映射,还需要做很多其它事情。
 
前面提到,闪存不能覆盖写,因此随着用户数据的不断写入,闪存空间会产生垃圾(无效数据)。FTL 需要做垃圾回收(Garbage Collection)以腾出可用闪存空间用以写用户数据。
 
图 1-14 垃圾数据回收
 
以图 1-14 为例,在 Block x 和 Block y 上有很多垃圾数据,其中 Block x 上 A,B,C 为有效数据,Block y 上 D, E,F,G 为有效数据。垃圾回收就是把一个或者几个 Block 上的有效数据搬出来集中写到某个空闲 Block (比如 Block z)。当这些 Block 上的有效数据都搬走后,FTL 便能擦除这些 Block,然后这些 Block 又能拿出来供 SSD 写入新的数据了。
 
还有,闪存都是有寿命的,每个闪存块不能一直写数据,因此,为保证最大的数据写入量,FTL 必须尽量让每个闪存块均衡写入,这就是磨损平衡(Wear Leveling)。
 
除此之外,FTL 还需要实现坏块管理、读干扰处理、数据保持处理、错误处理等等其它很多事情。理解了 FTL,SSD 的工作原理也就掌握了。关于 FTL,本书有专门章节介绍,读者可自行跳到第四章阅读。
 
1.2 SSD 产品核心参数
 
用户在购买 SSD 之前,会关注它的一些参数指标,比如能跑多快、用的是什么闪存等等。特别是企业级用户,需要全方位研究 SSD 的核心指标,解决关注什么指标,如何关注,竞争产品对比这些问题,最终逐一拨开产品内在本质。本节以 SSD 产品为例,带大家一起解读 SSD 产品的核心参数。