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

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

Blog Author

我们现在进入 《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。你希望怎么继续?