NVMe架构与操作理论 - 第28页
你阅读的是 NVMe Base Specification 2.0b 第 2.1 节:Memory-Based Transport Model(基于内存的传输模型) 的起始部分。
这一节围绕两个重点展开讲解:
✅ 一、三种命令集在不同 Queue 上的使用规范
📌 Admin Command Set
- 用途:控制器管理(创建 I/O Queue、识别设备、设置特性等)
- 发送位置:只能通过 Admin Submission Queue
- 包括命令:
Identify
,Set Features
,Create I/O Submission Queue
,Delete I/O Queue
,Abort
, 等
📌 I/O Command Set
- 用途:用于具体的数据操作,如读写、顺序写(ZNS)、键值存取(KV)等
- 发送位置:I/O Submission Queue
- 子集:
- 标准 NVM Command Set(Read/Write)
- Zoned Namespace Command Set(ZNS)
- Key Value Command Set(KV)
📌 Fabrics Command Set
- 用于 NVMe over Fabrics(远程访问)
- 可被发送到:
- Admin Submission Queue ✅
- I/O Submission Queue (仅部分 Fabric 命令)
- 特点:
- 即使控制器未启用(
CC.EN = 0
),仍可处理 Fabrics 命令 - 用于 建立连接、认证、属性设置(Property Get/Set)
✅ 二、基于内存的队列模型介绍(Memory-Based Transport)
➤ 本质机制:使用共享内存中的 Submission 和 Completion Queue 实现命令传递
- 所有命令和响应通过 host/controller 共享的 DRAM 区域传输
- 只有 Doorbell 是 MMIO 寄存器(用于“敲门”通知控制器)
➤ 队列结构回顾:
- Submission Queue(SQ):主机将命令写入此处
- Completion Queue(CQ):控制器将完成信息写入此处
- 每对 SQ 和 CQ 称为一个 Queue Pair(QP)
➤ Admin Queue 是固定结构:
Queue 类型 | Queue ID | 特殊说明 |
---|---|---|
Admin Submission Queue | 0 | 管理命令专用 |
Admin Completion Queue | 0 | 仅接收 Admin 命令响应 |
I/O Queue | 1 ~ 65,535 | 主机可根据核心并发灵活配置 |
✅ 三、Figure 6 图解:Queue Pair 一对一映射(1:1)
Core 0 → I/O SQ1 <--> CQ1 → Controller
Core 1 → I/O SQ2 <--> CQ2 → Controller
Core N-1 → I/O SQN <--> CQN → Controller
→ Admin SQ0 <--> CQ0 → Controller Mgmt
✨ 场景说明:
- 在一个多核系统中,每个核心维护自己的 I/O 队列对(避免锁竞争)
- Admin Queue 固定一对(队列 ID 为 0)
- 每个 I/O SQ 与 CQ 成对绑定(此图为典型 1:1 绑定结构)
📘 优点: - 数据本地性强(cache hit 高) - 不同核心可以并发提交/完成命令而互不干扰
✅ 四、后续内容预告:Figure 7
- 展示 n:1 的映射结构:多个 SQ 共享同一个 CQ
- 常用于:
- 节省 CQ 空间
- 将多个 SQ 的响应归入一个核处理
✅ 关键术语速查表
术语 | 中文解释 | 作用 |
---|---|---|
Admin SQ / CQ | 管理命令队列 | 控制器初始化/识别配置命令 |
I/O SQ / CQ | 数据命令队列 | 读写等操作命令 |
Queue Pair | 一组绑定的 SQ 与 CQ | 命令投递与完成响应机制 |
Doorbell | 命令通知机制 | 主机敲门告诉控制器“我写好了” |
CC.EN | 控制器启用位 | 为 0 时只有 Fabric 命令可执行 |
Capsule | 封装命令的消息单元 | NVMe-oF 中用得多 |
✅ 小结与建议
你目前已经掌握:
- 三类命令集的使用机制及限制
- Memory-Based Transport 中的 SQ/CQ 结构
- 多核系统下如何高效构建 Queue Pair(1:1 绑定)
🔍 建议下一步深入阅读:
节 | 内容 | 理由 |
---|---|---|
§2.2 | 消息模型的队列实现(Capsule、In-Capsule Data) | 对比消息传输和内存传输机制 |
§3.4.4 | Arbitration 机制 | 多队列如何调度顺序 |
§4.2 | Command Capsule 的结构 | 理解 64B 命令结构及其投递方式 |
§5.2 | Create I/O Submission Queue 命令 | 如何实际创建这些队列 |
§5.27 | Set Features(例如 Arbitration、Queue Depth) | 实际配置 Queue 行为和优先级 |
如果你需要,我可以:
- 为你画出图 6 和图 7 的完整示意图;
- 演示一个典型系统中如何动态创建多个 Queue;
- 展示一个完整的 I/O 提交过程(从 SQ 投递到 CQ 返回)流程图。
你想继续看图 7 的 Queue 多对一结构,还是进入命令结构与 Doorbell 实战流程?我可以立即带你深入。