NVM子系统与控制器架构 - 第42页
NVME2.0协议解读 1 min read

NVM子系统与控制器架构 - 第42页

Blog Author

你现在阅读的是 NVMe Base Specification 2.0b第 3.1 节:NVM 控制器架构(NVM Controller Architecture) 的进一步内容,我们来继续逐句中文解析与深入教学讲解


🧩 控制器持久性与动态释放机制(Static Controller Resource Management)

📌 原文:

While allocation of static controllers to hosts are expected to be durable ... the NVM subsystem may remove the host allocation ... for implementation specific reasons ...

✅ 中文解析:

虽然静态控制器分配给某个主机后,默认应具有持久性(如主机重启后还能继续使用同一个控制器),但:

  • NVM 子系统 仍然可以 在控制器未被使用的情况下,回收分配,出于以下原因:
  • 实现内部资源管理策略
  • 子系统重新配置(比如热插拔、更换介质等)

📌 注意:静态并不代表“绝对持久”,只是“默认持续”,具体可变。


🧠 三种控制器类型(Controller Types)

图 20 中展示了 NVMe 架构定义的三种控制器类型:

控制器类型 简介 是否支持 I/O 命令 使用场景
I/O 控制器 (I/O Controller) 可访问用户数据 ✅ 是 最常见,如 SSD 控制器
管理控制器 (Administrative Controller) 只用于管理,不访问用户数据 ❌ 否 数据中心虚拟化中的远程控制器
发现控制器 (Discovery Controller) 仅用于提供发现服务 ❌ 否 Fabrics 场景中用于连接信息发现

对应字段为:Identify Controller 数据结构中的 CNTRLTYPE 字段


📤 控制器基本行为总结(命令提交与处理流程)

无论是哪种控制器,都必须支持一个 Admin SQ/CQ 对队列对。若是 I/O 控制器,还要支持多个 I/O 队列对。

🚀 PCIe 模式下的交互流程如下:

  1. 主机写入 Submission Queue(SQ) 提交命令(64 字节固定长度)
  2. 写 Doorbell 寄存器 通知控制器 Tail 指针前移,代表有新命令(可一次提交多个)
  3. 控制器从 SQ 中取命令并执行,支持乱序处理(除了 fused operations)
  4. 命令完成后写入 Completion Queue(CQ),标记命令执行结果
  5. 通知主机(通过中断或轮询),主机读取 CQ,解析完成状态

📌 关于命令处理的几个关键点:

特性 说明
🚫 处理无顺序限制 除 Fused 操作外,命令可以乱序处理
📋 写入顺序非提交顺序 数据可能以不同于命令提交顺序的方式写入存储介质
🧾 优先级由 Submission Queue 决定 即 SQ 的创建时指定优先级
🧠 主机需提前创建 I/O 队列对 使用 Admin Commands:Create I/O Submission QueueCreate I/O Completion Queue

🎯 应用场景举例

▶️ 情境 A:一个典型的 NVMe SSD 控制器(I/O Controller)

  • 用于实际数据存取
  • 创建多个 SQ/CQ,按核心/线程分别分配,提升并行性能
  • 主机通过 PRP 或 SGL 提供数据缓冲区

▶️ 情境 B:一个 NVMe-oF 中的 Discovery Controller

  • 用于设备发现,不访问数据
  • 支持 动态控制器模型
  • 一般在集群启动阶段使用,连接完成后即可释放

✅ 小结

要素 内容
控制器模型 静态 vs 动态,分别适用于 PCIe 和 Fabrics
控制器类型 I/O、Admin、Discovery 三类,功能侧重点不同
命令处理机制 SQ 提交 → Doorbell 通知 → CQ 返回结果
命令顺序与优先级 默认支持乱序,优先级与 SQ 绑定
主机职责 创建/配置队列,合理分配命名空间,解析完成状态

接下来是否继续进入:

  • 📚 3.2 节:NVM Subsystem 架构(Domains、Endurance Groups、Namespaces 等)
  • ⚙️ 或 3.3 节:队列机制与门铃寄存器详解

我可以继续带你一步步深入 + 中文讲解 + 实战类比 😎