控制器寄存器 - 📘 一、NVM Queue 模型概述 (第90页)
NVME2.0协议解读 1 min read

控制器寄存器 - 📘 一、NVM Queue 模型概述 (第90页)

Blog Author

以下是对 NVM Express® Base Specification, revision 2.0b 第 79 页中关于 NVM Queue 模型内存传输队列模型(Memory-based Transport Queue Model) 的中文深入分析与讲解,帮助你理解队列的创建、初始化、使用和删除等机制。


📘 一、NVM Queue 模型概述

NVM Express 接口使用 成对的提交队列(Submission Queue)完成队列(Completion Queue) 机制进行命令管理:

  • 提交队列(Submission Queue): 主机软件将命令放入提交队列中,控制器从队列中获取命令并执行。
  • 完成队列(Completion Queue): 控制器执行命令后,将完成信息放入关联的完成队列中,主机软件从队列中获取这些完成信息。

🚀 队列的传输模型:

  1. 内存传输队列模型(Memory-based Transport Queue Model):
  2. 多个提交队列可以共享一个完成队列。

  3. 消息传输队列模型(Message-based Transport Queue Model):

  4. 每个提交队列都有一个独立的完成队列。

📚 二、内存传输队列模型的创建与初始化

1️⃣ 队列的初始化步骤:

主机软件在设置和初始化 I/O 提交队列I/O 完成队列 时,需按照以下步骤进行:

  1. 配置管理队列:
  2. 初始化 Admin Queue 属性(AQA)Admin 提交队列基地址(ASQ)Admin 完成队列基地址(ACQ)

  3. 配置 I/O 队列的大小:

  4. 设置 I/O 提交队列的大小(CC.IOSQES)和 I/O 完成队列的大小(CC.IOCQES)。

  5. 提交设置命令:

  6. 使用 Set Features 命令,设置所需的提交队列和完成队列数量。
  7. 命令完成后,完成队列条目将指示控制器分配的提交队列和完成队列数量。

  8. 确定最大队列条目数量:

  9. 根据 CAP.MQES 获取控制器支持的最大条目数,并检查队列是否需要物理连续(CAP.CQR)。

  10. 创建 I/O 完成队列:

  11. 在控制器分配的队列数量和支持的队列属性限制下,使用 Create I/O Completion Queue 命令创建 I/O 完成队列。

  12. 创建 I/O 提交队列:

  13. 根据控制器分配的队列数量和支持的属性,使用 Create I/O Submission Queue 命令创建 I/O 提交队列。

在完成上述步骤后,I/O 提交队列和完成队列就已创建并初始化,可以用于处理 I/O 命令。


🛠️ 三、内存传输队列的使用

2️⃣ 提交队列的使用:

主机提交命令时,提交队列 使用 尾指针(Tail pointer) 来标识下一个可用队列槽:

  • 提交者每次放入命令后,递增 尾指针
  • 如果 尾指针递增超出队列大小,则尾指针会回绕到队列的开始处(Tail 指针回绕)。
  • 提交者可以继续向空闲队列槽中添加命令,只要队列没有满。

注意: 提交者需要考虑队列的回绕条件,以确保不会覆盖未处理的命令。

3️⃣ 完成队列的使用:

控制器完成命令时,完成队列 使用 头指针(Head pointer) 来标识下一个可消费的队列槽:

  • 消费者每次从队列中消费一个完成条目后,递增 头指针
  • 如果 头指针递增超出队列大小,则头指针会回绕到队列的开始处(Head 指针回绕)。
  • 消费者可以继续从队列中消费条目,只要队列没有空。

注意: 消费者也需要考虑队列的回绕条件,以确保不会漏掉完成信息。


🔄 四、队列的创建与删除顺序要求

  1. 创建队列顺序:
  2. 主机软件在创建提交队列时,必须先创建 完成队列
  3. 提交队列可以在完成队列创建后任何时间创建。

  4. 删除队列顺序:

  5. 主机软件必须先删除 所有相关的提交队列,再删除 完成队列

  6. 撤销所有命令:

  7. 若需要撤销所有提交到提交队列的命令,主机软件应使用 Delete I/O Submission Queue 命令。

🧠 五、总结与关键点

概念 说明
内存传输队列模型 提交队列和完成队列基于内存传输,多个提交队列可共享一个完成队列。
队列初始化步骤 包括配置队列大小、提交 Set Features 命令、创建提交和完成队列。
队列指针管理 提交者和消费者分别管理尾指针和头指针,处理队列的回绕问题。
创建与删除顺序要求 完成队列需在提交队列之前创建,且删除时提交队列必须先于完成队列删除。
撤销命令 使用 Delete I/O Submission Queue 命令撤销提交队列中的所有命令。

如果你希望进一步深入了解如何配置具体的 Set Features 命令、Create I/O Completion QueueCreate I/O Submission Queue 命令的具体格式与字段,或者如何处理队列回绕条件,我可以继续为你解析。你是否希望继续深入某一部分内容?