1.4 SSD基本工作原理
从主机PC端开始,用户从操作系统应用层面对SSD发出请求,文件系统将读写请求经驱动转化为相应的符合协议的读写和其他命令,SSD收到命令执行相应操作,然后输出结果,每个命令的输入和输出经协议标准组织标准化,这是标准的东西,和HDD无异,只不过HDD替换成SSD硬件存储数据,访问的对象变成SSD。
SSD的输入是命令(Command),输出是数据(Data)和命令状态(Command Status)。SSD前端(Front End)接收用户命令请求,经过内部计算和处理逻辑,输出用户所需要的数据或状态。
从图1-13所示可以看出,SSD主要有三大功能模块组成:
图1-13 SSD系统调用
❏ 前端接口和相关的协议模块;
❏ 中间的FTL层(Flash Translation Layer)模块;
❏ 后端和闪存通信模块。
SSD前端负责和主机直接通信,接收主机发来的命令和相关数据,命令经SSD处理后,最终交由前端返回命令状态或数据给主机。SSD通过诸如SATA、SAS和PCIe等接口与主机相连,实现对应的ATA、SCSI和NVMe等协议,如表1-5所示。
表1-5 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所示为例,在Block x和Block y上有很多垃圾数据,其中Block x上的A、B、C为有效数据,Block y上的D、E、F、G为有效数据。垃圾回收就是把一个或者几个Block上的有效数据搬出来集中写到某个空闲Block上(比如Block z)。当这些Block上的有效数据都搬走后,FTL便能擦除这些Block,然后又能把这些Block拿出来供SSD写入新的数据了。
图1-14 垃圾数据回收
还有,闪存都是有寿命的,每个闪存块不能一直写数据,因此,为保证最大的数据写入量,FTL必须尽量让每个闪存块均衡写入,这就是磨损平衡(Wear Leveling)。
除此之外,FTL还需要实现坏块管理、读干扰处理、数据保持处理、错误处理等很多其他事情。理解了FTL, SSD的工作原理也就掌握了。关于FTL,本书有专门章节介绍,读者可自行跳到第4章阅读。