命名空间管理 - 🌟 SGL(Scatter Gather List) 进一步解析 (第142页)
NVME2.0协议解读 1 min read

命名空间管理 - 🌟 SGL(Scatter Gather List) 进一步解析 (第142页)

Blog Author

我们继续对 《NVM Express® Base Specification, revision 2.0b》第131页 中关于 SGL(Scatter Gather List) 的详细解析,特别关注 Keyed SGL Data Block descriptorTransport SGL Data Block descriptorSGL SegmentSGL 描述符格式 等关键内容。


🌟 SGL(Scatter Gather List) 进一步解析

Keyed SGL Data Block Descriptor(带键的 SGL 数据块描述符)

  • Keyed SGL 数据块描述符 是一种特殊类型的数据块描述符,其中包括一个 密钥,用于作为主机内存访问的一部分。
  • 最大长度:在 Keyed SGL 数据块描述符中,可以指定的最大长度为 (16 MiB - 1)

Transport SGL Data Block Descriptor(传输 SGL 数据块描述符)

  • 传输 SGL 数据块描述符 指定了一个数据块,该数据块通过 NVMe 传输机制NVMe 传输特定的数据缓冲区 进行传输。

SGL 描述符子类型(SGL Descriptor Sub Type)

  • SGL 子类型字段 提供了关于描述符的附加信息。该子类型可以指示 地址字段 是偏移量而不是绝对地址,也可以指示 NVMe 传输特定的信息

⚠️ SGL 错误处理机制

控制器会在以下情况下中止命令: 1. SGL 段 中包含一个 SGL Segment 描述符SGL Last Segment 描述符,但该描述符不是该段中的最后一个。 2. 最后一个 SGL 段 包含一个 SGL Segment 描述符SGL Last Segment 描述符(这是不允许的)。 3. SGL 描述符格式不受支持。 4. SGL 数据块描述符 中的 地址(Address)长度(Length) 字段的两个最低有效位(bits 1:0)不为 00b,而控制器仅支持 dword 对齐(如 Identify Controller 数据结构 中的 SGL Support 字段指示)。


🧩 SGL Segment 布局(Figure 112)

SGL 段的定义

  • 一个 SGL 段 包含一个或多个 SGL 描述符。每个描述符都指向内存中的一段数据,通常用于 数据块比特桶 的描述。

SGL 段布局

每个 SGL 描述符占 16 字节,依次排列在内存中,描述符的总数由命令的参数和内存页面大小来确定。


🧠 SGL 描述符格式(Figure 113)

SGL 描述符的组成

  • 描述符类型特定字段(Descriptor Type Specific): 用于指示该描述符的具体类型。
  • SGL 标识符(SGL Identifier): 唯一标识该描述符的字段。
  • 描述符子类型(SGL Descriptor Sub Type): 描述符的具体子类型,帮助进一步指示描述符的功能。
  • 描述符类型(SGL Descriptor Type): 说明该描述符是数据块、比特桶、段,还是最后一个段。

SGL 描述符类型(Figure 114)

代码 描述符类型
0h SGL 数据块描述符(SGL Data Block descriptor)
1h SGL 比特桶描述符(SGL Bit Bucket descriptor)
2h SGL 段描述符(SGL Segment descriptor)
3h SGL 最后一个段描述符(SGL Last Segment descriptor)
  • SGL 数据块描述符0h)用于指示数据块的内存区域;
  • SGL 比特桶描述符1h)用于指示一个不包含实际数据的内存区域;
  • SGL 段描述符2h)用于指示一个包含多个数据块描述符的段;
  • SGL 最后一个段描述符3h)标记该段为最后一个段。

📝 总结与关键点

项目 说明
Keyed SGL 数据块描述符 包含密钥,最大长度为 16 MiB - 1,用于主机内存访问。
传输 SGL 数据块描述符 通过 NVMe 传输机制指定的数据块,用于特定传输。
SGL 描述符子类型 提供描述符的附加信息,如地址是偏移量还是绝对地址,或传输特定信息。
错误处理机制 详细列举了导致控制器中止命令的错误场景,如无效的段描述符、格式错误等。
SGL 段布局与描述符格式 每个 SGL 段包含一个或多个 SGL 描述符,描述符有特定格式,包括类型、子类型等字段。
SGL 描述符类型 包括数据块描述符、比特桶描述符、段描述符等,具有不同的功能和应用场景。

🧠 教学要点与建议

  • SGL 描述符的灵活性:SGL 提供了非常灵活的内存映射,特别适用于大数据量的内存传输,能处理零散、非连续的数据块。
  • 性能优化:控制器在处理大量 SGL 描述符时可能会受到性能影响,因此需尽量减少无效描述符或超出限制的使用。
  • 内存对齐要求:控制器对 dword 对齐 的支持是关键,错误的内存对齐会导致命令失败。

如果你希望继续深入分析 SGL Segment 描述符的具体格式和应用,或者对 如何优化数据传输性能 有疑问,可以继续提问,我会为你详细解答。是否继续?