前面很多篇,我们一直在讲 NAND。
讲 NAND 怎么读。
讲 NAND 怎么写。
讲 NAND 为什么不能覆盖写。
讲 NAND 为什么只能整块擦除。
讲 ECC 怎么把错误数据救回来。
讲 Read Retry、Vth Tracking、Soft Read、RAID 怎么一步步抢救数据。
写到这里,很容易产生一个错觉:
SSD 好像就是一堆 NAND Flash 拼起来的。
但真正的 SSD,并不是这样。NAND 只是 SSD 里的存储介质。它更像是一堆原材料。
真正把这些 NAND 管起来,让电脑觉得“这就是一块硬盘”的东西,是 SSD controller 和运行在 controller 里面的 firmware。
如果没有 firmware,NAND 本身其实非常难用。
因为它有太多限制。
它不能随便覆盖写。
它写之前通常要先擦。
它擦又不能按一个小扇区擦,而是要按 block 擦。
它读出来的数据也不是天然可靠的,还要靠 ECC 纠错。
它还会磨损,某些 block 写多了会提前报废。
所以,SSD 不是把 NAND 焊到 PCB 上就结束了。
真正困难的地方在于:
如何把一堆有缺陷、有寿命、有擦写限制的 NAND,伪装成一块连续、可靠、好用的硬盘。
这件事,主要就是 firmware 在做。
一、主机眼里的 SSD 很简单
站在电脑的角度看,SSD 很简单。
操作系统想读数据,就发一个 read command。 操作系统想写数据,就发一个 write command。 操作系统想删除文件,就把某些逻辑地址标记为unmap。
主机不关心 SSD 里面有几个 channel。 不关心有几个 die。 不关心某个 block 擦了多少次。 不关心这个 page 上次读出来错了多少 bit。 也不关心这次写入到底落在哪颗 NAND 上。
主机看到的世界,基本就是一条连续的逻辑地址空间。
比如:
我要写 LBA 100。
我要读 LBA 200。
我要把这一段数据刷新到盘里。
在主机看来,SSD 就应该像一张连续的白纸。
想写哪里就写哪里。 想改哪里就改哪里。 想读哪里就读哪里。
但 NAND 的世界不是这样。
二、NAND 眼里的世界很麻烦
NAND 里面没有所谓的 LBA 100。
它只有真实的物理位置。
比如:
哪个 channel。
哪个 ce
哪个 die。
哪个 plane。
哪个 block。
哪个 page。
哪个 column。
而且这些物理位置还不是你想怎么用就怎么用。
一个 page 写过以后,通常不能直接在原地改。 一个 block 擦除之前,里面的有效数据要先搬走。 一个 block 擦写次数太多以后,可靠性会下降。 某些 block 可能出厂就是坏的,后面使用过程中还可能长出新的坏块。 某些数据放久了,阈值电压会漂移。 某些数据读多了,还可能受到 read disturb 影响。
也就是说,主机的世界很干净:
读、写、删。
但 NAND 的世界很复杂:
写到哪里?
旧数据怎么办?
哪个 block 还能用?
哪个 block 快磨坏了?
哪些 page 已经失效?
哪些数据需要搬家?
读错了怎么纠?
纠不回来怎么办?
掉电了怎么恢复?
这中间巨大的差异,必须有人来填平。
这个人,就是 SSD firmware。
三、Firmware 是 SSD 里的“大脑”
Firmware 不是装在电脑里的软件。
它是运行在 SSD 内部 controller 上的嵌入式软件。
SSD 上电以后,controller 会执行 firmware。 主机发来的命令,不会直接砸到 NAND 上。 它会先进入 SSD controller,再由 firmware 判断应该怎么处理。
所以,firmware 做的不是一件小事。
它要管理数据怎么写入。 要管理数据怎么读出。 要保护数据不丢。 要在数据读错时用ECC纠错。 要在默认读不出来时尝试 Read Retry。 要在 block 老化时做磨损均衡。 要在空间不够时做垃圾回收。 要在温度太高时限制性能。 要在掉电之后尽量恢复内部状态。
如果说 NAND 是仓库,controller 是叉车和传送带,那么 firmware 就是仓库调度系统。
主机只说:
我要这批货。
firmware 要决定:
这批货现在放在哪个货架?
哪些货已经过期?
哪些货要搬走?
哪些货架快坏了?
哪条通道现在最空?
如果突然停电,怎么保证账本不乱?
这就是 SSD 和裸 NAND 最大的区别。
SSD 不是一堆 flash memory。
SSD 是一个由 firmware 管起来的存储系统。
四、为什么 firmware 越来越复杂?
早期 SSD 的 firmware 相对简单。
那时候它主要做的事情,是和主机通信,把主机命令翻译成内部动作。
但随着 SSD 发展,事情变复杂了。
容量越来越大。 NAND 从 SLC 到 MLC,再到 TLC、QLC。 每个 cell 存的 bit 越来越多。 状态之间的电压间隔越来越小。 可靠性压力越来越大。 性能要求也越来越高。
于是 firmware 不能只是一个简单的“命令翻译器”。
它必须变成一个完整的管理系统。它要懂 NAND 的脾气。
SLC 比较稳,但贵。 TLC、QLC 成本低,但更容易出错,寿命也更敏感。 所以在 TLC、QLC SSD 里,firmware 要做的工作更多。
它要更聪明地安排写入。 要更积极地做纠错。 要更小心地管理 block 寿命。 要更频繁地评估数据风险。
这也是为什么 SSD 看起来只是一个硬盘,但里面的 firmware 复杂度并不低。
因为它面对的不是一个完美介质,而是一个需要不断管理、修正、搬迁、纠错的 NAND 世界。
五、Firmware 最核心的任务:地址翻译
讲到这里,就可以引出 SSD 里最重要的一层:
FTL。
FTL 的全称是 Flash Translation Layer,闪存转换层。
这个名字听起来很抽象,但它做的事情可以说得很直白:
把主机看到的逻辑地址,翻译成 NAND 真实的物理地址。
主机说:
我要写 LBA 100。
但 NAND 里面没有一个地方天生叫 LBA 100。
firmware 要自己决定:
这份数据写到哪个 channel。 写到哪个 die。 写到哪个 plane。 写到哪个 block。 写到哪个 page。
写完之后,firmware 还要记下来:
LBA 100 最新的数据,现在在这个物理位置。
这张记录表,就是后面要讲的 L2P 表。
L2P 的意思是 Logical to Physical。
也就是:
逻辑地址到物理地址的映射表。
这件事非常关键。
因为 SSD 不能像传统认知里的硬盘那样,直接在原位置反复覆盖。
如果主机第二次又写 LBA 100,SSD 通常不会把原来的物理 page 直接改掉。
它更可能做的是:把新数据写到另一个新的 page。 把 LBA 100 的映射关系改到新位置。 原来的旧 page 标记为无效。
于是,主机以为自己只是“覆盖写了一次”。
但 SSD 内部其实发生了三件事:
新数据写到了新地方。
映射表更新了。
旧数据变成了无效数据。
这就是 FTL 的核心魔法。
它让主机以为 SSD 可以随便覆盖写。但实际上,SSD 内部是在不断写新位置、更新映射、回收旧空间。
六、Firmware 还要负责“收拾残局”
只要有更新映射,就一定会产生旧数据。
比如 LBA 100 被写了三次。
第一次写到 page A。 第二次写到 page B。 第三次写到 page C。
那么最新数据在 page C。
page A 和 page B 里面的数据还在 NAND 里,但它们已经不是最新版本了。
这些 page 就变成了 invalid page。
问题是,NAND 不能只擦掉 page A 和 page B。
它要擦,就要按 block 擦。
所以 SSD 后面必须做一件事:
把一个 block 里面还有效的数据搬走,然后把整个 block 擦掉,重新变成可写空间。
这就是 Garbage Collection,也就是垃圾回收。
你看,GC 不是凭空冒出来的。
它是 NAND 不能覆盖写、不能按 page 擦除、FTL 又不断更新映射之后,必然产生的结果。
而且 GC 还会带来另一个问题:写放大。
因为主机可能只写了 1GB 数据。 但 SSD 内部为了搬迁有效数据、回收 block,可能额外又写了更多数据。
这就是为什么 firmware 不只是“能写就行”。
它还必须想办法减少额外写入,降低写放大,延长 NAND 寿命。
七、Firmware 也要保护 SSD 自己
除了地址翻译和垃圾回收,firmware 还要做很多保护动作。
比如磨损均衡。NAND block 是有寿命的。
如果总是写少数几个 block,这几个 block 会先被写坏。 所以 firmware 要尽量让不同 block 的 P/E 次数更均匀。
这就像不能让一个人一直加班,而其他人都闲着。
SSD 要让所有 block 轮流承担压力。
再比如温控。
SSD 高速读写时会发热。 温度太高,不仅影响稳定性,也可能影响 NAND 的数据保持能力和 controller 的可靠性。
所以 firmware 可能会在温度过高时主动降速。
用户看到的是:
SSD 怎么突然变慢了?
但 firmware 的角度是:
再不降速,盘可能就不安全了。
所以很多时候,SSD 的性能不是单纯由硬件决定的。
Firmware 怎么调度,怎么限速,怎么做后台任务,都会影响最终体验。
八、所以,接下来进入 FTL
前面这些文章,我们一直在从 NAND 的角度看 SSD。
NAND 怎么读。 NAND 怎么写。 NAND 怎么擦。 NAND 怎么出错。 NAND 怎么靠 ECC、Read Retry、Soft Read、RAID 抢救数据。
但从这一篇开始,视角要变了。
我们不再只看一颗 NAND cell。也不再只看一个 page、一个 block。
我们要开始看:
SSD firmware 是怎么把 NAND 管成一块真正硬盘的。
不过,在正式讲 FTL、L2P、GC、写放大之前,还要先回答一个问题:
SSD firmware 为什么会变得这么复杂?
所以,下一篇先不急着讲 L2P。
下一篇先讲:
SSD Firmware 的演进史:它是怎么从一个简单的命令翻译器,变成今天这个复杂管理系统的?
讲完这条历史线,再进入 FTL,会更容易理解:
FTL 不是凭空冒出来的。 它是 SSD firmware 复杂化过程中,最核心、也最绕不开的一层。
谢谢你看我的文章
Alipay
Wechat