高级特性与优化 - 第348页
NVME2.0协议解读 1 min read

高级特性与优化 - 第348页

Blog Author

好的,我们继续深入中文解析 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 = 自己的 RKEY
  • PRKEY = 当前持有者的 RKEY
  • Action = 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)?或者我可以帮你画出这两个结构体在内存中的直观分布图,帮助你更加形象地理解。只需告诉我~