3. NAND Flash 基础:页/块/平面的概念、MLC/TLC/QLC区别、坏块管理、ECC校验原理
好,咱们今天聊聊NAND Flash。说实话,做嵌入式存储绕不开它。你想想看,从你的手机到固态硬盘,再到各种嵌入式设备,NAND Flash几乎无处不在。我刚开始接触它的时候,也觉得这东西挺玄乎的,但摸透了它的脾气,其实也就那么回事。
3.1 页、块、平面:NAND的三层结构
NAND Flash的存储结构,说白了就是“套娃”。它不像咱们电脑里的内存,可以随便按字节寻址。它有自己的规矩。
- 页(Page):这是读写操作的最小单位。一般一个页是4KB、8KB或者16KB。我习惯把它想象成一张纸,你要写东西,就得整张纸写,不能只写半个字。
- 块(Block):这是擦除操作的最小单位。一个块通常包含64个或128个页。你可以把块想象成一本笔记本,你要擦掉内容,只能整本擦,不能只擦某一页。
- 平面(Plane):这是并行操作的单位。一个芯片里通常有2个或4个平面。每个平面有自己的缓存寄存器,可以独立进行读写操作。
关键点:NAND Flash不能覆盖写。你要修改一个页里的数据,得先把整个块擦除,再把数据写回去。这就是所谓的“先擦后写”机制。我在项目中遇到过新手直接往同一个页反复写,结果数据全乱了,就是因为没搞懂这个机制。
我的小技巧:设计文件系统时,尽量让数据写入顺序和擦除操作对齐。比如,把频繁修改的小文件放在同一个块里,这样擦除时不会影响其他数据。
3.2 MLC、TLC、QLC:存储密度的进化
NAND Flash按每个存储单元能存多少位数据来分类。这个分类直接决定了成本、性能和寿命。
| 类型 | 每单元位数 | 电压等级 | 典型寿命(P/E次数) | 典型应用 |
|---|---|---|---|---|
| SLC | 1 | 2 | 10万次 | 工业级、军工级 |
| MLC | 2 | 4 | 1万次 | 消费级SSD |
| TLC | 3 | 8 | 3000次 | 主流SSD、U盘 |
| QLC | 4 | 16 | 1000次 | 大容量存储 |
为什么会这样?说白了,电压等级越多,区分不同状态就越困难。MLC有4种电压状态,TLC有8种,QLC有16种。你想想看,电压窗口就那么窄,要精确区分16种状态,对工艺和控制器都是巨大挑战。
我记得有一次做项目,客户非要上QLC,说成本低。我劝了半天没用,结果产品用了半年就开始大量坏块。嗯,从那以后,我对QLC的寿命问题特别敏感。
避坑指南:我曾经在选型时忽略了一个细节——TLC和QLC的读取干扰问题比MLC严重得多。如果你做的是频繁读取的设备(比如监控录像机),建议优先考虑MLC或者带强纠错能力的TLC。
3.3 坏块管理:NAND的“天生缺陷”
NAND Flash出厂时就有坏块,而且随着使用还会产生新的坏块。这不是质量问题,是工艺决定的。你想想看,几亿个存储单元,有几个坏的太正常了。
坏块分两种:
- 出厂坏块:芯片出厂时就标记好的,一般在块的第1个页的备用区(Spare Area)有标记。
- 使用坏块:随着擦写次数增加,某些块会失效。这就是为什么NAND有寿命限制。
管理坏块,我习惯用两种策略:
- 跳过坏块:在逻辑地址映射时,直接跳过坏块,把数据写到好块上。
- 坏块替换:用预留的好块替换坏块。一般会预留总容量的2%-5%作为替换池。
实战经验:我在做嵌入式文件系统时,会在初始化阶段扫描所有块,建立一张坏块表。每次写入前先查表,避免往坏块里写数据。这个表要保存在NAND的好块里,不然掉电就丢了。
3.4 ECC校验原理:给数据上保险
NAND Flash的存储单元会随着时间、温度、读写次数增加而出现位翻转。一个比特从1变成0,或者从0变成1,这就是所谓的“软错误”。ECC(纠错码)就是用来检测和纠正这些错误的。
常见的ECC算法有:
- 汉明码(Hamming Code):能纠正1位错误,检测2位错误。适合SLC。
- BCH码:能纠正多位错误。MLC和TLC常用。
- LDPC码:纠错能力更强,但计算量大。QLC和高端SSD必备。
ECC的原理其实不复杂。以汉明码为例:
// 假设数据是4位:d1 d2 d3 d4
// 插入3个校验位:p1 p2 p3
// 编码后的数据:p1 p2 d1 p3 d2 d3 d4
// 校验位计算:
p1 = d1 XOR d2 XOR d4
p2 = d1 XOR d3 XOR d4
p3 = d2 XOR d3 XOR d4
// 接收时重新计算校验位,对比就知道哪一位错了
你可能会问,为什么需要这么复杂的纠错?我举个例子:TLC的一个页有8KB数据,如果每512字节需要16字节的ECC,那一个页的ECC开销就是256字节。这还不算多,但QLC可能需要每512字节用56字节的ECC,开销就大了。
我的建议:选ECC算法时,别只看纠错能力。要考虑控制器的计算能力。我在一个低功耗项目里用过BCH,结果CPU算不过来,读写速度慢得离谱。后来换了硬件ECC引擎,问题才解决。
注意:ECC不是万能的。如果坏块太多,或者数据错误超过了ECC的纠错能力,那就只能报错了。所以,定期做坏块扫描和磨损均衡,比单纯依赖ECC更靠谱。
好了,这一章的内容就到这。NAND Flash的基础概念其实不难,但细节很多。你只要记住:页是读写单位,块是擦除单位,平面是并行单位;MLC/TLC/QLC是密度和寿命的权衡;坏块要主动管理;ECC是最后一道防线。把这些搞懂了,后面讲文件系统适配就轻松多了。