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(芯片):一颗独立的NAND芯片,有独立的CE片选、I/O引脚。一个封装里可以堆叠多个Die。
- Plane:Die内部的并行单元,通常一个Die有2个或4个Plane。Plane之间可以并行操作,提升性能。
- Block(块):擦除的最小单位。注意,只能整块擦除,不能单独擦除某个Page。一个Block通常包含64~256个Page。
- Page(页):读写的最小单位。典型大小是4KB、8KB或16KB。每个Page后面跟着一个OOB(Out-Of-Band)区域,用来存ECC校验码、坏块标记等元数据。
核心规则:
- 读/写 → 以Page为单位
- 擦除 → 以Block为单位
- 写之前必须先擦除(写前擦除)
- 不能覆盖写,只能擦除后重写
我记得刚入行时,有个同事在驱动里直接往一个已写入的Page上再次写数据,结果数据全乱了。这就是没搞懂“写前擦除”的规则。
1.4 坏块管理为什么重要
NAND Flash出厂时就可能有坏块,使用过程中还会产生新的坏块。这是工艺决定的,没办法避免。
我建议你在做系统设计时,从一开始就把坏块管理考虑进去:
- 出厂坏块:厂商会在每个Block的第一个Page的OOB区域标记坏块信息
- 使用中坏块:通过ECC纠错失败、擦除超时、编程失败来检测
- 坏块表:用链表或位图维护,运行时动态更新
避坑指南:我曾经在一个数据采集器项目里,没有做坏块跳过机制,结果写到坏块上,整批数据全丢了。后来加了一层坏块映射表,才彻底解决。记住:永远不要假设NAND是完美的。
好了,这一节的内容就到这里。下一节我们会深入ECC纠错算法,看看怎么用硬件和软件手段把数据从错误中救回来。
公众号:蓝海资料掘金营,微信deep3321