高级特性与优化 - 第348页
好的,我们继续深入中文解析 NVMe Express Base Spec 2.0b 第 7.5 节 Reservation Report 命令 中的两个关键结构体:
🧾 图 406:Registered Controller Data Structure(常规)
这个结构体用于报告当前命名空间中各控制器与主机注册者的状态,适用于 64-bit Host Identifier 模式。每个结构体占 24 字节。
🧩 字段结构详解
| 字节范围 | 字段名 | 描述 |
|---|---|---|
| 01:00 | Controller ID (CNTLID) | |
指示该结构体报告的是哪个控制器的状态,对应该控制器 Identify Controller 返回中的 CNTLID 字段。 |
||
如果该控制器是动态控制器且未分配给任何主机,则该字段为 FFFFh。 |
| 02 | Reservation Status (RCSTS) |
该控制器是否为 Reservation 持有者(Bit 0 = 1 表示持有)
- Bits [7:1] 保留
- Bit [0] = 1 → 此控制器的主机当前持有 Reservation
| 07:03 | Reserved | 保留字段
| 15:08 | Host Identifier (HOSTID) |
对应控制器的主机标识符,64 位
| 23:16 | Reservation Key (RKEY) |
当前控制器所属主机注册的 Reservation Key
🧾 图 407:Registered Controller Extended Data Structure(扩展)
用于在使用 128-bit Host Identifier 模式下的 Reservation Report 报文中返回控制器注册状态。每个结构体占 64 字节。
🧩 字段结构详解
| 字节范围 | 字段名 | 描述 |
|---|---|---|
| 01:00 | Controller ID (CNTLID) | 同上 |
| 02 | Reservation Status (RCSTS) | 同上 |
| 07:03 | Reserved | 保留 |
| 15:08 | Reservation Key (RKEY) | 当前注册的 Reservation Key |
| 31:16 | Host Identifier (HOSTID) | 128 位的主机标识符 |
| 63:32 | Reserved | 保留 |
🎯 总结:64 位与 128 位结构的核心区别
| 对比维度 | 图 406(标准结构) | 图 407(扩展结构) |
|---|---|---|
| Host ID | 64 位 | 128 位 |
| 总大小 | 24 bytes | 64 bytes |
| 是否支持扩展字段 | 否 | 是,预留更多字节供将来扩展 |
| 用途 | 常规 NVMe over PCIe 或简化的 Fabrics 应用 | 完整 NVMe-oF 场景、支持多主机、多路径 |
🧠 使用技巧与示例逻辑
当你从控制器发起 Reservation Report 命令 后,主机如何解析这些结构体?
1. 读取返回的 GEN 值,确保获取过程中的一致性;
2. 判断 RTYPE 是否为 0:
- 0 → 无 Reservation,忽略;
- 非 0 → 继续分析;
3. 获取 REGCTL 个数,开始循环解析每个 Registered Controller 结构体;
4. 对于每个条目:
- 记录 CNTLID
- 判断 RCSTS Bit0 是否为 1:是否为持有者
- 对比 HOSTID 是否为自己 → 确认是否是自己持有者
- 获取其 RKEY,用于后续 Preempt、Abort 等指令
📌 多主机共享命名空间示例解析
设定如下:
- 控制器 A,CNTLID = 01h,HostID =
0x11...11,RKEY =0xAAAABBBBCCCCDDDD,持有者 - 控制器 B,CNTLID = 02h,HostID =
0x22...22,RKEY =0xEEEEFFFF00001111,非持有者
→ 主机 B 若想获取 Reservation 权限:
- 可发送 Reservation Acquire,指定:
CRKEY = 自己的 RKEYPRKEY = 当前持有者的 RKEYAction = Preempt
❗ 常见错误
| 错误场景 | 错误码 |
|---|---|
| EDS = 1 但 HOSTID 是 64-bit | Host Identifier Inconsistent Format |
| EDS = 0 但 HOSTID 是 128-bit | Host Identifier Inconsistent Format |
| REGCTL 个数为 0 | 没有注册者,Reservation 肯定不存在 |
是否还想继续深入讲解 Reservation 的完整命令交互流程图(Register → Acquire → Report → Release)?或者我可以帮你画出这两个结构体在内存中的直观分布图,帮助你更加形象地理解。只需告诉我~