2、NAND Flash基础:存储单元结构、页/块/平面的概念、SLC/MLC/TLC/QLC的区别与特性

NAND Flash 作为嵌入式系统中最重要的非易失性存储介质,其内部结构和工作原理直接决定了驱动软件的设计方式。要编写出高效、可靠的 NAND Flash 驱动,首先必须深入理解存储单元的物理特性、地址组织层级以及不同位密度(SLC/MLC/TLC/QLC)带来的行为差异。本章将从存储单元的基础电荷捕获原理出发,逐步剖析页(Page)、块(Block)、平面(Plane)的逻辑与物理映射关系,并系统对比四种主流位密度技术的特性,为后续的坏块管理、ECC 校验和磨损均衡策略奠定坚实的理论基础。

NAND Flash 存储层级与位密度对比 存储单元结构 浮栅晶体管 (Floating Gate) 控制栅 (Control Gate) 氧化层 浮栅 (存储电荷) 源极 漏极 隧穿氧化层 地址组织层级 Plane (平面) Block (块) — 擦除单位 Page (页) — 读写单位 Sector (扇区) 512B + OOB 位密度对比 阈值电压分布 (Vth) SLC 1 bit/单元 MLC 2 bit/单元 TLC 3 bit QLC 4 bit 关键特性对比 特性 SLC MLC TLC QLC 擦写次数 ~100K ~10K ~3-5K ~1K 读延迟 ~25μs ~50μs ~75μs ~120μs 写延迟 ~200μs ~700μs ~1.5ms ~3ms ECC需求 1-4 bit 8-16 bit 24-40 bit 60+ bit 相对成本 高 中 低 最低 应用场景 工业/军工 消费级SSD 大容量存储 归档/读取密集 注:以上数据为典型值,具体以厂商数据手册为准

上图从三个维度概括了 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 偏移。这要求驱动在写入时遵循严格的顺序(如从低位页到高位页)。
经验提醒:在驱动初始化阶段,务必从芯片 ID 中解析出厂商、工艺代次和位密度信息。不同代次的芯片,其编程电压、时序参数和干扰特性差异显著,直接套用通用时序可能导致数据写入失败或寿命急剧缩短。

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)。转换流程如下:

  1. Die 选择:通过片选信号(CE#)选择目标芯片。
  2. Plane 选择:通过地址线的高位地址位选择目标 Plane,支持多 Plane 并行操作(如 Multi-Plane Read/Program)。
  3. Block 寻址:块地址决定擦除操作的目标范围。
  4. Page 寻址:页地址决定读写操作的具体行(Row)。
  5. 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 接近上限时),数据错误率会急剧上升,导致文件系统损坏。正确的做法是:

  1. 在驱动初始化时读取芯片的“ECC 能力”参数(通过 ONFI 参数页或厂商私有命令)。
  2. 根据参数配置硬件 ECC 引擎,确保纠错能力不低于芯片要求。
  3. 在驱动中实现“读取-校验-刷新”机制:当读取时发现 ECC 校正的比特数超过阈值(如最大能力的 70%),主动将该页数据复制到新块并擦除原块。
风险提示:QLC NAND 的 P/E 循环次数极低(约 1000 次),且对温度敏感。在无温控的工业环境中,QLC 的数据保持时间(Data Retention)可能从标称的 1 年缩短至数月。驱动必须实现更激进的磨损均衡(Wear Leveling)和定期巡检(Patrol Scrub),否则存在数据静默损坏的风险。

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 天

这显然不可接受。优化方案包括:

  1. 启用“写入聚合”功能,将多个小写入合并为整页写入,降低 WAF 至 1.5。
  2. 采用“静态磨损均衡”,将不常修改的冷数据迁移到高 P/E 块,延长整体寿命。
  3. 调整 GC 触发阈值,在系统空闲时提前进行后台回收,避免写入高峰期的性能抖动。

优化后,实际寿命提升至约 46 天,若配合动态电源管理和降低码率,可满足 3 个月以上的连续运行需求。

总结复盘:NAND Flash 驱动开发的核心是对物理特性的深刻理解与软件策略的精准匹配。存储单元结构决定了“先擦后写”和“页读写”的基本规则;页/块/平面的层级关系定义了地址映射和并行策略;而 SLC 至 QLC 的位密度演进则迫使驱动在 ECC 强度、GC 策略、磨损均衡和数据刷新机制上不断升级。在实际项目中,建议驱动工程师在开发初期就与芯片原厂 FAE 确认目标芯片的完整参数手册,并针对最恶劣工况(高温、高写入负载)进行可靠性测试,避免因参数理解偏差导致产品批量返修。