控制器寄存器 - 📘 一、NVM Queue 模型概述 (第90页)
以下是对 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): 控制器执行命令后,将完成信息放入关联的完成队列中,主机软件从队列中获取这些完成信息。
🚀 队列的传输模型:
- 内存传输队列模型(Memory-based Transport Queue Model):
-
多个提交队列可以共享一个完成队列。
-
消息传输队列模型(Message-based Transport Queue Model):
- 每个提交队列都有一个独立的完成队列。
📚 二、内存传输队列模型的创建与初始化
1️⃣ 队列的初始化步骤:
主机软件在设置和初始化 I/O 提交队列 和 I/O 完成队列 时,需按照以下步骤进行:
- 配置管理队列:
-
初始化 Admin Queue 属性(AQA)、Admin 提交队列基地址(ASQ) 和 Admin 完成队列基地址(ACQ)。
-
配置 I/O 队列的大小:
-
设置 I/O 提交队列的大小(
CC.IOSQES)和 I/O 完成队列的大小(CC.IOCQES)。 -
提交设置命令:
- 使用 Set Features 命令,设置所需的提交队列和完成队列数量。
-
命令完成后,完成队列条目将指示控制器分配的提交队列和完成队列数量。
-
确定最大队列条目数量:
-
根据 CAP.MQES 获取控制器支持的最大条目数,并检查队列是否需要物理连续(
CAP.CQR)。 -
创建 I/O 完成队列:
-
在控制器分配的队列数量和支持的队列属性限制下,使用 Create I/O Completion Queue 命令创建 I/O 完成队列。
-
创建 I/O 提交队列:
- 根据控制器分配的队列数量和支持的属性,使用 Create I/O Submission Queue 命令创建 I/O 提交队列。
在完成上述步骤后,I/O 提交队列和完成队列就已创建并初始化,可以用于处理 I/O 命令。
🛠️ 三、内存传输队列的使用
2️⃣ 提交队列的使用:
主机提交命令时,提交队列 使用 尾指针(Tail pointer) 来标识下一个可用队列槽:
- 提交者每次放入命令后,递增 尾指针。
- 如果 尾指针递增超出队列大小,则尾指针会回绕到队列的开始处(
Tail指针回绕)。 - 提交者可以继续向空闲队列槽中添加命令,只要队列没有满。
注意: 提交者需要考虑队列的回绕条件,以确保不会覆盖未处理的命令。
3️⃣ 完成队列的使用:
控制器完成命令时,完成队列 使用 头指针(Head pointer) 来标识下一个可消费的队列槽:
- 消费者每次从队列中消费一个完成条目后,递增 头指针。
- 如果 头指针递增超出队列大小,则头指针会回绕到队列的开始处(
Head指针回绕)。 - 消费者可以继续从队列中消费条目,只要队列没有空。
注意: 消费者也需要考虑队列的回绕条件,以确保不会漏掉完成信息。
🔄 四、队列的创建与删除顺序要求
- 创建队列顺序:
- 主机软件在创建提交队列时,必须先创建 完成队列。
-
提交队列可以在完成队列创建后任何时间创建。
-
删除队列顺序:
-
主机软件必须先删除 所有相关的提交队列,再删除 完成队列。
-
撤销所有命令:
- 若需要撤销所有提交到提交队列的命令,主机软件应使用 Delete I/O Submission Queue 命令。
🧠 五、总结与关键点
| 概念 | 说明 |
|---|---|
| 内存传输队列模型 | 提交队列和完成队列基于内存传输,多个提交队列可共享一个完成队列。 |
| 队列初始化步骤 | 包括配置队列大小、提交 Set Features 命令、创建提交和完成队列。 |
| 队列指针管理 | 提交者和消费者分别管理尾指针和头指针,处理队列的回绕问题。 |
| 创建与删除顺序要求 | 完成队列需在提交队列之前创建,且删除时提交队列必须先于完成队列删除。 |
| 撤销命令 | 使用 Delete I/O Submission Queue 命令撤销提交队列中的所有命令。 |
如果你希望进一步深入了解如何配置具体的 Set Features 命令、Create I/O Completion Queue 和 Create I/O Submission Queue 命令的具体格式与字段,或者如何处理队列回绕条件,我可以继续为你解析。你是否希望继续深入某一部分内容?