高级特性 - 🧾 Reservation Status Data Structure(图 404)详解 (第347页)
我们继续深入讲解 NVMe Base Specification 2.0b 中 7.5 Reservation Report 命令 的返回数据结构内容,重点分析图 404 和图 405 中定义的 Reservation Status Data Structure 与 扩展版本(Extended)数据结构。
🧾 Reservation Status Data Structure(图 404)详解
这是当主机设置 EDS = 0 且使用 64-bit Host Identifier 时返回的结构体。结构布局如下:
🔹 前导字段(Header Fields)
| 字节范围 | 字段名 | 说明 |
|---|---|---|
| 03:00 | GEN (Generation Counter) | |
32-bit 递增计数器。用于主机判断返回的报告是否在其处理过程中发生变化,支持 wrap-around(FFFFFFFFh 后回到 0h): |
||
| - 任一控制器执行了成功的 Reservation Register / Release(Clear)/ Acquire(Preempt/Preempt & Abort)命令时 +1 | ||
- 主机可以重复获取,直到前后两次 GEN 相同,认为数据一致。 |
| 04 | RTYPE (Reservation Type) |
表示是否存在 Reservation(非 0)以及其类型。对应定义见图 394,例如:
- 1h: Write Exclusive
- 2h: Exclusive Access
- 0h: 没有任何 Reservation
| 06:05 | REGCTL (Registered Controllers) |
有多少个控制器注册了这个命名空间(即 Register 过 Reservation Key),下方跟着多少个 Registered Controller Data Structure。
| 08:07 | Reserved | 保留字段
| 09 | PTPLS(Persist Through Power Loss State) |
表示是否支持电源断电后保留注册者/Reservation:
- 0: 不保留,断电清除
- 1: 保留,断电后仍存在
| 23:10 | Reserved | 空间预留
🔹 Registered Controller Data Structure
从字节 24 开始,每个控制器一个结构,每个大小为 24 bytes。其结构如下:
| 字节 | 字段 | 描述 |
|---|---|---|
| 07:00 | Reservation Key (RKEY) | |
| 控制器所注册的 Reservation Key | ||
| 09:08 | Controller ID (CNTLID) | |
| 控制器的 ID | ||
| 15:10 | Host Identifier | |
| 主机标识符(64-bit Host ID) | ||
| 16 | Status | |
| 指示该控制器是否是 Reservation 持有者(Bit 0 = 1 则为持有者) | ||
| 23:17 | Reserved |
🧾 Reservation Status Extended Data Structure(图 405)详解
当主机设置 EDS = 1 且使用 128-bit Host Identifier 时返回该结构体,其结构更长更完整。
📘 结构组成
| 区段 | 描述 |
|---|---|
| 0–23 字节 | 与图 404 的普通结构一样(GEN, RTYPE, REGCTL, PTPLS 等) |
| 24–63 字节 | 保留空间,填充对齐用 |
| 从字节 64 起 | 每个 Registered Controller Extended Data Structure,占用 64 字节 |
🔹 Registered Controller Extended Data Structure(64 字节)
该结构扩展了 Host Identifier 字段支持 128 位,并可能预留更多字段用于未来扩展。常见结构如下:
| 字节范围 | 字段 | 描述 |
|---|---|---|
| 07:00 | Reservation Key (RKEY) | |
| 09:08 | Controller ID (CNTLID) | |
| 25:10 | Host Identifier (HOSTID) – 128 位 | |
| 26 | Status(是否持有者) | |
| 63:27 | Reserved |
🧠 使用建议与解析技巧
✅ 识别保留类型与主机注册者身份
RTYPE != 0h→ 存在 Reservation,需依据图 394 判断类型Status & 0x01 == 1→ 表示此控制器为 Reservation 的持有者
✅ 多主机共享场景解析流程
1. 主机 A 获取 Reservation Report
2. 查看 GEN,记录下来
3. 遍历 Registered Controllers:
- 哪些 HostID 注册了
- 谁是持有者(Status)
4. 可执行 Preempt / Abort 等操作
5. 如需重新确认,重复读取并比对 GEN 是否有变化
⚠️ 常见错误场景
| 情况 | 结果 |
|---|---|
| EDS = 1,但 Host 使用 64-bit ID | 报错:Host Identifier Inconsistent Format |
| EDS = 0,但 Host 使用 128-bit ID | 报错:Host Identifier Inconsistent Format |
NUMD 长度小于返回数据结构实际长度 |
控制器仅返回前段数据 |
NUMD 长度过大 |
控制器只返回实际内容,忽略剩余空间,不报错 |
🧪 示例分析
示例:命名空间状态如下
RTYPE = 2h (Exclusive Access)REGCTL = 2PTPLS = 1- Registered Entries:
- Controller 1: HostID =
0xAABBCCDDEEFF0011, 持有者 - Controller 2: HostID =
0xAABBCCDDEEFF0022, 非持有者
解读: 主机 1 当前为唯一持有者,主机 2 只是注册了 Key,但没有持有权。主机 2 若要获得控制权,需要执行 Reservation Acquire (Preempt),提供正确的 PRKEY。
如果你需要我进一步 画出 Reservation Report 结构的内存布局图,或讲解 多主机抢占/释放流程图,随时告诉我,我可以帮你全面掌握 NVMe Reservation 的完整机制。是否继续?我们可以接着分析图 406 与 407 的 Report 返回数据结构详情。