管理命令集与操作 - 第164页
我们继续对 NVMe 2.0b 基础规范第 153 页 的内容进行中文逐段深入解读与教学讲解,聚焦于以下三大核心模块:
✅ 一、Capacity Management 命令的容量字段使用规则
📌 条件:
当 Operation 字段设置为以下两种操作之一时,才使用 CDW11/12 的容量字段:
1h→ Create Endurance Group3h→ Create NVM Set
在这种情况下:
| 字段 | 含义 |
|---|---|
| Capacity Lower(CDW11) | 容量的低32位(单位:字节) |
| Capacity Upper(CDW12) | 容量的高32位,组合成64位完整容量值 |
🛑 如果是其它操作(如 Delete、Select Config 等),则这两个字段保留,不得使用。
✅ 二、选择固定容量配置(Operation = 0h)机制详解
🔷 场景 1:应用一个新的 Capacity Configuration Descriptor
当满足以下条件:
Operation字段 =0h(选择容量配置);Element Identifier为某个支持的配置 ID;- 当前配置字段
Selected Configuration(Media Unit Status Log Page 中定义)为0h(表示尚未选择配置);
🔁 控制器应顺序执行以下操作:
- 为每个配置描述符中的 Endurance Group 创建一个新的 Endurance Group;
- 为每个配置中列出的 NVM Set 创建对应的 NVM Set(如果有);
👉 对应配置结构定义见:
- Supported Capacity Configuration List
- Media Unit Status Log(Figure 248)
🔷 场景 2:清除当前配置(Element Identifier = 0h)
表示主机要求清空当前控制器所在域的所有配置资源,控制器应依次执行:
- 删除所在域中的所有命名空间;
- 删除该域中的所有 NVM Sets(如有);
- 删除该域中的所有 Endurance Groups;
- 将
Selected Configuration字段清零(0h)。
🧠 此机制非常适合工厂重置或配置重置场景。
🔷 场景 3:重新选择当前配置(Element Identifier 与 Selected Configuration 相同)
- 控制器应无错误地完成命令;
- 不做任何修改。
👉 表示“重复设置”时是幂等(idempotent)操作。
❌ 错误处理场景:
如果满足以下任一情况:
Element Identifier既不是0h,也不是支持列表中的合法配置 ID;- 当前配置字段
Selected Configuration ≠ 0h(表示已经选过配置);
👉 控制器应返回错误状态:Invalid Field in Command,并且不对当前配置做任何改动。
✅ 三、Endurance Group 操作机制(Operation = 1h)
🎯 创建 Endurance Group 时,控制器应:
- 从指定域中分配一个唯一未使用的非零
Endurance Group Identifier; - 将分配结果写入 Completion Queue Entry 的 Dword 0(详见 Figure 153);
- 如果没有可用 ID,则命令失败,返回状态码:
Identifier Unavailable。
💡 是否支持 Media Units 的差异处理:
- 支持 Media Units:控制器从域中选择一个或多个 Media Unit 来分配给 EG;
- 不支持 Media Units:控制器从域中选择 NVM 存储容量直接分配给 EG。
👉 这是为了兼容不同架构的设备(例如具备物理分区能力 vs 纯逻辑容量划分)。
🧱 容量验证机制:
创建 Endurance Group 时,主机通过 CDW11/CDW12 指定目标容量。如果该容量:
- 超过了 Identify Controller 返回的最大 Endurance Group 容量(MEGCAP 字段),
👉 控制器应拒绝请求,具体后文会有详细错误处理机制(将在后页继续展开说明)。
🧠 学习小结
| 模块 | 关键点 | 行为 |
|---|---|---|
CDW11/12 |
仅在创建操作中有效 | 指定创建的容量(字节数) |
| Select Capacity Configuration | 三种场景:应用配置、清除配置、重复选择 | 控制器执行相应创建/删除动作 |
| Endurance Group 创建 | 控制器选择唯一 ID 并记录至 Dword 0 | 若无 ID 可用则返回错误 |
| 容量验证 | 与 Identify 返回的 MEGCAP 比较 |
超过则返回错误 |
如果你希望我带你继续分析:
- Figure 153:Completion Queue Entry 的结构;
- Capacity Descriptor 的结构与使用(Figure 251 及其前后);
- MEGCAP 的获取方式和使用场景;
- 实际构造一个完整的创建命令例子(带命令包格式);
都可以继续问我,我可以一步步帮你整理透彻。你想继续哪个部分?