管理命令集与操作 - 第178页
我们现在深入分析 NVM Express® Base Specification Revision 2.0b 中关于 Firmware Image Download 命令的执行细节,特别聚焦于:
- 多片(chunked)固件镜像的构造方式
Dword Offset和Number of Dwords的使用方法- 固件切片的顺序要求
- 与 Boot Partition 更新的区别
- 命令字段结构(Data Pointer、Dword 10 & 11)
✅ 什么是 Firmware Image 的分段下载?
NVMe 固件镜像可能较大,无法通过单个命令下载,因此通过多次 Firmware Image Download 命令,分片下载整个镜像。每个命令只负责镜像的一部分。
✅ 核心字段说明
📌 1. Command Dword 10 – Number of Dwords (NUMD)
- 位置: Command Dword 10 → Bits 31:00
- 功能: 表示此次命令下载的 Dword 数量(一个 Dword = 4 字节)。
- 注意: 这是一个 0-based 值,也就是说:
NUMD = 0→ 实际传输 1 个 Dword(4 字节)-
NUMD = 3→ 实际传输 4 个 Dword(16 字节) -
对齐要求: 必须满足
FWUG字段定义的 对齐与粒度要求(例如:必须 4KB 对齐),否则命令会因字段无效而失败,返回状态码Invalid Field in Command。
📌 2. Command Dword 11 – Offset (OFST)
- 位置: Command Dword 11 → Bits 31:00
- 功能: 表示本次传输的数据块在整个固件镜像中的 偏移量(以 Dword 为单位)。
- 例子:
- 若第一块固件,
OFST = 0h,表示从头开始写。 -
第二块若长度为 0x100(实际传输 0x101 个 Dword),则下一个块应从
OFST = 0x101开始。 -
同样要满足
FWUG字段的对齐要求(参见 Figure 275)。
📌 3. Data Pointer(DPTR)
- 位置: 位于 PRP 或 SGL(数据指针)结构中
- 功能: 表示从主机内存中 获取固件片段数据的位置
- 参照: Figure 87 中详细定义了
DPTR如何传输数据
✅ 切片下载原则与限制
| 操作要点 | 描述 |
|---|---|
| ✅ 顺序要求 | 对于普通固件镜像(非 Boot Partition),可以乱序提交各个切片(offset 可跳跃) |
| ❌ Boot Partition | 更新 Boot Partition 时,必须按顺序提交切片 |
| ⚠️ 不能重叠范围 | 两个命令的 Offset 和 NUMD 区间不能有交集,否则控制器会返回 Overlapping Range 错误 |
| ⚠️ 不能交叉更新 | Host 不应并行执行多个固件/Boot Partition 的更新任务。请确保一次只更新一个镜像。 |
✅ 固件下载后的行为规则
Firmware Image Download命令 不会自动激活固件- 下载完成后,必须发送
Firmware Commit命令 才能提交该镜像 - 一旦 Commit 完成,再发送另一个 Download 命令时:
- 控制器将丢弃前一个镜像剩余未提交的部分(如果有)
- 如果在下载与提交之间发生 Reset,控制器也会自动清空未提交的固件段
🔍 实用举例
设想你要下载一个总共 8KB 固件镜像(2048 Dwords),你可以分 2 次下载:
下载第一个 4KB:
NUMD = 1023(1024 Dwords)OFST = 0- Data Pointer 指向固件镜像的前 4KB
下载第二个 4KB:
NUMD = 1023OFST = 1024- Data Pointer 指向固件镜像的后 4KB
提交后,发送
Firmware Commit (CA = 001b)激活于下次 Reset。
✅ 图示结构回顾:
✅ 图 184:Data Pointer
- 指向主机内存中固件数据的地址
✅ 图 185:Command Dword 10
| Bit | 字段 | 描述 |
|---|---|---|
| 31:00 | NUMD | 此次下载的数据长度(以 Dword 为单位) |
✅ 图 186:Command Dword 11
| Bit | 字段 | 描述 |
|---|---|---|
| 31:00 | OFST | 数据段相对于固件开头的偏移(以 Dword 为单位) |
如果你需要我画一个流程图,展示多个 Firmware Image Download 命令如何组合完整镜像,我可以马上帮你画出来。也可以一起分析 Figure 275 中的 FWUG 字段结构与其对齐限制。你感兴趣吗?