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操作,本质上是一个模拟过程,而不是简单的数字开关:

  1. 给cell一个program pulse
  2. 往浮栅里注入一点电子
  3. 立即verify,检查阈值电压是否达到目标区间
  4. 没到,就继续加下一次pulse
  5. 直到命中目标为止

以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
可以对单个cell逐步加电子,Vth可以一点点升高
Erase
不是对单个cell做精细减电子,而是对整个block统一清除

因此:

  • cell一旦写过,就不能在原地“改回去”
  • 想改数据,只能找一个新的位置重新写
  • 原来的旧数据,等后面集中搬迁、集中擦除

——这就是NAND世界里的“不能覆盖写”。


08 也正因为如此,FTL才必须存在GC

一旦NAND不能覆盖写,整个SSD的写入逻辑就彻底变了。

机械硬盘:逻辑地址100对应物理位置A,改写的时候,还是写回A。

但在SSD里:不行。因为物理位置A一旦写过,就不能直接改了。

所以当逻辑地址100要更新时,控制器只能:

  1. 找一个新的、还没用过的位置B
  2. 把新数据写到B
  3. 再把逻辑地址100映射到B
  4. 原来的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.