Flash Translation Layer
Updated: Oct 19th, 2023
FTL是SSD中的核心,其负责将主机访问SSD的逻辑地址转换成SSD上真实的闪存物理地址,是NAND Flash与上层应用之间的一个中间层。上层应用通过LBA(Logical Block Address,逻辑块地址)读写SSD,SSD将LBA翻译成实际的物理地址从而对闪存进行读写,并通过修改映射关系与移动数据实现磨损均衡、坏块管理、数据保持、垃圾回收等功能。
FTL的必要性
固态中使用的存储介质,如NAND Flash这一种闪存介质,存在的一些特性导致我们必须使用FTL来对读写闪存的行为进行管理。
- 闪存块必须先擦除才能写入,不能覆盖写。
- 修改操作变成了1)添加新数据,2)使原有数据无效化(变成垃圾),需要通过FTL修改逻辑块地址->闪存物理地址的映射关系才能实现这样的修改操作。
- 需要FTL进行垃圾数据的回收。
- 闪存块都是有一定寿命的。
- 每个闪存块能够被擦除写入的次数是有限的。
- 不进行管理,可能会有几块闪存块由于频繁的读写操作很快坏掉。
- FTL会进行磨损均衡(Weal Leveling)来尽可能让所有闪存块磨损的程度相近,延长固态寿命。
- 每个闪存块可被读的次数是有限的。
- 由于闪存芯片存在读干扰问题,读的次数过多会发生比特翻转。
- 因此需要在读的次数到达一定阈值后就对数据进行移动或刷新。
- 闪存的数据保持问题。
- 闪存在不通电或不读写的情况下,其也会由于电子迁移导致比特翻转。
- 闪存中存在坏块。
- 等等..
FTL需要实现的功能
- 地址翻译
- 垃圾回收
- Trim
- 磨损均衡
- 坏块管理
- 其他
- 掉电恢复
- SLC Cache
- Read Disturb & Data Retention
FTL实现地址翻译
参考《深入浅出SSD》第四章:FTL 4.2
FTL的功能主要通过地址转换来体现,我们提出两个新问题:
- 地址转换的粒度是?(可以类比内存多级页表,一般页表项越大,项数越少,转换效率越高,但内部碎片的问题会更加严重)
- 地址映射表存放的位置是?(如果能放DRAM会更快吧)
两种不同的SSD架构对这两个问题分别作出了不同的回答。
质量较好,成本较高的SSD,常常以页为基本单位进行单位转换,映射表存放在SSD内部的DRAM中以进一步提升地址转换的效率。
(图源《深入浅出SSD》P127)
而比较廉价的SSD,或U盘,往往以块为基本单位,映射表存放在闪存中。考虑到每个块会含有大量页,典型的一般在256个页。如果一个页式4K那读写粒度就是1MB起步了,这样子在完成随机小写任务的时候,就会带来大量的写放大,也就是说你本来只要写几个B的数据,结果因为这几个B分布的比较远,实际上你其实写了几个MB的数据。另外在闪存上的映射表进行地址转换性能非常差,就算加上一个映射表缓存,性能依然难以和前面提到的SSD相抗衡。随机小写更是经常发生映射表缓存不命中的问题。
(图源《深入浅出SSD》P127)
由此可见,在类似的存储介质下,不同的结构会对SSD的性能有着巨大的影响。
FTL中的垃圾回收
参考《深入浅出SSD》第四章:FTL 4.3, 4.4
考虑到对数据进行修改操作会使旧数据成为“垃圾数据”,这些垃圾数据占据了大量的空间,我们需要对其进行回收以释放出更多的空闲空间。这一个过程就是垃圾回收。具体的回收方法是:寻找垃圾数据较多的闪存块,将其中的有效数据复制出来,那么就可以擦除这些块,成为未来可用的空闲块了。(如下图,对两个闪存块进行垃圾回收,将有效数据复制出来并擦除闪存块后,就得到了两个可用的空闲块)
(图源《深入浅出SSD》P13)
FTL中的磨损均衡
参考《深入浅出SSD》第四章:FTL 4.5
FTL中的坏块管理
参考《深入浅出SSD》第四章:FTL 4.7
FTL中的其他功能
FTL如何实现掉电可恢复?
参考 《深入浅出SSD》第四章:FTL 4.6
(图源:《深入浅出SSD》P154)
SLC Cache
参考 《深入浅出SSD》第四章:FTL 4.8
【硬件科普】固态硬盘的缓存是干什么的?有缓存和无缓存有什么区别? - YouTube
RD & DR
参考 《深入浅出SSD》第四章:FTL 4.9
参考资料
- 《深入浅出SSD》第四章:FTL