2、NAND Flash基础:存储单元结构、页/块/平面的概念、SLC/MLC/TLC/QLC的区别与特性
NAND Flash 作为嵌入式系统中最重要的非易失性存储介质,其内部结构和工作原理直接决定了驱动软件的设计方式。要编写出高效、可靠的 NAND Flash 驱动,首先必须深入理解存储单元的物理特性、地址组织层级以及不同位密度(SLC/MLC/TLC/QLC)带来的行为差异。本章将从存储单元的基础电荷捕获原理出发,逐步剖析页(Page)、块(Block)、平面(Plane)的逻辑与物理映射关系,并系统对比四种主流位密度技术的特性,为后续的坏块管理、ECC 校验和磨损均衡策略奠定坚实的理论基础。
上图从三个维度概括了 NAND Flash 的核心知识框架:左侧展示了存储单元(浮栅晶体管)的物理结构,中间展示了地址组织的三级层级(Plane→Block→Page),右侧则对比了 SLC 至 QLC 的阈值电压分布差异。底部表格汇总了四种位密度技术在寿命、延迟、ECC 需求和成本上的关键差异。接下来,我们将逐一深入剖析这些概念。
2.1 存储单元结构:浮栅晶体管与电荷捕获
核心原理:NAND Flash 的基本存储单元是一个浮栅晶体管(Floating Gate Transistor),它与标准 MOSFET 的关键区别在于栅极结构中多了一层由多晶硅(Polysilicon)制成的浮栅(Floating Gate),该浮栅被高质量的氧化层(隧穿氧化层)完全包裹,与外界电学隔离。当向控制栅(Control Gate)施加编程电压(Vpgm,通常为 15-20V)时,沟道中的电子通过量子隧穿效应穿过隧穿氧化层注入浮栅,使浮栅带负电。浮栅中电荷的多少直接改变了晶体管的阈值电压(Vth),读取时通过检测 Vth 的高低即可判断存储的数据是“0”还是“1”。擦除操作则是在衬底施加高压,将浮栅中的电子拉回沟道,使 Vth 恢复到初始状态(逻辑“1”)。
判断方法:在驱动层面,我们不需要直接操作晶体管,但必须理解以下关键参数对驱动设计的影响:
- 编程粒度:编程操作以页(Page)为单位,且只能将“1”写为“0”(即只能向浮栅注入电子),不能反向操作。因此,修改数据时必须先擦除整个块(Block),将块内所有页恢复为“1”状态。
- 读干扰(Read Disturb):对某个页进行读取时,同一块内其他未选中的字线(Word Line)会承受中等电压,长时间累积会导致这些页的浮栅电荷流失或增加,造成数据翻转。驱动需通过定期扫描和刷新(Data Refresh)来应对。
- 编程干扰(Program Disturb):对某个页编程时,相邻字线和位线会受到耦合电压影响,可能导致邻近页的 Vth 偏移。这要求驱动在写入时遵循严格的顺序(如从低位页到高位页)。
2.2 页、块、平面的概念与地址映射
核心原理:NAND Flash 的存储空间按物理结构划分为三个层级:平面(Plane)是芯片内部并行操作的最小独立单元,通常一个芯片包含 1 个或 2 个 Plane(部分大容量芯片有 4 个);每个 Plane 包含若干块(Block),块是擦除操作的最小单位;每个块又由若干页(Page)组成,页是读写操作的最小单位。一个典型的 4Gb SLC NAND 芯片可能包含 2 个 Plane,每个 Plane 有 2048 个块,每个块有 64 个页,每页大小为 2048B + 64B OOB(Out-Of-Band,带外数据区,用于存放 ECC 校验码、坏块标记和逻辑地址映射信息)。
操作流程与地址映射:驱动软件在发起读写操作时,需要将逻辑地址(LBA)转换为物理地址(Die, Plane, Block, Page, Column)。转换流程如下:
- Die 选择:通过片选信号(CE#)选择目标芯片。
- Plane 选择:通过地址线的高位地址位选择目标 Plane,支持多 Plane 并行操作(如 Multi-Plane Read/Program)。
- Block 寻址:块地址决定擦除操作的目标范围。
- Page 寻址:页地址决定读写操作的具体行(Row)。
- Column 寻址:列地址决定页内偏移,用于随机读写(Partial Read/Program)。
案例拆解:假设某 2-Plane 芯片,每个 Plane 有 1024 个块,每块 64 页,页大小 2KB。当驱动收到一个写请求,逻辑地址为 LBA=1000 时,需要经过 FTL(Flash Translation Layer)映射到物理地址。若映射结果为 Plane 0、Block 5、Page 10,则驱动需发送以下命令序列:
// 以标准 ONFI 命令为例
// 1. 发送页编程命令
CMD 0x80 (Page Program)
// 2. 发送 5 个地址周期(Column 2B + Row 3B)
ADDR [Column Low] [Column High] [Row Low] [Row Mid] [Row High]
// 3. 发送数据(2KB 主数据 + 64B OOB)
DATA [2048B Main] [64B Spare]
// 4. 发送确认命令
CMD 0x10 (Program Execute)
// 5. 等待 tPROG 时间后读取状态寄存器
STATUS (检查 bit6 是否为 1,表示编程完成)
常见误区:初学者常混淆“页”和“扇区”的概念。在 NAND 中,页是物理读写单位,而扇区(通常 512B)是文件系统的最小逻辑单位。一个页通常包含 4 个扇区(2KB 页)或 8 个扇区(4KB 页)。驱动必须处理这种粒度不匹配,通常通过页内缓存(Page Cache)来聚合小写入。
2.3 SLC/MLC/TLC/QLC 的区别与特性
核心原理:四种位密度技术的本质区别在于每个存储单元能够存储的比特位数,这直接决定了阈值电压(Vth)的分布区间数量。SLC(Single-Level Cell)每个单元存储 1 bit,仅有 2 种 Vth 状态(0 和 1);MLC(Multi-Level Cell)存储 2 bit,有 4 种 Vth 状态;TLC(Triple-Level Cell)存储 3 bit,有 8 种状态;QLC(Quad-Level Cell)存储 4 bit,有 16 种状态。状态越多,相邻 Vth 窗口越窄,对电荷控制的精度要求越高,抗干扰能力越差。
对比分析:下表从驱动开发最关心的维度进行详细对比:
| 特性参数 | SLC | MLC | TLC | QLC |
|---|---|---|---|---|
| 每单元位数 | 1 bit | 2 bit | 3 bit | 4 bit |
| Vth 状态数 | 2 | 4 | 8 | 16 |
| 典型擦写次数 (P/E) | 50,000 - 100,000 | 5,000 - 10,000 | 1,000 - 3,000 | 500 - 1,000 |
| 页编程时间 (tPROG) | 200 - 300 μs | 600 - 900 μs | 1.2 - 2.0 ms | 2.5 - 4.0 ms |
| 页读取时间 (tR) | 20 - 30 μs | 40 - 60 μs | 70 - 100 μs | 100 - 150 μs |
| 块擦除时间 (tBERS) | 1.5 - 2 ms | 2 - 3 ms | 3 - 5 ms | 5 - 8 ms |
| ECC 纠错能力需求 | 1 - 4 bit / 512B | 8 - 16 bit / 512B | 24 - 40 bit / 512B | 60 - 100 bit / 512B |
| 典型应用 | 工业控制、军工、企业级启动盘 | 消费级 SSD、U 盘 | 大容量 SSD、移动设备 | 归档存储、读取密集型应用 |
实战场景:在嵌入式 Linux 系统中,如果使用 TLC NAND 作为根文件系统,驱动必须启用强大的 LDPC(低密度奇偶校验)或 BCH ECC 引擎。例如,某 4KB 页的 TLC 芯片,要求每 1KB 数据支持 40-bit ECC。若驱动仅配置了 24-bit ECC,在芯片寿命后期(P/E 接近上限时),数据错误率会急剧上升,导致文件系统损坏。正确的做法是:
- 在驱动初始化时读取芯片的“ECC 能力”参数(通过 ONFI 参数页或厂商私有命令)。
- 根据参数配置硬件 ECC 引擎,确保纠错能力不低于芯片要求。
- 在驱动中实现“读取-校验-刷新”机制:当读取时发现 ECC 校正的比特数超过阈值(如最大能力的 70%),主动将该页数据复制到新块并擦除原块。
2.4 位密度对驱动设计的综合影响
核心原理:位密度的提升虽然降低了单位存储成本,但给驱动软件带来了三重挑战:可靠性(需要更强的 ECC)、性能(编程/读取延迟显著增加)、寿命(P/E 次数大幅下降)。驱动设计必须在三者之间做出权衡。
判断方法:在选择 NAND 芯片时,驱动工程师应优先评估以下指标:
- 系统写入放大系数(WAF):对于 TLC/QLC,由于无法原地更新数据,垃圾回收(GC)操作频繁,WAF 可能高达 3-5 倍。这意味着实际写入量是逻辑写入量的数倍,进一步加速磨损。
- 编程模式:TLC/QLC 通常采用“Shadow Programming”或“Foggy-Fine”两阶段编程,驱动必须支持对应的命令序列(如 0x80-0x11-0x80-0x10),否则无法正确写入。
- 多 Plane 操作:高密度芯片普遍支持 Multi-Plane 读写,驱动应充分利用该特性,将不同 Plane 的页操作合并,以抵消部分延迟增加的影响。
案例拆解:某视频监控设备使用 8GB TLC NAND 存储录像数据。设备持续写入 4K 码流,平均写入速度 4MB/s。若驱动未优化 GC 策略,WAF 达到 4,则实际写入速度为 16MB/s。以 TLC 的 3000 次 P/E 计算,8GB 芯片的寿命为:
总可写数据量 = 8GB × 3000 P/E = 24,000 GB
实际寿命 = 24,000 GB ÷ (16 MB/s × 86400 s/天) ≈ 17.4 天
这显然不可接受。优化方案包括:
- 启用“写入聚合”功能,将多个小写入合并为整页写入,降低 WAF 至 1.5。
- 采用“静态磨损均衡”,将不常修改的冷数据迁移到高 P/E 块,延长整体寿命。
- 调整 GC 触发阈值,在系统空闲时提前进行后台回收,避免写入高峰期的性能抖动。
优化后,实际寿命提升至约 46 天,若配合动态电源管理和降低码率,可满足 3 个月以上的连续运行需求。