从读写到垃圾回收,一文带你读懂SSD

从主机开始,用户从操作系统应用层面对SSD发出请求,文件系统将读写请求经驱动转化为相应的符合协议的读写和其他命令,SSD收到命令执行相应操作,然后输出结果。每个命令的输入和输出经协议标准组织标准化,这和HDD 无异,只不过将 HDD 替换成 SSD 硬件来存储数据,访问的对象变成 SSD。
SSD的输入是命令(Command),输出是数据(Data)和命令状态(Command Status)。SSD 前端(Front End)接收用户命令请求,经过内部计算和处理,输出用户所需要的数据或状态。
【核心解构】SSD三大模块,从前端到后端的精密协作
SSD主要由前端接口和相关的协议、中间的FTL、后端和闪存通信三大模块组成,这三部分精密协作,执行我们日常的存储指令。
前端接口和相关的协议:SSD的“外交官”,负责与主机无缝对接,无论是SATA、SAS还是PCIe,都能游刃有余,确保命令与数据畅通无阻。
中间FTL(闪存转换层):FTL,SSD的灵魂所在,它不仅负责逻辑地址与物理地址的巧妙映射,还精通垃圾回收、磨损平衡等绝技,确保SSD性能与寿命的双重飞跃。
后端和闪存通信模块:在这里,数据被精心呵护,通过标准化的ONFI或Toggle协议,确保每一次读写、存储都精准无误。
总的来说,SSD前端负责和主机直接通信,接收主机发来的命令和相关数据,命令经SSD处理后,最终交由前端将命令状态或数据返回给主机。SSD 通过SATA、SAS 和 PCIe 等接口与主机相连,实现对应的 ATA、SCSI和 NVMe 等协议。
【读写揭秘】我们看看 SSD 是怎么进行读写的
下面以写为例。
主机通过接口将写命令发送给 SSD,SSD收到该命令后执行命令,并接收主机要写入的数据。数据一般会先缓存在 SSD 内部的 RAM 中,FTL会为每个逻辑数据块分配一个闪存地址,当数据达到一定数量后,FTL便会给后端发送写闪存请求,然后后端根据写请求把缓存中的数据写到对应的闪存空间。
由于闪存不能覆盖写,所以闪存块需擦除才能写入。主机发来的某个数据块不是写在闪存固定位置,SSD 可以为其分配任何可能的闪存空间以供其写入。因此,SSD内部需要FTL来完成逻辑数据块到闪存物理空间的转换或者映射。
举个例子。
假设SSD容量为128GB,逻辑数据块大小为4KB,则该SSD一共有128GB/4KB=32M 个逻辑数据块。每个逻辑块都有一个映射、即每个逻辑块在闪存空同中都有一个存储位置。闪存地址的大小如果用4B表示,那么存诸32M个遭辑数据块在闪存中的地址则需要 32Mx4B=128MB 大小的映射表。
正因为 SSD 内部维护了一张逻辑地址到物理地址转换的映射表,所以当主机发来读命令时,SSD能根据需要读取的逻辑数据块查找该映射表,获取这些逻辑数据在闪存空间中的位置,后端便能从闪存上把对应数据读到SSD内部缓存空间,然后前端负责把这些数据返回给主机。
【至关重要的FTL】
由于前端接口协议都是标准化的,后端和闪存的接口及操作也是标准化的(闪存遵循ONFI 或者 Toggle 协议),因此,二个SSD 在前端协议及闪存确定下来后,差异化就体现在FTL 算法上了。FTL算法决定了性能、可靠性、功耗等 SSD 的核心指标。
其实,FTL 除了要完成逻辑数据到闪存空间的映射外,还要做很多其他事情。
前面提到,闪存不能覆盖写,因此随着用户数据的不断写入,闪存空间会产生垃圾(无效数据)。FTL需要做垃圾回收,以腾出可用闪存空间来写用户数据。
图片以上图为例,在块x和块y上有很多垃圾数据,其中块x上的A、B、C为有效数据,块y上的 D、E、F、G为有效数据。垃圾回收就是把一个或者几个块上的有效数据搬出来集中写到某个空闲块上(比如块z)。当这些块上的有效数据都搬走后,FTL 便能擦除这些块,然后把这些块拿出来供 SSD 写入新的数据。
还有,闪存都是有寿命的,每个闪存块不能一直写数据,因此,为保证最大的数据写入量,FTL必须尽量让每个闪存块均衡写人,这就是磨损平衡。除此之外,FTL 还需要实现坏块管理、读干扰处理、数据保持处理、错误处理等很其他事情。理解了FTL,SSD 的工作原理也就掌握了。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
