SSD固件技术

写完成响应之后:企业级 SSD 掉电保护的持久化语义与上电重建

2026-07-01PLP / 掉电保护 / 持久化语义

掉电保护的核心问题不是硬件参数,而是语义边界:盘对主机承诺了什么,映射与数据以什么顺序变成持久状态,上电后又如何判定哪些写入算数。本文按持久化承诺、提交顺序、上电重建、主机侧配合与不变量验证五条线索,拆解 J750/J770 上 PLP 的设计思路。

“写完成”是一份承诺,不是一次搬运

主机收到写完成响应的那一刻,数据未必已经躺在 NAND 上。企业级 SSD 之所以能在带着写缓存的前提下仍然对外承诺持久性,靠的就是掉电保护:供电一旦中断,盘必须在自身有限的保持窗口内,把已经确认过的内容变成断电也不会丢失的状态。所以 PLP 的第一个问题不是电路参数,而是语义——盘究竟向主机承诺了什么,这份承诺又在什么边界上成立。J750/J770 目前处于产品定义/EVT 阶段,这条语义边界是固件设计中最先被定死的部分,之后的缓存策略、提交流程与恢复流程都要围着它展开。

顺序与原子性比“刷得快”更关键

掉电刷写不是把缓冲区一股脑倒进 NAND 就算完成。用户数据与描述它落在何处的映射关系,必须按可判定的顺序变成持久状态:映射先于数据生效,上电后就会指向一段并未写成的内容,这是最糟的结果;数据先落、映射未生效,则等价于这次写入没有发生,反而是安全的。因此固件把映射更新组织成可提交的批次,每个批次要么完整生效、要么整体作废,中间状态不允许被上电流程当作有效结果采纳。在多命名空间场景下,这条规则还必须按命名空间各自成立,一个命名空间的未决写入不能影响另一个命名空间的一致性判定。

上电重建:先划定边界,再谈数据

重新上电后,固件不做全盘扫描,而是从最后一个有效的元数据检查点开始向前重放顺序日志,逐条校验序号与校验值,遇到断链就在断点处截断,截断点之外的内容一律按未发生处理。已经开始但未完成编程的页按可疑对待,不进入有效数据集合,其映射关系回退到上一版本。这套做法的意义在于把“不确定”明确归到未完成一侧,而不是把可能受损的内容当成有效数据交给主机;配合端到端保护与 T10 DIF/DIX 的保护字段,上电后的首次读取还能再验证一次地址与内容是否对得上。

主机侧的开关同样决定结果

盘的承诺只有在主机按同一套约定使用时才成立。NVMe 的写缓存使能位、Flush 命令与 FUA 标志决定了哪些写入被要求立即持久化;如果上层文件系统或数据库自行放宽了刷盘约束,掉电后丢掉的是它自己放弃的那一部分,与盘的 PLP 无关。反过来,盘也需要把自身状态暴露出去:通过 Telemetry 与带外的 NVMe-MI,运维侧在带内已经不响应时仍可读到告警与健康信息,从而在故障扩大前处置。

验证要证明的是不变量

掉电验证真正要回答的不是“断电之后还能不能上电”,而是几条不变量是否始终成立:已确认的写入必须可读且内容正确,未确认的写入允许丢失但不得出现半截结果,映射与数据不得互相矛盾。断电还必须落在固件的各种内部状态上——垃圾回收搬移中、映射提交中、Trim 处理中——否则再多次数也只是重复命中同一处。自研 JH-ZS101 智能测试设备支持远程网络开关机与分区温控,把上下电变成可编程动作,让这类事件能在无人值守时段持续累积;断言则写在主机侧,用写入记录与读回内容逐条比对,在内部工程平台 JH-E4U-C 上作为回归项长期保留。

关键词
PLP掉电保护持久化语义写缓存Flush与FUA日志重放多命名空间J750J770军航科工