FTL映射的种类和原理
FTL 的核心功能之一就是地址映射,把主机传来的逻辑地址转成闪存能认的物理地址。这篇文章,我们就来拆解映射的三种类型、基本原理,以及映射表在不同硬件方案下是怎么存放的。
1.映射的三种类型
FTL (闪存转换层) 按映射粒度可以分为三类:块映射、页映射和混合映射。

l 块映射:以“闪存块”为最小映射单位。一个逻辑块可以对应任意物理块,块内各页的偏移位置不变。优点是映射表很小 (只记录块对应关系),节省存储空间;缺点是小数据写入性能极差,因为哪怕只改一个页,也得把整个块读出来、修改、再整块写回。所以它适合连续的大数据读写,不适合随机小数据写入。
l 页映射:以“闪存页”为最小映射单位。每个逻辑页都能独立映射到任意物理页,灵活性最高,随机写入性能很好,所以当前主流 SSD 都采用这种方案。缺点是页数量远多于块 (一块含几百上千页),映射表非常大,需要更多存储空间。
l 混合映射:是前两者的结合。逻辑块到物理块采用块映射,但块内部各页的映射是灵活的 (类似页映射),不固定偏移。因此,它的映射表大小和读写性能都介于二者之间。
总结一下:

2. 映射的基本原理
由于当前主流的 SSD 都采用页映射,接下来我们将以页映射为基础讲解映射的基本原理。
用户一般通过 LBA (Logical Block Address,逻辑块地址) 访问 SSD,每个 LBA 对应一个逻辑页 (常见大小为 512B、4KB、8KB 等)。SSD 内部则以物理页为单位读写闪存。
当用户写入一个逻辑页时,固件会找一个空闲物理页存放数据,并记录这个逻辑页到物理页的映射关系。读取时,SSD 先查映射表,找到物理地址,再读取闪存数据。
映射表称为 L2P 表 (逻辑地址到物理地址)。每次写入 (包括覆盖写) 都会新建或更新映射项,以追踪最新数据的位置。
实际中,物理页往往比逻辑页大,所以通常多个逻辑页的数据合并写入一个物理页,逻辑页与物理页内的“子页”一一对应。

映射表一般有多大?
举例:一块 256GB 的 SSD,逻辑页 4KB,则逻辑页总数 = 256GB / 4KB = 64M 个。每条映射记录用 4 字节表示物理地址,则映射表大小 = 64M × 4B = 256MB,约为 SSD 容量的 1/1024。
映射表的存放方式
l 带 DRAM 的 SSD (常见于企业级):映射表全部或绝大部分缓存在板载 DRAM 中,固件可快速查询和更新,读操作只需访问一次闪存。
l 不带 DRAM 的 SSD (常见于消费级、移动设备,如 eMMC、UFS) :因成本和功耗限制,使用控制器内部很小的 SRAM (几百 KB 到几 MB) 来管理映射表。整张表存放在闪存上,按需加载部分映射到 SRAM 缓存。典型方案是两级映射:一级表 (较小) 常驻 SRAM,记录二级表 (即 L2P 表) 各映射块在闪存中的位置;二级表大部分在闪存,小部分缓存在 SRAM。
这种设计下,读操作可能需两次闪存访问:先读映射块,再读用户数据。顺序读时,由于映射连续,加载一个映射块可满足大量连续页的读取,性能尚可;但随机读时,映射分散,频繁加载映射块会严重拖慢性能,延迟明显高于带 DRAM 的方案。

以上就是 FTL 地址映射的基本原理。
简单总结来说,块映射省空间但随机写性能拉胯,页映射性能最好但映射表占地方,混合映射是两者之间的折中。映射表可以放在 DRAM 里实现高速访问,也可以放在闪存里按需加载.后者省成本,但随机读会多一次闪存访问,延迟自然就上去了。
理解了映射机制,我们就能理解 SSD 主控是如何在后台默默打理各种“家务活”的了。

▎相关文章