同样的 NAND 闪存颗粒,三星做的 UFS 和某二线厂商做的 UFS,跑分能差 30% 到 50%。颗粒是一样的——差距全在主控芯片上。这篇文章拆解控制器的四大核心能力:FTL 地址映射、磨损均衡、坏块管理、CMDQ 命令调度。
控制器是什么?
UFS 内部三大组件:控制器芯片、NAND 闪存芯片、DRAM 缓存芯片。其中控制器是最复杂、最关键的一个——它决定了 UFS 的性能天花板。
核心定位
所有的读写命令、地址翻译、垃圾回收、磨损均衡、坏块管理——全由控制器执行。可以这样理解:
- NAND 闪存是仓库——负责”存”
- DRAM 缓存是中转站——负责”加速”
- 控制器是仓库管理系统——负责”指挥”
仓库本身有各种限制:不能直接覆写、擦除次数有限、读写不对称。这些”怪癖”全依赖控制器的算法来弥补。管理系统写得不好,再好的仓库也是白搭。
四大核心任务
| 任务 | 职责 |
|---|---|
| FTL 地址映射 | 把文件系统的逻辑地址翻译成 NAND 的物理地址 |
| 磨损均衡 | 让所有 Block 均匀老化,防止热门区域提前报废 |
| 坏块管理 | 标记出厂坏块、识别使用坏块、用备用块透明替换 |
| CMDQ 调度 | 多命令并行处理、智能排序,最大化 IOPS |

FTL:存储系统的”灵魂”
**FTL(Flash Translation Layer,闪存转换层)**是控制器上最核心的固件。它的唯一职责是:把文件系统发来的逻辑地址(LBA),翻译成 NAND 的实际物理地址(PBA)。
为什么需要翻译?
因为 NAND 不能原地覆写。你每次修改文件,数据其实被写到了一个全新的 Page,旧 Page 标记为 Invalid。从文件系统的视角,文件的”逻辑地址”从来没变过——但物理地址一直在变。
FTL 维护一张巨大的映射表,实时追踪每个逻辑地址当前对应的物理位置。下次再写同一个文件,物理位置又变了——FTL 更新映射表,保证数据永远能找到。
类比理解
把 FTL 想象成图书馆的管理系统。
读者(文件系统)只知道书名(逻辑地址),不知道书实际放在哪个书架哪一层(物理地址)。管理员(FTL)手里有一本目录,记录每本书的实时位置。书被借走还回来,可能放到完全不同的架子上——读者不需要知道,管理员负责更新目录。

三种映射方式
| 方式 | 粒度 | 映射表大小 | 性能 | 适用场景 |
|---|---|---|---|---|
| 页映射 | 每 Page | 极大(1TB SSD ≈ 1GB DRAM) | 最优 | 高端 UFS / SSD |
| 块映射 | 每 Block | 极小(几百 KB) | 最差 | 早期 SSD / 低端设备 |
| 混合映射 | 热数据页映射 + 冷数据块映射 | 折中 | 较好 | 目前最常见的方案 |
页映射粒度最细、灵活性最高、性能最好,但映射表本身需要大量 DRAM。块映射表很小、省成本,但粒度太粗——修改一个 Page 就要搬整个 Block,写放大严重。混合映射是目前的工程折中:频繁变动的热数据用页映射保性能,不怎么动的冷数据用块映射省 DRAM。

磨损均衡:让闪存均匀老化
上集讲过,NAND 每个 Block 都有 P/E Cycle 上限。不同 Block 的擦写频率天然不均匀——系统文件、数据库索引这些热数据所在的 Block,擦写次数远高于存放照片、视频的冷 Block。
如果不干预,热 Block 早早报废,冷 Block 几乎全新。整体寿命远低于理论值。**磨损均衡(Wear Leveling)**就是解决这个问题的。
动态磨损均衡
- 只在”正在使用中”的 Block 之间轮换
- 新数据优先写入擦写次数少的空闲 Block
- 实现简单,开销小
- 局限:冷数据占着的 Block 永远不参与轮换——它们几乎不磨损,但也贡献不了寿命
中低端设备常用此方案。
静态磨损均衡
- 连”冷数据”也会被搬走
- 定期把冷数据 Block 的内容搬到擦写次数高的 Block,把冷 Block 释放出来参与轮换
- 全盘 Block 均匀老化,寿命最大化
- 代价:额外的数据搬移产生写放大
企业级 SSD 和高端 UFS 标配。又是取舍——寿命和性能之间的权衡。
坏块管理:出厂就有坏块?
出厂坏块
NAND 制造过程天然存在缺陷。晶圆切割时,边缘的 Die 良率偏低。出厂测试时,所有坏块都会被标记,标记信息存在 NAND 的特定区域。这部分容量对用户完全不可见。典型值:出厂坏块约占总容量的 2% 以内。
使用坏块
随着 P/E Cycle 消耗,氧化层退化,电子泄漏,读写错误率逐渐上升。当错误超过了 **ECC(Error Correction Code)的纠错能力范围,控制器就判定这个 Block 坏了——从预留的备用块(Spare Block)**中拿一个出来替换。
整个过程对用户完全透明。你从来不会看到弹窗说”你的存储芯片第 328 号 Block 已损坏”,但替换一直在后台默默发生。
当备用块耗尽——设备进入只读模式,保护已有数据。这时候就该换新设备了。现代的磨损均衡算法会和坏块管理协同工作:优先把热数据放在健康度高的 Block,进一步延长整体寿命。
CMDQ:让存储学会”多线程”
没有 CMDQ 的时代
eMMC 时代,控制器一次只能处理一条命令。读完了才能写,写完了才能读——读写必须排队。大量时间浪费在”等待”上。就像单车道收费站,一辆一辆过。随机小文件多的时候,性能急剧下降。
CMDQ 怎么工作
CMDQ(Command Queue,命令队列)让控制器同时接收多条读写命令,按优先级排序、合并相邻请求、甚至可以乱序执行——读写交叉并行,读请求不用等到写完成。
就像多车道加 ETC 不停车收费。APP 冷启动、游戏场景加载——这些大量小文件并发读的场景,CMDQ 的作用最明显。
UFS 2.1 开始引入 CMDQ,UFS 3.1 之后深度优化,现在已经是旗舰 UFS 的标准配置。

