队列模型 - 📘 一、命令胶囊中数据和 SGL 的位置(Figure 83) (第96页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、命令胶囊中数据和 SGL 的位置(Figure 83) (第96页)

Blog Author

下面是对 NVM Express® Base Specification, revision 2.0b 第 85 页内容的深入中文分析,重点讨论 命令胶囊中的数据和 SGL 位置(Figure 83)及 数据传输示例(Figure 84)中的 SGL 示例与内存事务,帮助你全面理解数据传输的实现和 SGL 的使用。


📘 一、命令胶囊中数据和 SGL 的位置(Figure 83)

在命令胶囊中,数据和 SGL(Scatter-Gather List)的布局是非常重要的,它们需要遵循特定的格式和规则。以下是 数据SGL 的具体位置布局:

📦 命令胶囊的结构(含 SQE 和 SGL)

命令胶囊的内容

  • 提交队列条目(SQE):位于胶囊的开头,占用 64 字节。
  • SGL 描述符:如果存在额外的 SGL 描述符,它们将紧跟在 SQE 后面,并且是连续的
  • 数据部分:如果有数据需要传输,它将从指定的 ICDOFF 偏移位置开始。ICDOFF 是控制器在 Identify Controller 数据结构中报告的字段,指示数据在命令胶囊中的起始位置。

🧑‍💻 命令胶囊结构示意:

字节偏移 内容
0-63 提交队列条目(SQE)
64-127 可选的 SGL 描述符(如果存在)
128+ 数据(如果存在)

ICDOFF 的作用:

  • 数据在胶囊中的位置从 (ICDOFF * 16) + 64 字节开始。
  • 这里的 ICDOFF 值由控制器提供,指示数据应该从胶囊内的哪个偏移位置开始。

例如: 如果 ICDOFF = 8,那么数据将从 128 字节 开始。


📘 二、数据传输示例(Figure 84)

📑 数据传输方式:内存事务

在此例中,数据通过 内存事务 进行传输,适用于 写操作。具体步骤如下:

  1. 数据描述
  2. 数据块 A 是一个 8KiB 的数据块,准备传输。
  3. 通过 Keyed SGL Data Block 描述符 指定将该数据块通过内存传输进行传输。

  4. SGL 描述符

  5. SGL 描述符存储了数据块 A 的内存地址。
  6. 描述符中还包含一个 Key 字段(例如,Tag A),用于标识该数据块的唯一性和安全性。

🚀 SGL 描述符工作流程:

  • SGL 描述符的作用:它指定数据块的内存位置及数据块的大小,并通过内存传输进行数据传输。
  • Keyed SGL:此描述符类型使用一个密钥(Key)来确保数据块的正确性和唯一性。

图解数据传输示例:

[Host DRAM]               [Data Block A]
+------------------+      +----------------------+
| SGL Descriptor   | ---> | Address = Data Block A|
| Length = 8KiB    |      | Length = 8KiB         |
| Key = Tag A      |      +----------------------+
| SGL Identifier = 40h|    [Memory Transfer]
+------------------+
  • SGL 描述符 提供了对 Data Block A 的引用(地址、长度、Key),并通过内存事务将其从主机内存传输到控制器。

📘 三、SGL 描述符的限制与错误处理

🛑 SGL 描述符的约束:

  • 如果 SGL 描述符 中的 偏移量(Offset) 无效,控制器将返回 SGL Offset Invalid 状态码,表示数据传输请求无效。
  • SGL 描述符的数量限制:主机在命令胶囊中不能放置超过控制器允许的最大 SGL 数据块描述符 数量。

⚠️ 控制器的错误处理:

  • 如果 SGL 描述符数量超过最大限制,控制器会以 Invalid Number of SGL Descriptors 错误中止命令。

🧠 四、总结与关键点

概念 说明
命令胶囊结构 命令胶囊包含 SQE(提交队列条目) + 可选的 SGL 描述符 + 数据。
ICDOFF 偏移 数据在命令胶囊中的起始位置由控制器提供的 ICDOFF 决定,单位为 16 字节。
SGL 描述符 用于指示数据在内存中的位置,可通过内存事务传输数据或通过胶囊内部传输数据。
Keyed SGL SGL 描述符可以携带密钥(Key)信息,确保数据块的唯一性和安全性。
SGL 数量限制 控制器规定最大 SGL 描述符数量,超出限制时会返回 Invalid Number of SGL Descriptors 错误。
偏移量错误处理 如果偏移量无效,控制器会返回 SGL Offset Invalid 错误。

如果你希望进一步深入了解:

  • SGL 描述符类型和子类型(参考 §4.1.2)
  • SGL 描述符与数据块的内存布局(如如何在不同的 NVMe Transport 上工作)
  • 数据传输的内存模型:胶囊内数据与内存事务的区别与应用

请告诉我,我可以继续帮助你分析相关部分。你想继续深入哪一部分?