坏块管理(Bad Block Management)是 NAND Flash 存储中识别、记录、绕过和替换坏 block 的机制;在 eMMC 和 UFS 中,它通常由内部 闪存控制器 自动处理。
坏块不是异常设计,而是 NAND 的正常工程现实。可靠系统的关键不是“没有坏块”,而是能持续正确管理坏块。
核心问题
NAND block 可能在两个阶段变坏:
- 出厂坏块:制造后就不可靠,厂商会标记。
- 增长坏块:运行中因为擦写磨损、干扰或保持时间下降而变得不可靠。
如果系统继续往坏块写关键数据,可能出现读错误、启动失败、文件系统损坏或静默数据损坏。
核心对象
| 对象 | 含义 | 工程关注点 |
|---|---|---|
| bad block marker | 出厂坏块标记 | 常在 OOB/spare 区,裸 NAND 驱动要识别 |
| bad-block table | 坏块表 | 记录哪些 block 不再使用 |
| reserved block pool | 备用块池 | 用于替换坏块和维持容量 |
| ECC failure | 超过纠错能力的错误 | 可能触发坏块判定或数据搬迁 |
| remap | 重映射 | 把逻辑数据迁移到健康物理块 |
| grown bad block | 运行中新增坏块 | 寿命和可靠性风险信号 |
核心机制
托管式存储中的坏块处理可以简化为:
if read_error > ECC_capability or program/erase fails:
mark block as bad
allocate replacement block
move recoverable data
update mapping tableread_error > ECC_capability表示错误数量超过 ECC(错误纠正码) 可纠正范围。program/erase fails表示写入或擦除操作失败。replacement block来自控制器预留空间。update mapping table让后续逻辑地址不再落到坏块。
裸 NAND 场景下,坏块管理可能由 MTD、UBI、文件系统和驱动共同完成;eMMC 场景下,主机一般看不到物理坏块,只看到 I/O 错误、寿命指标或容量/性能变化。
工程用途
- 保证 eMMC/UFS/SSD 在 NAND 局部退化后仍能继续使用。
- 在量产测试和老化测试中筛出坏块增长异常的设备。
- 支撑启动分区、RootFS 和数据分区的长期可靠性。
- 帮助定位“同一批设备运行一段时间后启动失败”的存储根因。
边界与常见坑
- 坏块不是文件系统坏道的同义词:NAND 物理 block 和文件系统逻辑块不是同一层。
- eMMC 中坏块通常不可见:控制器隐藏了物理坏块,主机只能看到抽象后的错误或健康指标。
- ECC 可纠正不代表没有风险:纠错次数上升可能预示数据保持能力下降,需要搬迁或替换设备。
- 备用块池不是无限的:增长坏块过多后,设备可能进入只读、报错或容量异常状态。
- 裸 NAND 不能忽略出厂坏块标记:擦掉 OOB 标记或错误格式化会破坏坏块管理。