队列模型 - 📘 一、命令架构:提交与完成机制 (第116页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、命令架构:提交与完成机制 (第116页)

Blog Author

继续深入分析 NVM Express® Base Specification, revision 2.0b 第 105 页,本页主要讨论了 命令架构、提交与完成机制,包括 命令排序要求融合操作(Fused Operations)原子操作(Atomic Operations)


📘 一、命令架构:提交与完成机制

命令提交与控制器状态

  • 命令提交:命令仅在控制器准备好时提交,控制器的状态由 Controller Status 属性(CSTS.RDY)指示。
  • 在提交命令之前,必须确保相关的 I/O 提交队列(I/O Submission Queues)I/O 完成队列(I/O Completion Queues) 已经创建。

📘 二、命令排序要求

命令的独立性

  • 非融合操作:对于不属于融合操作的命令,它们将作为独立的实体进行处理,这些命令与提交到同一提交队列或其他提交队列的命令之间没有依赖关系。
  • 例子:如果提交了一个读取命令(Read)和一个写入命令(Write)到相同的逻辑块地址(LBA x),则控制器不会强制它们的完成顺序,可能是读取先完成,也可能是写入先完成。对于这些命令的顺序要求,必须由主机软件或应用程序在控制器之上进行管理。

命令排序要求的总结

  1. 独立处理:不需要控制器保证命令的执行顺序。
  2. 主机软件责任:如果命令之间有排序要求,必须由主机软件或应用程序进行管理。

📘 三、融合操作(Fused Operations)

融合操作概述

  • 定义:融合操作允许通过将两个简单的命令合并为一个更复杂的命令来提高性能或减少命令开销。此功能是可选的,是否支持此功能在 Identify Controller 数据结构的 FUSES 字段中进行指示。

融合操作的要求

  1. 顺序执行:这两个命令将作为一个原子操作顺序执行,控制器应将它们视为一个完整的操作,且在这两个命令之间不会有其他操作。
  2. 错误处理:如果第一个命令失败,则第二个命令会被中止;如果第二个命令失败,第一个命令的完成状态会受到影响。
  3. 队列顺序:融合命令必须被放置在同一个提交队列中。若第一个命令在队列的最后一个插槽,第二个命令将放置在队列的第一个插槽,作为队列环绕的一部分。在内存传输队列模型中,提交队列的 Tail doorbell 指针更新应表示两个命令。对于基于消息的传输队列模型,命令必须按顺序提交。
  4. 中止操作:要中止融合操作,主机需要为每个命令分别提交一个中止命令。
  5. 完成队列:控制器会为每个命令生成一个完成队列条目。

FUSE 字段的作用

  • 命令字节 0(Command Dword 0) 中,FUSE 字段用于指示命令是否是融合操作的一部分。该字段还指示每个命令在融合操作中的位置(第一个命令或第二个命令)。如果 FUSE 字段设置为非零值,并且控制器不支持请求的融合操作,则控制器应以 Invalid Field in Command 的状态码中止命令。

📘 四、原子操作(Atomic Operations)

原子操作概述

  • 原子操作的定义是命令集特定的。不同的 I/O 命令集可能会对原子操作有不同的定义和要求,具体的适用性和细节需要参考每个 I/O Command Set 规范。

🧠 总结与核心要点

要素 说明
命令排序要求 只有在特定的条件下(如主机软件需要保证顺序时),控制器才会遵循命令的排序要求;否则,命令是独立执行的。
融合操作 两个简单命令可以被融合为一个更复杂的原子操作,融合命令将按顺序执行并共享一个提交队列。失败时整个操作会中止。
FUSE 字段 FUSE 字段用于指示命令是否为融合操作的一部分,以及该命令在融合操作中的位置(第一或第二命令)。
原子操作 每个 I/O 命令集可能会对原子操作有不同的定义,具体的要求和细节要参考相应的命令集规范。

这些内容帮助我们理解命令在 提交、排序执行顺序 上的要求,并详细说明了 融合操作原子操作 如何优化命令处理和错误管理。

如果你有更具体的疑问或想深入了解某个命令的应用,随时告诉我!