命名空间管理与配置 - 第144页
NVME2.0协议解读 1 min read

命名空间管理与配置 - 第144页

Blog Author

我们继续深入分析 《NVM Express® Base Specification, revision 2.0b》第133页,本页详细定义了三种具体的 SGL 描述符格式:

  1. SGL Data Block Descriptor(数据块描述符)
  2. SGL Bit Bucket Descriptor(位桶描述符)
  3. SGL Segment Descriptor(段描述符)

每种类型都拥有自己的使用场景与字段结构,下面逐一详解。


🧩 1. SGL Data Block Descriptor(数据块描述符)(续 Figure 116)

用于传输实际的数据块,是最常用的 SGL 描述符。

字段说明(补充):

字节范围 字段 说明
14:12 Reserved 保留字段
15 SGL Identifier:包括描述符类型与子类型
└─ 03:00 SGL Descriptor Sub Type 通常为 0h(地址)或 1h(偏移量)
└─ 07:04 SGL Descriptor Type 固定为 0h,代表是 数据块描述符

🚮 2. SGL Bit Bucket Descriptor(比特桶描述符)(Figure 117)

用于忽略部分源数据或指示目标缓冲区中的“空洞”(即:不要接收这部分数据)。

📦 字段结构:

字节范围 字段 说明
07:00 Reserved 保留
11:08 Length 指定被丢弃的数据字节数
14:12 Reserved 保留
15 SGL Identifier
└─ 03:00 SGL Descriptor Sub Type 通常为 0h(地址)或 1h(偏移量)
└─ 07:04 SGL Descriptor Type 固定为 1h,表示是 Bit Bucket 描述符

✅ 行为说明:

  • 控制器 → 主机传输(读操作)
  • 指示控制器不要把部分源数据传输到目标缓冲区。
  • 即:控制器主动丢弃指定长度的数据。

  • 主机 → 控制器传输(写操作)

  • 该描述符无效,视作长度为 0,即不生效。

⚠️ 注意:如果用于读(destination buffer),Length 会计入传输数据长度; 如果用于写(source buffer),则不计入。


🔗 3. SGL Segment Descriptor(段描述符)(Figure 118)

用于组织多个 SGL 段结构的 链式连接(非最后一个段时使用)。

📦 字段结构:

字节范围 字段 说明
07:00 Address 起始地址或偏移量,指向下一个 SGL 段
11:08 Length 段长度,必须是非零且为 16 的整数倍(每个描述符为 16 字节)
14:12 Reserved 保留
15 SGL Identifier
└─ 03:00 SGL Descriptor Sub Type 通常为 0h(地址)或 1h(偏移量)
└─ 07:04 SGL Descriptor Type 固定为 2h,代表是 段描述符

✅ 行为说明:

  • Address + Length 必须小于 1_00000000_00000000h,否则报告 SGL Length Invalid
  • 每段的大小(Length)应是16 的倍数,因为每个描述符大小为 16 字节。
  • 指向的地址必须是有效的 SGL Segment 起始位置(用于进一步描述 Data Block、Bit Bucket 等)。

🧠 总结与关键要点

描述符类型 类型码 用途 特殊规则
数据块描述符 0h 指向真实数据块的内存地址 Address 和 Length 需 dword 对齐(如控制器要求)
比特桶描述符 1h 指定丢弃数据的长度 仅在读时有效;写时视为无效
段描述符 2h 指向下一个 SGL 段的地址 Length 必须是 16 的倍数,不能为 0
最后段描述符 3h 指向最后一个 SGL 段(下一页定义) 使用方式同上但为终止链表用
带键描述符 4h 包含 memory key 的数据传输 仅支持部分传输类型,如 RDMA
传输描述符 5h 用于指定特定 NVMe Transport 的缓冲区 定义依赖于 Fabric Transport

✅ 教学建议与实用提示

  • SGL 描述符必须合理组织,错误的类型或结构会导致控制器拒绝命令。
  • Bit Bucket 主要用于高级用途(如日志、虚拟块管理),不要误用在写命令中
  • 对于使用多段 SGL 描述符的命令,应确保:
  • 各段用 Segment/Last Segment 连接;
  • 每段内部描述符个数合法;
  • 总长度对齐并不超限制。

如果你希望我继续讲解下一页内容,例如 Last Segment 描述符的定义(Figure 119)SGL 操作完整流程图解,或者你想看一个实际的 SGL 构造示例(读或写命令),我可以帮你继续深入理解。

是否继续?