高级特性 - 🔄 6.4 Disconnect Command(断开连接命令) (第339页)
我们继续深入分析 NVM Express® Base Specification 2.0b 的 6.4 Disconnect Command(断连命令) 和 6.5 Property Get Command(属性读取命令),帮助你完全理解 NVMe-oF 的连接生命周期管理与寄存器属性读操作机制。
🔄 6.4 Disconnect Command(断开连接命令)
📌 功能概述:
Disconnect 命令用于从 I/O Submission Queue 上发出请求,删除该 I/O Queue。
- ⚠️ 不能在 Admin Queue 上发出 Disconnect 命令,否则返回 Invalid Queue Type。
- 命令成功后:
- 控制器将 不再处理该 Queue 上的命令。
- Disconnect 命令的 Completion Entry 是该 Queue 的最后一条响应项。
🔧 SQE 字段结构 – Figure 384
| 字节范围 | 字段名 | 说明 |
|---|---|---|
00 |
OPC |
固定为 7Fh,表示 Fabrics 命令 |
01 |
Reserved | 保留 |
03:02 |
CID |
命令标识符 |
04 |
FCTYPE |
固定为 08h,表示 Disconnect 命令 |
23:05 |
Reserved | 保留 |
39:24 |
SGL1 |
保留字段,无数据传输 |
41:40 |
RECFMT |
Capsule 结构格式,需设为 0h,否则返回 Incompatible Format |
63:48 |
Reserved | 保留 |
📤 Disconnect Response – Figure 385
| 字节范围 | 字段名 | 说明 |
|---|---|---|
07:00 |
Reserved | 保留 |
09:08 |
SQHD |
当前 Submission Queue 的 Head Pointer |
11:10 |
Reserved | 保留 |
13:12 |
CID |
与响应命令匹配的命令 ID |
15:14 |
STS |
命令执行状态码(如成功、Busy、Invalid Queue Type 等) |
⚠️ 特别注意事项:
- Disconnect 命令发出后,主机不得再往该 I/O SQ 提交任何命令,否则行为未定义。
- Transport 连接并不会立即断开,仅当所有 Queue 被删除后,主机和控制器才可释放相关资源(详见 §3.3.2.4)。
🧾 6.5 Property Get Command(属性读取)
📌 功能概述:
Property Get 用于主机读取控制器上的某个属性值(寄存器),常用于 控制器初始化阶段: - 类似于 MMIO register read。 - 支持读取长度为 4 Bytes 或 8 Bytes 的属性值。
🔧 SQE 字段结构 – Figure 386
| 字节范围 | 字段名 | 说明 |
|---|---|---|
00 |
OPC |
固定为 7Fh(Fabrics 命令) |
01 |
Reserved | 保留 |
03:02 |
CID |
命令标识符 |
04 |
FCTYPE |
固定为 04h,表示 Property Get |
39:05 |
Reserved | 保留 |
40 |
ATTRIB |
属性读取格式: - bits 2:0: 读取字节长度000b: 4 bytes001b: 8 bytes- bits 7:3: 保留 |
43:41 |
Reserved | 保留 |
47:44 |
OFST |
指定要读取的属性的偏移量(单位:Byte) 详见 §3.1.3 中的属性表 |
🧾 属性读取范围说明(来自 §3.1.3)
在 Fabric 模式下,常用的属性包括但不限于:
- CAP(Controller Capabilities)
- VS(Version)
- CC(Configuration)
- CSTS(Controller Status)
- …等。
偏移量例子(以字节为单位):
| 属性 | Offset |
|---|---|
CAP |
00h |
VS |
08h |
CC |
14h |
CSTS |
1Ch |
🚦 错误处理:
- 若指定了 无效属性偏移量,则返回状态码
Invalid Field in Command。 - 返回值(读取数据)由 Completion Queue Entry 和 Data Buffer 返回,后续 §6.5 后半部分将介绍 Response。
📘 总结:命令行为对照表
| 命令 | FCTYPE | 用途 | 数据方向 | 支持数据传输 | 典型用途 |
|---|---|---|---|---|---|
| Disconnect | 08h |
删除 I/O Queue | 无 | ❌ 无数据 | 释放资源 |
| Property Get | 04h |
读取寄存器 | Controller → Host | ✅ 读数据 | 初始化控制器 |
📌 如你接下来想深入 6.5 Property Get 的 Response 格式 或进入 6.6 Property Set 写寄存器机制,我可以继续逐句解析。如果你对具体 Transport 初始化流程(如 Fabric Init handshake)感兴趣,也可以一起分析。需要的话,也能帮你制作流程图和寄存器偏移速查表。你想继续吗?