命名空间管理与配置 - 第146页
我们现在进入 《NVM Express® Base Specification, revision 2.0b》第135页 的重点部分:
SGL 实例讲解(SGL Example)
这部分内容通过一个实际的读请求场景(data read request),演示如何构造多个 SGL 段(SGL Segment)与各类描述符(Data Block、Bit Bucket、Last Segment)来完成数据的部分读取操作。
📘 小节:4.1.2.1 – SGL 示例说明
✅ 示例背景(SGL 用于读请求)
| 项目 | 值 / 说明 |
|---|---|
| 逻辑块大小(LBA Size) | 512 Byte |
| NLB 字段 | 设置为 26,表示访问 26 个逻辑块,共 13 KiB |
| 实际传输到主机的数据量 | 11 KiB |
| 未传输的部分 | 有 2 KiB 的数据被 Bit Bucket 描述符 丢弃(即控制器读取但不传给主机) |
| SGL 段数 | 3 个 SGL 段 |
| 数据块描述符 | 总共 3 个,长度分别为:3 KiB、4 KiB、4 KiB |
🧩 各段内容详细解析
📦 Segment 1:第一段(SGL)
- 包含以下描述符:
SGL Bit Bucket Descriptor(2 KiB) → 表示忽略来自 NVM 的前 2 KiB。SGL Last Segment Descriptor→ 表示当前指向的段是最后的 SGL 段。
✅ 注:Bit Bucket 描述符只能用于目标缓冲区(Destination SGL),用来跳过部分数据。
📦 Segment 2:第二段(由 Last Segment 指向)
- 包含一个
SGL Data Block Descriptor,长度为 3 KiB; - 指定该 3 KiB 数据应该写入主机内存的某个地址中。
📦 Segment 3:第三段
- 包含两个
SGL Data Block Descriptor,分别为: - 4 KiB
- 4 KiB
加上 Segment 2 的 3 KiB,总共是 11 KiB 数据传输。
🧠 逻辑与数据对照图解(口头说明版):
NLB = 26 blocks × 512B = 13 KiB 总数据
↓ 实际处理如下 ↓
[Segment 1]
├── Bit Bucket (2 KiB) → 这 2 KiB 被丢弃(不传给主机)
└── Last Segment Descriptor → 指向 Segment 2(表明这是最后一段前的入口)
[Segment 2]
└── Data Block Descriptor (3 KiB) → 数据传给主机,写入地址 A
[Segment 3]
├── Data Block Descriptor (4 KiB) → 数据传给主机,写入地址 B
└── Data Block Descriptor (4 KiB) → 数据传给主机,写入地址 C
📌 教学点总结
| 元素 | 用法说明 |
|---|---|
Bit Bucket Descriptor |
控制器读取 NVM 的数据,但不传给主机,节省带宽或用于测试等特殊目的。 |
Data Block Descriptor |
正常用于数据读写,指向主机缓冲区地址及长度。 |
Last Segment Descriptor |
用于连接并标记 最终的 SGL 段,构建链表式的 SGL 结构。 |
SGL Segment |
每个段由一组描述符构成,描述实际传输结构,可以链接多个段实现复杂布局。 |
✅ 实用提示
- NLB 表示逻辑块总数,但传输的数据量可以比它少(通过 Bit Bucket 控制);
- 使用多个段可更灵活地组织分散的主机内存缓冲区;
- Bit Bucket 不能用于主机 → 控制器的写操作,否则视为无效。
是否需要我将这个例子转换成可视化图解(框图结构)或者帮你构造一个 具体的 SGL 描述符数组示例(例如用 C 结构体表示)?也可以继续讲解 后续章节 4.2:Identify Data Structures。你希望怎么继续?