1. NAND Flash基础:存储单元结构、SLC/MLC/TLC/QLC区别、Page/Block/Die层级关系

大家好,我是老张。做嵌入式存储这行十几年了,今天咱们聊聊NAND Flash最基础的东西。说实话,很多工程师上来就调驱动、写FTL,结果坏块管理一塌糊涂——根子就在基础没打牢。

这一节,我会把存储单元、颗粒类型、层级关系掰开揉碎了讲。你想想看,连一个Cell怎么存数据的都不清楚,怎么去理解ECC纠错?

1.1 存储单元结构:浮栅晶体管

NAND Flash的核心,是一个叫浮栅晶体管的东西。说白了,它就是个特殊的MOS管,中间多了一层“浮栅”,用来存电荷。

关键点:浮栅被二氧化硅绝缘层包裹,电荷一旦注入,断电也不会丢失。这就是非易失性的本质。

怎么存数据呢?往浮栅里注入电子,晶体管的阈值电压就会升高。读数据时,给控制栅加一个参考电压,看管子通不通——通了就是“1”,不通就是“0”。

嗯,这里要注意:擦除操作是把浮栅里的电子拉出来,让所有Cell回到“1”状态。写入(编程)则是选择性注入电子,把某些Cell变成“0”。

我的经验:我在一个SSD项目里遇到过,擦除次数多了,绝缘层会老化,电子漏出来,数据就慢慢丢了。这就是为什么NAND有P/E寿命限制。

1.2 SLC / MLC / TLC / QLC 的区别

一个Cell能存几个bit,决定了颗粒的类型。我习惯用“电压窗口”来理解这件事。

类型 每Cell位数 电压等级 典型P/E次数 读取速度 典型应用
SLC 1 2级 5万~10万 最快 工业级、军工级
MLC 2 4级 3000~10000 较快 消费级SSD(早期)
TLC 3 8级 1000~3000 中等 主流SSD、U盘
QLC 4 16级 500~1000 最慢 大容量存储

为什么会这样?你想想看,SLC只有0和1两种状态,电压窗口宽得很,电子跑掉一点也没事。到了QLC,16个电压等级挤在一个小范围内,稍微有点噪声就判错了。

避坑指南:我曾经在一个工业相机项目里,图便宜用了TLC颗粒。结果高温环境下,数据读出来全是ECC报错。后来老老实实换回SLC,问题才解决。记住:寿命和可靠性,跟每Cell位数成反比

我个人习惯,做嵌入式系统选型时:

  • 需要高可靠性、频繁擦写 → SLC
  • 成本敏感、容量优先 → TLC或QLC
  • 中间地带 → MLC(现在越来越少见了)

1.3 Page / Block / Die 层级关系

NAND Flash的物理结构,是分层的。我画了一张图,帮你理清关系。

Die(芯片) Plane 0 Plane 1 Block 0 Block 1 Block 2 Block 3 ... ... Block(包含多个Page) Page 0(4KB + 128B OOB) Page 1 Page 2 ... Die Plane Block Page

从上到下,我习惯这么记:

  1. Die(芯片):一颗独立的NAND芯片,有独立的CE片选、I/O引脚。一个封装里可以堆叠多个Die。
  2. Plane:Die内部的并行单元,通常一个Die有2个或4个Plane。Plane之间可以并行操作,提升性能。
  3. Block(块):擦除的最小单位。注意,只能整块擦除,不能单独擦除某个Page。一个Block通常包含64~256个Page。
  4. Page(页):读写的最小单位。典型大小是4KB、8KB或16KB。每个Page后面跟着一个OOB(Out-Of-Band)区域,用来存ECC校验码、坏块标记等元数据。

核心规则:

  • 读/写 → 以Page为单位
  • 擦除 → 以Block为单位
  • 写之前必须先擦除(写前擦除)
  • 不能覆盖写,只能擦除后重写

我记得刚入行时,有个同事在驱动里直接往一个已写入的Page上再次写数据,结果数据全乱了。这就是没搞懂“写前擦除”的规则。

1.4 坏块管理为什么重要

NAND Flash出厂时就可能有坏块,使用过程中还会产生新的坏块。这是工艺决定的,没办法避免。

我建议你在做系统设计时,从一开始就把坏块管理考虑进去:

  • 出厂坏块:厂商会在每个Block的第一个Page的OOB区域标记坏块信息
  • 使用中坏块:通过ECC纠错失败、擦除超时、编程失败来检测
  • 坏块表:用链表或位图维护,运行时动态更新

避坑指南:我曾经在一个数据采集器项目里,没有做坏块跳过机制,结果写到坏块上,整批数据全丢了。后来加了一层坏块映射表,才彻底解决。记住:永远不要假设NAND是完美的

好了,这一节的内容就到这里。下一节我们会深入ECC纠错算法,看看怎么用硬件和软件手段把数据从错误中救回来。


公众号:蓝海资料掘金营,微信deep3321