第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 实际操作中的注意事项

好了,理论讲完了,咱们聊聊实际干活时要注意什么。

  1. 坏块管理:NAND出厂就有坏块,而且使用过程中还会产生新坏块。必须用坏块表(BBT)来管理。我习惯在系统初始化时扫描一遍,把坏块标记出来。
  2. ECC纠错:NAND的原始误码率(RBER)不低,尤其是TLC和QLC。必须用ECC(BCH或LDPC)来纠错。瑞芯微的NAND控制器通常内置了硬件ECC,记得使能。
  3. 读写干扰:读一个Page,可能会轻微干扰相邻Page的数据。写一个Page,干扰更大。所以,不要频繁读同一个Block的同一个Page,也不要连续写相邻Page。
  4. 数据保持:NAND里的电子会慢慢漏掉,时间长了数据会丢失。温度越高,漏得越快。工业级产品建议定期刷新(Refresh)。

总结一下

NAND Flash不是硬盘,它有自己的一套脾气。SLC/MLC/TLC/QLC的选择,决定了你的产品寿命和性能。Page/Block/Plane的结构,决定了你的读写策略。而读写擦除操作,是FTL算法的基础。

下一章,咱们会深入FTL(Flash Translation Layer),看看怎么把这些底层操作封装成好用的文件系统接口。到时候,你会更理解为什么NAND需要这么复杂的软件栈。

嗯,今天就到这儿。有问题随时找我。