队列模型 - 📘 一、命令胶囊(Command Capsules) (第93页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、命令胶囊(Command Capsules) (第93页)

Blog Author

以下是对 NVM Express® Base Specification, revision 2.0b 第 82 页中关于 命令胶囊(Command Capsules)数据传输机制中文深入分析,帮助你理解 命令胶囊 的结构、数据传输方式以及与 NVMe Transport 协议的关系。


📘 一、命令胶囊(Command Capsules)

命令胶囊(Capsule) 是主机与控制器之间交换的基本信息单元。它可能包含以下内容:

  • 命令(例如 Admin 命令、I/O 命令、Fabrics 命令)
  • 响应(例如,命令执行后的结果)
  • SGL(Scatter-Gather List) 数据描述符
  • 数据(包括用户数据和与命令相关的数据结构)

1️⃣ 胶囊大小

  • Admin Queue 命令和响应的胶囊大小是固定的,且在 NVMe Transport 绑定规范中定义。
  • 控制器通过 Identify Controller 数据结构,指示主机在 I/O 命令中应使用的 胶囊命令和响应大小

2️⃣ SGL 基于的传输

  • 控制器应支持基于 SGL 的数据传输,这适用于 Admin Queue 和 I/O Queue 上的命令。
  • 数据可以通过胶囊内传输,也可以通过内存事务(基于底层的 NVMe Transport)进行传输。

3️⃣ 未使用的胶囊字段

  • 如果胶囊字段未使用或未被保留(例如,胶囊大小大于命令/响应及其数据),则该部分的值是 未定义的,接收方不应对其进行解释。

📘 二、命令胶囊的结构

命令胶囊用于将命令从主机发送到控制器,包含 提交队列条目(SQE),并且可能包含数据或 SGL(如果有)。

1️⃣ 提交队列条目(SQE)

  • 大小: 每个提交队列条目(SQE)的大小为 64 字节,它包含了要执行的 Admin 命令、I/O 命令或 Fabrics 命令。
  • 命令标识符: Command Identifier 字段在提交队列中的每个命令上是唯一的,用于标识与该队列相关的所有未完成命令。

2️⃣ 数据或 SGLs(如果存在)

  • 如果有数据或额外的 SGLs 需要传输,它们将包含在命令胶囊中,并通过 SGL 描述符指定合适的 偏移地址(Offset address)。
  • SGL 描述符中可能包含 数据块描述符(Data Block Descriptor)、段描述符(Segment Descriptor)或 最后段描述符(Last Segment Descriptor)。

3️⃣ Fabrics 命令胶囊

  • 对于 Fabrics 命令,提交队列条目的定义与 Admin 或 I/O 命令不同。在 Figure 80 中定义了 Fabrics 命令胶囊的具体结构。
  • Opcode(OPC) 字段被设置为 7Fh,以表示该命令为 Fabrics 命令

📘 三、命令胶囊的数据传输机制

1️⃣ 数据传输类型:

  • 内存传输(Memory-Based Transport):命令和响应可以通过直接内存访问进行传输,特别是在支持 SGL 的情况下。
  • 消息传输(Message-Based Transport):用于 Fabrics 命令 的传输,在主机和控制器之间通过 消息传输队列 进行交换。

2️⃣ 内存事务与 SGL:

  • SGL 描述符是用于描述内存中数据块或数据段的位置,主机和控制器通过 SGL 来管理较大数据集的传输。通过 SGL,数据可以分成多个片段进行传输,并通过 Offset 地址 确保各片段的正确顺序。

📘 四、协议限制和不定行为

1️⃣ 不定行为:

如果在主机提交到提交队列并在传输过程中修改命令胶囊的内容,结果将是未定义的行为。这意味着修改命令数据的行为是不允许的,且可能导致协议不一致或错误。

2️⃣ 流控:

虽然 NVMe 传输协议 并不强制提供端到端流控,但某些 NVMe 传输协议 可能会要求低级别的流控机制,用于避免拥塞和提高可靠性。这些流控机制超出了 NVM Express 规范 的范围。


🧠 五、总结要点

概念 说明
命令胶囊(Capsule) 在主机与控制器之间交换的基本信息单元,可以包含命令、响应、SGLs 和数据。
提交队列条目(SQE) 每个命令胶囊包含一个 64 字节的提交队列条目,标识命令,并可能包含数据或 SGLs。
数据传输机制(SGL) 控制器支持基于 SGL 的数据传输,数据可通过内存或胶囊内传输。
未定义行为 如果在命令提交后但在传输过程中修改命令胶囊,结果将是未定义行为。
Fabrics 命令胶囊 对于 Fabrics 命令,提交队列条目定义不同,Opcode 设置为 7Fh,表示该命令是 Fabrics 命令。
流控 虽然 NVMe 传输协议本身不强制流控,但某些特定的传输协议可能会在低级别提供流控机制以提高可靠性。

如果你希望进一步理解 Fabrics 命令胶囊 的结构,或者 SGL 描述符 在命令胶囊中的具体应用,或者有关 流控机制 的具体实现细节,请告诉我,我可以继续为你分析相关内容。