队列模型 - 📘 一、命令胶囊(Command Capsules) (第93页)
以下是对 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 描述符 在命令胶囊中的具体应用,或者有关 流控机制 的具体实现细节,请告诉我,我可以继续为你分析相关内容。