命名空间管理与配置 - 第144页
我们继续深入分析 《NVM Express® Base Specification, revision 2.0b》第133页,本页详细定义了三种具体的 SGL 描述符格式:
- SGL Data Block Descriptor(数据块描述符)
- SGL Bit Bucket Descriptor(位桶描述符)
- 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 构造示例(读或写命令),我可以帮你继续深入理解。
是否继续?