二、Nand flash硬件基础
1.1 基本存储单元与层次结构bit 厂商标 4GbitPage Size2048 bytes最小读/写单位主数据区OOB Size128 bytes存放 ECC、坏块标记、元数据Block Size128 KiB (64 pages)最小擦除单位擦写寿命~10 万次/块需坏块管理和磨损均衡地址计算方式物理地址Block 编号 × Block SizePage 编号 × Page SizeColumn 偏移 例Block0,Page0→0x0000_0000 Block1,Page0→0x0002_0000(128KiB0x20000)Block0,Page1→0x0000_0800(2KiB0x800)1.2 关键操作特性NAND Flash 的三种基本操作有严格约束是驱动设计和使用的前提操作单位方向约束读ReadPage任意无约束可随机读写ProgramPage1 → 0只能将 bit 1 写为 0不能反向写前必须擦除擦EraseBlock全部复位 0xFF以 Block 为单位整块擦除1.3 OOB 区域与坏块管理OOBOut-Of-Band是每个 Page 附带的备用字节区域用于存储元数据GD5F4GM8 OOB 布局128bytes Byte0:坏块标记Bad Block MarkerBBM 非0xFF→ 该 Block 为坏块驱动应跳过 Byte1-3:保留 Byte4-63:用户可用/文件系统元数据UBI EC/VID header 可存于此 Byte64-127:On-die ECC 校验数据由芯片硬件自动写入/校验坏块两种类型类型产生时间标记位置处理方式出厂坏块Factory Bad Block芯片出厂前Block 0 或 1 的 OOB byte 0 非 0xFF驱动扫描时跳过运行时坏块Runtime Bad Block使用过程中擦写失败后由驱动标记UBI 重映射到备用 PEB坏块扫描流程MTD 驱动初始化时spinand_init() → 扫描所有 Block 的 OOB byte 0 → 非 0xFF 的标记为坏块 → 注册到 MTD 的 bbtbad block table → UBI 挂载时读取 bbt跳过坏块 PEB工作中注意事项不要手动擦除 Block 0通常存储 U-Boot且含出厂坏块标记UBI 会自动管理坏块无需上层显式处理nanddump --oob可查看每个 Block 的 OOB 坏块标记1.4 SPI NAND vs 并行NAND对比项SPI NAND并行 NAND (Raw NAND)接口SPI / QSPI4 线8/16 bit 并行总线 CLE/ALE/CE引脚数少6-8 根多20 根内置 ECC通常有on-die ECC通常需外部 ECC 引擎驱动复杂度较低spinand 子系统较高需处理时序/ECC最高速度较低受 SPI 总线限制较高并行带宽大典型场景IoT、车载、消费类大容量、高性能存储本项目GD5F4GM8 via QSPI—SPI NAND 命令流程1.5 ECC 错误纠正码ECC 用于检测和纠正存储单元因衰老、辐射等导致的 bit 翻转bit flip。GD5F4GM8 on-die ECC 规格参数值ECC 算法BCH纠错能力8 bits per 512 bytesECC 数据位置OOB 区域由芯片硬件维护状态寄存器STATUS[5:4] → ECCS bitsECC 状态码ECCS[1:0] 00 → 无错误 ECCS[1:0] 01 → 有错误已纠正bit flip ≤ 8 ECCS[1:0] 10 → 有错误已纠正但接近阈值≥ 8 flip需关注 ECCS[1:0] 11 → 不可纠正错误UE该页数据不可信驱动处理逻辑gigadevice.c ecc_get_statusstaticintgd5fxgq4_variant2_ecc_get_status(structspinand_device*spinand,u8 status){switch(statusGD5FXGQ4_STATUS_ECC_MASK){caseGD5FXGQ4_STATUS_ECC_NO_BITFLIPS:return0;// 正常caseGD5FXGQ4_STATUS_ECC_1_7_BITFLIPS:return7;// 有翻转已纠正caseGD5FXGQ4_STATUS_ECC_8_BITFLIPS:return8;// 接近极限caseGD5FXGQ4_STATUS_ECC_UNCOR_ERROR:return-EBADMSG;// 不可纠正MTD 返回 EIO}}工作中注意ECC 接近阈值如返回 7~8不是立即故障但 UBI 会将该 PEB 标记为疑似坏块并搬迁数据系统日志出现大量mtd: corrected X bit errors说明 Flash 老化需关注1.6 Flash 可靠性与寿命工作中影响 NAND 可靠性的几个重要概念磨损均衡Wear LevelingNAND 每个 Block 有约 10 万次擦写寿命。如果某个区域被频繁写入如日志会提前损坏。UBI 通过磨损均衡算法Wear Leveling在所有可用 Block 上均匀分配写操作。UBI 维护每个 PEB 的 ECErase Count - 写操作时选择 EC 最小的空闲 PEB - 静态数据也会定期迁移static wear leveling - EC 差值超过阈值默认 4096时强制迁移写放大Write Amplification由于 NAND 必须先读-修改-写如修改一个字节需读整页→修改→擦整块→写整页实际写入量远大于逻辑写入量。UBIFS 通过日志结构化写入尽量减少写放大。数据保持Data RetentionNAND 存储电荷会随时间泄漏通常保证 1~10 年取决于温度和擦写次数高温加速衰减长期不通电设备存在数据丢失风险ECC 可以纠正少量 bit flipUBI 的 scrubbing 机制会定期重写数据Read Disturb读取一个 Page 时同一 Block 内其他 Page 的存储单元会受到轻微干扰高压影响。多次读取后可能导致 bit flip。UBI 的 scrubbing 可以检测并纠正这种问题。