同样的 NAND,不同的天花板
回到最核心的问题:为什么同样的 NAND 颗粒,不同品牌性能差距这么大?
三个层面决定差距:
算法水平。 FTL 映射效率、GC 触发策略、磨损均衡粒度、CMDQ 调度算法——这些全是各家自研的核心竞争力。好的算法 = 更低的 WA = 更少的 GC 触发 = 更流畅的日常体验。
DRAM 缓存。 有无 DRAM 差异巨大。DRAM 存映射表,纳秒级查询。没有 DRAM 就得去 NAND 里查表,延迟差 1000 倍以上。高端 UFS 配大容量 DRAM,低端方案用 HMB(Host Memory Buffer)借主机内存——性能有明显差距。
固件调优。 同一颗芯片跑不同固件,跑分可以差 30%。IO 优先级策略、温度墙和功耗管理、SLC Cache 策略、错误处理与恢复——这些”软”的调优,决定的是”硬”的实际体验。
完整闭环
控制器的四大支柱不是独立的——它们是一个闭环:
FTL 地址映射(所有 IO 的翻译枢纽)
↓ IO 请求产生
CMDQ 调度(智能排序、并行执行)
↓ 写入 NAND → 产生无效页
触发 GC(垃圾回收)
↓ 产生磨损
磨损均衡介入(均摊擦写)
↓ Block 损坏
坏块管理兜底(备用块替换)
↓ 重新回到 FTL 映射
把这条闭环记住了,控制器为什么叫”存储的大脑”就清楚了。
总结
- FTL 是逻辑到物理的翻译官,NAND 不能覆写的特性决定了地址映射是控制器的第一要务
- 磨损均衡分动态和静态两种——静态均衡寿命更长但写放大更高,又是取舍
- 坏块管理全程透明,出厂坏块 + 使用坏块都有备用块替换,用户无感知
- CMDQ 让 UFS 从”单线程”升级到”多线程”,是日常流畅体验的关键技术
NAND 颗粒可以买,DRAM 缓存可以加——但控制器的算法是各家自研的护城河。这就是”同样的颗粒、不同的体验”背后的技术真相。
系列导航
| 集数 | 标题 | 内容 |
|---|---|---|
| 第 0 集 | 存储课程总览 | 四大模块介绍 |
| 第 1 集 | 到底什么是存储? | 内存与存储的本质区别 |
| 第 2 集 | 存储类型大盘点 | HDD/SSD/eMMC/UFS 全解析 |
| 第 3 集 | 为什么存储越用越慢? | 碎片、GC、SLC 缓存 |
| 第 4 集 | 三大存储介质 | DRAM/NOR Flash/NAND Flash |
| 第 5 集 | SLC/MLC/TLC/QLC 全解析 | 速度、寿命、成本取舍 |
| 第 6 集 | 存储参数怎么看? | 顺序读写与随机读写 |
| 第 7 集 | UFS 凭什么全面取代 eMMC? | 三大核心优势 |
| 第 8 集 | 一文看懂 UFS 进化史 | 2.0 到 4.1 技术迭代 |
| 第 9 集 | UFS 内部三大核心组成 | 控制器+NAND+DRAM |
| 第 10 集 | NAND 闪存芯片深度解析 | 从浮栅管到写放大 |
| 第 11 集 | 主控芯片深度解析 | 👈 你在这里 |
下一集:DRAM 缓存——没有缓存的 UFS 会怎么样? 映射表有多大?HMB 是什么?有无 DRAM 实测差距多少?敬请期待!


