NAND为什么不能覆盖写?——SSD一切复杂机制的物理根源
核心洞察:NAND不能覆盖写,不是协议规定,也不是控制器偷懒,而是浮栅晶体管的物理结构决定的。它只能被精细地“加电子”,却无法被精细地“减电子”。
01 一个反直觉的事实
很多人第一次接触NAND都会感到意外:
一个page写完之后,内部每个cell的阈值电压,并不是整整齐齐落在一个点上,而是落在一段分布里。
这个看似只是物理层的小细节,背后牵出的问题却非常大——
NAND为什么不能像机械硬盘那样覆盖写?
这个问题,几乎是理解SSD的分水岭。
如果不明白这一点,后面的很多概念都会觉得控制器在把简单问题复杂化:
- 为什么不能原地修改数据?
- 为什么要搞L2P映射?
- 为什么写入总喜欢写到新位置?
- 为什么SSD里一定会有GC?
- 为什么明明只写了4K,底层却可能搬了一大堆数据?
这些问题表面上属于FTL(闪存转换层),但再往下挖一层,你会发现根子根本不在FTL,而在NAND cell本身的物理结构。
FTL并不是“闲着没事把简单事情搞复杂”,
恰恰相反——
它是在给NAND的物理限制擦屁股。
而“不能覆盖写”,就是这个限制里最核心的一条。
02 什么叫覆盖写?
先把概念说清楚。
机械硬盘的覆盖写
- 写入以扇区为单位
- 把数据A写到0号扇区,过一会儿想改成数据B
- 控制器直接在同一个扇区位置重新写入B
形象比喻:机械硬盘像铅笔,写错了可以擦掉,然后在原来的位置重新写。
NAND的写入
- 一旦写下去,那个位置就没法像铅笔一样轻轻擦掉再重写
- 只能换个地方重新写,原来的内容想办法以后统一处理掉
形象比喻:NAND更像圆珠笔,写下去就改不了,只能换地方写。
03 为什么机械硬盘能覆盖写,而NAND不行?
关键在于,二者的“写入方式”从物理层面就不是一回事。
- 机械硬盘的写入:磁介质状态的重置和重写
- NAND的写入:往浮栅里不断累积电子的过程
NAND的Program操作,本质上是一个模拟过程,而不是简单的数字开关:
- 给cell一个program pulse
- 往浮栅里注入一点电子
- 立即verify,检查阈值电压是否达到目标区间
- 没到,就继续加下一次pulse
- 直到命中目标为止
以SLC为例的抽象模型
- Erase之后:cell显示为1(浮栅中几乎没有电子)
- Program之后:浮栅中电子逐渐增多
- 当电子数量超过某个阈值时,cell显示为0
于是你会发现:
所谓写入,本质上就是不断向浮栅里“加电子”,让阈值电压一步一步升高。
04 既然能加电子,为什么不能减电子?
很多人会自然想到:
既然Program可以把电子一点点加进去,那反过来,不就能把电子一点点减出来吗?
比如现在这个cell已经是1,想把它改回0:
- 给它一个“反向电压”
- 让浮栅里的电子跑掉一点
- verify一下
- 没降够就再来一次
看上去,这也能形成一个“逐步逼近”的过程。
如果真能这样,NAND不就也可以覆盖写了吗?
但问题就在于:这个想法在NAND上行不通。
而且不是控制器“不想这么做”,而是cell的物理结构决定了它没法这么做。
05 为什么Program可以“逐步可控”?
先回顾一下cell的基本结构:

