管理命令集 - ✅ 一、Capacity Management 命令的特定状态值(Figure 152) (第166页)
我们继续深入分析 NVM Express® Base Specification, revision 2.0b 中的第 155 页内容,特别是关于 Capacity Management 命令的状态值、创建 I/O 完成队列命令(Create I/O Completion Queue Command)的详细解析。
✅ 一、Capacity Management 命令的特定状态值(Figure 152)
1. Insufficient Capacity(容量不足)
- 状态码:26h
- 描述:当请求的操作所需的容量大于当前可用的空间时,会返回此状态。
- 错误信息:如果 Error Information log page 被支持,控制器会在 Command Specific Information 字段中指定创建 Endurance Group 或 NVM Set 所需的总容量(字节数)。
2. Identifier Unavailable(标识符不可用)
- 状态码:2Dh
- 描述:表示支持的 Endurance Groups 或 NVM Sets 数量已经超过最大限制。
- 错误信息:在完成队列项的 Dword 0 中将包含成功创建的 Endurance Group 或 NVM Set 的标识符(如果有的话)。
✅ 二、Capacity Management 完成队列条目(Figure 153)
Dword 0 的结构:
| Bit 区间 | 字段 | 描述 |
|---|---|---|
| 31:16 | Reserved | 保留 |
| 15:00 | Created Element Identifier | 指示 创建的 Endurance Group 或 NVM Set 的标识符。如果 Create Endurance Group 操作成功,显示 Endurance Group Identifier;如果 Create NVM Set 操作成功,显示 NVM Set Identifier;对于其他操作,此字段保留。 |
✅ 三、创建 I/O 完成队列命令(Create I/O Completion Queue Command)
功能:该命令用于创建所有 I/O Completion Queues(除了 Admin Completion Queue)。Admin Completion Queue 是通过在 ACQ 属性中指定基地址来创建的。
1. PRP 列表和内存管理
- PRP List:如果命令中提供了 PRP List 来描述完成队列,主机软件必须将 PRP List 保持在物理内存的相同位置,并且在删除 I/O 完成队列命令执行完成之前,不得修改 PRP List。如果修改了 PRP List,行为是未定义的。
2. PRP Entry 1(见 Figure 154)
| 位区间 | 字段 | 描述 |
|---|---|---|
| 63:00 | PRP Entry 1 (PRP1) | 如果 CDW11.PC = 1,则此字段指定一个 64 位的基内存地址指针,指向物理连续的完成队列。该地址指针需要满足内存页对齐(根据 CC.MPS 的值)。 如果 CDW11.PC = 0,则该字段指定一个 PRP List 指针,描述构成完成队列的内存页列表。每个 PRP 项应有偏移量为 0。 如果在 PRP 列表中发现非零偏移量,则控制器应返回 PRP Offset Invalid 错误。 |
3. 命令 Dword 10 结构(见 Figure 155)
| 位区间 | 字段 | 描述 |
|---|---|---|
| 31:16 | Queue Size (QSIZE) | 指定将要创建的完成队列的大小。若大小为 0h 或超出了控制器支持的范围,则控制器应返回 Invalid Queue Size 错误(参见 §3.3.3.3)。 |
| 15:00 | Queue Identifier (QID) | 指定分配给完成队列的标识符。该标识符与 Completion Queue Head Doorbell 相对应(即 CQyHDBL)。此标识符不能超过 Number of Queues 字段报告的最大值,并且如果指定的值为 0h 或超过已支持的队列数,或与已经存在的标识符重复,控制器应返回 Invalid Queue Identifier 错误。 |
✅ 四、创建 I/O 完成队列命令的状态值与错误处理
命令特定状态值
- Invalid Queue Size:如果
Queue Size字段的值无效(如为 0h 或超过控制器支持的最大值),控制器应返回此错误。 - Invalid Queue Identifier:如果
Queue Identifier无效(如为 0h、超过最大值或与现有标识符冲突),则返回此错误。
🧠 学习总结
| 操作类型 | 关键字段 | 错误处理 | 描述 |
|---|---|---|---|
| Capacity Management | Insufficient Capacity |
26h | 容量不足时返回,需查看 Error Information Log |
| Capacity Management | Identifier Unavailable |
2Dh | 已超出最大 Endurance Group 或 NVM Set 支持数 |
| 创建 I/O 完成队列 | PRP List、PRP Entry |
PRP Offset Invalid | PRP 列表中偏移量无效时返回 |
| 创建 I/O 完成队列 | Queue Size、Queue Identifier |
Invalid Queue Size、Invalid Queue Identifier | 队列大小或标识符无效时返回 |
扩展学习建议
如果你希望进一步学习以下内容,欢迎继续提问:
- Completion Queue 的管理和调度机制;
- PRP List 的内存管理与优化;
- 多个队列的创建与管理(比如 Admin Queue 和 I/O Completion Queue 的配合使用)。
我可以提供更深入的示例和详细解析,帮助你在实践中掌握这些概念。你希望继续探索哪个部分呢?