第4章:NAND Flash基础:NAND类型、Page/Block/Plane结构、读写擦除操作
好,咱们进入存储系统最核心的部分——NAND Flash。说实话,我接触过的不少工程师,对NAND的理解停留在“存数据的东西”这个层面。但你要做瑞芯微平台的存储优化,不了解NAND的脾气,后面调优根本无从下手。
这一章,咱们把NAND的底裤扒干净。从类型到结构,再到三大操作,我尽量用大白话讲透。
4.1 NAND类型:SLC/MLC/TLC/QLC,到底差在哪?
先看这张表,一目了然:
| 类型 | 每Cell存储位数 | 电压等级 | 擦写寿命(P/E Cycles) | 读取速度 | 写入速度 | 典型应用 |
|---|---|---|---|---|---|---|
| SLC | 1 bit | 2级 | 5万~10万次 | 最快 | 最快 | 工业级、军工级 |
| MLC | 2 bits | 4级 | 3000~10000次 | 较快 | 较快 | 消费级SSD、高端eMMC |
| TLC | 3 bits | 8级 | 1000~3000次 | 中等 | 较慢 | 主流eMMC、UFS、SD卡 |
| QLC | 4 bits | 16级 | 500~1000次 | 最慢 | 最慢 | 大容量数据盘 |
说白了,SLC就是一个开关,要么开要么关,简单粗暴,所以又快又耐用。MLC、TLC、QLC呢?一个Cell里塞了2个、3个、4个bit,电压等级越来越多,区分越来越难。
我个人的经验是:在瑞芯微平台上,如果你做的是车载或工控产品,尽量选SLC或MLC。TLC也不是不能用,但必须配合好的FTL算法。至于QLC……嗯,我建议你慎重。我曾经在一个监控项目里用了QLC,结果一年后坏块率飙升,差点翻车。
核心结论:
- SLC:寿命长、速度快、容量小、价格贵
- MLC:均衡型选手
- TLC:当前主流,性价比高,但需要好的磨损均衡
- QLC:容量大、寿命短,适合冷数据存储
4.2 Page/Block/Plane结构
NAND Flash的物理结构,你得记住三个层级:Page(页)→ Block(块)→ Plane(平面)。
我习惯这么理解:
- Page:读写的最小单位。就像你从书架上拿一本书,一次只能拿一本。典型大小:4KB、8KB、16KB。
- Block:擦除的最小单位。一个Block包含多个Page,比如128个或256个。你想想看,擦除操作不能只擦一个Page,必须整个Block一起擦。这是NAND的物理特性决定的。
- Plane:多个Block组成一个Plane。一个Die(芯片)通常有2个或4个Plane。Plane的作用是支持并行操作,提升性能。
举个例子,一颗常见的TLC NAND:
一个Die:
├── Plane 0(2048个Block)
│ ├── Block 0(256个Page,每个Page 16KB)
│ ├── Block 1
│ └── ...
└── Plane 1(2048个Block)
├── Block 0
└── ...
这里有个坑,我踩过:很多新手以为可以像操作硬盘一样,直接修改某个Page里的几个字节。不行!NAND的Page写入只能从“1”变成“0”,不能从“0”变回“1”。要改数据,得先把整个Block擦除(全部变回“1”),再重新写入。这就是为什么需要FTL做垃圾回收。
注意:
- 读/写单位:Page
- 擦除单位:Block
- 不能覆盖写,必须先擦后写
- 每个Block有擦写寿命上限(P/E Cycles)
4.3 读写擦除操作详解
4.3.1 读操作(Read)
读操作相对简单。你给NAND一个地址(哪个Plane、哪个Block、哪个Page),它就把那个Page的数据读出来。读的时候,NAND内部会施加一个参考电压,比较Cell的阈值电压,然后判断是0还是1。
对于TLC,一个Page需要读3次(因为3个bit),所以比SLC慢。我做过测试,在RK3588平台上,SLC的随机读延迟大约25μs,TLC要75μs左右。
4.3.2 写操作(Program)
写操作也叫Program。NAND的写入是“注入电子”的过程。给浮栅极加高压,电子穿过氧化层进入浮栅,阈值电压就变了。
写操作有几个特点:
- 只能写空页:就是已经被擦除过的Page(全为1)。
- 写入顺序:在一个Block内,必须按Page号顺序写入。不能先写Page 10,再写Page 5。这是NAND的物理限制。
- 写后读校验:写入后,NAND控制器会自动读回来校验,如果发现错误,会尝试重新写。这叫“写后读校验(Read-Back Verify)”。
避坑指南:
我曾经在一个项目里,为了追求写入速度,跳过了写后读校验。结果呢?数据写进去了,但读出来全是错的。从那以后,我再也不敢省这一步。尤其是TLC和QLC,写入干扰大,校验必须做。
4.3.3 擦除操作(Erase)
擦除操作是把整个Block的所有Cell都恢复到“1”状态。原理是给衬底加高压,把浮栅里的电子“吸”出来。
擦除操作很慢,通常需要几毫秒。而且擦除次数多了,氧化层会磨损,导致Block变成坏块。这就是为什么NAND有寿命限制。
我建议:在瑞芯微平台上做存储方案时,一定要监控每个Block的擦除次数。如果某个Block擦得特别多,赶紧做磨损均衡,把数据挪到擦得少的Block上去。
4.4 实际操作中的注意事项
好了,理论讲完了,咱们聊聊实际干活时要注意什么。
- 坏块管理:NAND出厂就有坏块,而且使用过程中还会产生新坏块。必须用坏块表(BBT)来管理。我习惯在系统初始化时扫描一遍,把坏块标记出来。
- ECC纠错:NAND的原始误码率(RBER)不低,尤其是TLC和QLC。必须用ECC(BCH或LDPC)来纠错。瑞芯微的NAND控制器通常内置了硬件ECC,记得使能。
- 读写干扰:读一个Page,可能会轻微干扰相邻Page的数据。写一个Page,干扰更大。所以,不要频繁读同一个Block的同一个Page,也不要连续写相邻Page。
- 数据保持:NAND里的电子会慢慢漏掉,时间长了数据会丢失。温度越高,漏得越快。工业级产品建议定期刷新(Refresh)。
总结一下:
NAND Flash不是硬盘,它有自己的一套脾气。SLC/MLC/TLC/QLC的选择,决定了你的产品寿命和性能。Page/Block/Plane的结构,决定了你的读写策略。而读写擦除操作,是FTL算法的基础。
下一章,咱们会深入FTL(Flash Translation Layer),看看怎么把这些底层操作封装成好用的文件系统接口。到时候,你会更理解为什么NAND需要这么复杂的软件栈。
嗯,今天就到这儿。有问题随时找我。