一个典型的浮栅晶体管:
- 上面是控制栅(Control Gate)
- 中间是被绝缘层包裹起来的浮栅(Floating Gate)
- 下面是沟道/衬底(Channel/Substrate)
Program的“遥控”机制
Program时,外部通过在控制栅上施加高电压,在氧化层两端建立强电场,让电子跨过氧化层,逐步注入浮栅。
关键点:控制栅是在“隔着氧化层遥控”电子进入浮栅。
因为是“遥控”,这个过程天然具备可调性:
- 脉冲可以控制强弱
- 脉冲可以控制次数
- 每次注入的电子量有限
- 注入后可以立刻verify
于是Program就能做成一个漂亮的闭环:
加一点 → 测一下 → 再加一点 → 再测一下
——这就是ISPP能成立的根本原因。
NAND 的 Program 一般采用 ISPP(Incremental Step Pulse Programming)方式,也就是通过一连串逐步增强的编程脉冲,每次注入少量电子,再配合 verify,最终把 cell 的阈值电压逼近目标区间。
为什么Program能“收得住”?
浮栅中的电子不是白加的。
当电子不断累积时,这些负电荷本身会形成一个反向电场,抵抗后续电子继续注入:
- 一开始浮栅比较空,电子相对容易进去
- 后面浮栅里已经堆了不少负电,新电子再进去会越来越难
形象比喻:就像手机充电——
从20%充到80%很快,从90%充到100%明显变慢。
正因为这种“越写越难写”的特性,Program才不会失控地冲过头,反而能被做成一个逐步逼近目标阈值电压的过程。
也就是说,Program之所以可控,是因为cell本身就允许电子逐步注入,而且越到后面越难注入。
06 但“减电子”不是这个逻辑
如果想做“覆盖写”,本质上就是想把已经写进去的电子再一点点拿出来——
把Program的逻辑反过来用:不是加电子,而是减电子。
看起来像镜像操作,但实际上,两者在NAND中完全不是一回事。
因为在NAND里,减电子对应的并不是一个可对单个cell精细调节的反向Program过程,而更接近Erase的物理机制。
而Erase有两个致命问题,决定了它不能拿来做覆盖写。
致命问题一:Erase不是对单个cell生效,而是对整个block生效
这是NAND最根本的限制之一。
- Program可以按page写,甚至落实到page中每个cell的状态变化
- 但Erase不是按page,也不是按单个cell来做的,而是按整个block来做的
这意味着:如果只是想把某一个cell里的电子减掉一些,物理上动用的却不是“单点手术刀”,而是一把“整块一起清空”的大扫帚。
本来只是想改A这个cell,结果旁边B、C、D……一整个block里的cell,都会一起受到影响。
这显然是非常不可接受——因为一个block里装的是大量page,大量page里又是大量彼此独立的数据。这会直接影响数据有效性。
结论:Erase压根就不是为了“单点改写”而存在的。它的职责一直都是——整块清空,重新开始。
致命问题二:电子“往外跑”这件事,天生就不容易被细腻控制
即便先不谈block级生效范围,只看单个cell,问题也依然存在。
前面说过,Program的过程之所以可控,是因为电子要“挤进”浮栅,而浮栅里已有的负电还会反过来阻碍新电子进入,形成天然的缓冲效果。
可一旦想让电子“跑出来”,情况就变了:
- 浮栅里已经积累的电子本身就带着负电
- 如果外部再施加一个帮助电子逸出的反向电场,这两个效应就会叠加
- 电子流失不会像Program那样“越到后面越难”
- 反而更容易出现掉得过快、收不住、难以定点停下的问题
形象比喻:
- 加电子 = 往越来越满的仓库里继续塞货,越塞越难
- 减电子 = 打开闸门放水,一旦开大了,水会很快往外跑
这两种物理过程,本来就不是同一个可控性级别。
所以NAND的结构决定了:
- Program可以做成“逐步逼近”
- 但减电子这件事,做不成同等粒度的“逐步微调”
它能精细地往上推阈值电压,却不能精细地把阈值电压往下拉回来。
07 这就是NAND不能覆盖写的根本原因
NAND不能覆盖写,不是因为“协议规定不能”,也不是因为“控制器懒得做”,而是因为它的物理结构天然只擅长一件事:把电子逐步写进去,而不擅长另一件事:把电子从单个cell中精细、局部、可验证地一点点拿出来。
再总结得更直白一点:
| Program | |
| Erase |
因此:
- cell一旦写过,就不能在原地“改回去”
- 想改数据,只能找一个新的位置重新写
- 原来的旧数据,等后面集中搬迁、集中擦除
——这就是NAND世界里的“不能覆盖写”。
08 也正因为如此,FTL才必须存在GC
一旦NAND不能覆盖写,整个SSD的写入逻辑就彻底变了。
机械硬盘:逻辑地址100对应物理位置A,改写的时候,还是写回A。
但在SSD里:不行。因为物理位置A一旦写过,就不能直接改了。
所以当逻辑地址100要更新时,控制器只能:
- 找一个新的、还没用过的位置B
- 把新数据写到B
- 再把逻辑地址100映射到B
- 原来的A,标记为旧数据
时间一长,这种旧数据会越来越多。
于是就需要GC(垃圾回收)去做这件事:
- 挑出还能用的有效页
- 搬到新的block
- 把整个旧block擦掉
- 释放出来重新使用
因此:
GC不是SSD的“优化功能”,而是NAND不能覆盖写之后,被物理特性逼出来的一套生存机制。
09 一句话总结
NAND之所以不能覆盖写,不是因为它不会“改”,而是因为它的cell只能被精细地“加电子”,却不能被精细地“减电子”;一旦要减,就不是改单个cell,而是动整个block。
这就是NAND和机械硬盘最深的一层差别之一。
也正是这个差别,最终催生了:
- Out-of-place write(异地写入)
- L2P映射
- 垃圾回收(GC)
- 写放大(WA)
SSD后面很多看似复杂的机制,往根上追,几乎都能追到这里。
参考资料 [1] Rino Micheloni, Luca Crippa, Alessia Marelli, Inside NAND Flash Memories, Springer, 2010.
Alipay
Wechat