NVM子系统与控制器架构 - 第41页
你现在阅读的是 NVM Express® Base Specification, revision 2.0b 第 3 章的起始部分,主题是:
🔧 NVM Controller Architecture(NVMe 控制器架构)
我们来深入、系统地用中文讲解和分析这部分内容,尤其是重点围绕:
- ✅ 控制器模型(Controller Model)的类型与差异
- ✅ 控制器与主机之间的绑定机制(Association)
- ✅ 动态与静态控制器模型的实际应用场景
🧱 控制器模型(Controller Model)
📌 控制器的定义:
控制器(Controller)是主机与 NVM 子系统之间进行命令交互的接口。
主机提交的命令通过控制器进入 NVM 子系统,完成如读写、管理等操作。一个 NVM Subsystem 可以包含一个或多个控制器。
🧠 控制器模型分类
根据规范,NVMe 控制器模型分为两类:
控制器模型 | 特点 | 应用场景 |
---|---|---|
静态控制器模型 (Static Controller Model) | 控制器是预先存在的,每个 Controller ID 在主机连接前就已确定。其状态(如 Feature 设置、命名空间绑定)在主机间可能不同。 | 所有基于内存的传输模型,如 PCIe |
动态控制器模型 (Dynamic Controller Model) | 控制器是按需动态分配的。分配时所有控制器对主机呈现一致的初始状态(如同一命名空间列表与功能设置)。之后的控制器变更不影响其他控制器。 | NVMe-oF Fabrics 架构,如 TCP、RDMA。Discovery Controller 必须支持 |
🔁 控制器模型对主机的影响:
事项 | 静态模型 | 动态模型 |
---|---|---|
Controller ID 是否固定 | 是 | 主机可请求任意空闲控制器(ID = FFFFh) |
状态是否保留 | 是(如 Feature、命名空间配置) | 否,每次建立连接后都是初始化状态 |
控制器是否预存在系统中 | 是 | 否,按需分配 |
适用于哪些传输类型 | PCIe | Fabrics(如 NVMe-TCP、RDMA) |
是否允许多个主机访问 | 否(一个控制器只能绑定一个主机) | 同样不允许共享控制器,但可通过多个动态控制器实现多主机支持 |
🔌 控制器与主机的关联(Association)
Association 是主机与控制器之间建立的连接关系:
- 建立 Association: 使用 Fabrics 的 Connect 命令,在其中指定:
Host NQN
(主机唯一名称)NVM Subsystem NQN
(目标子系统名称)Host Identifier
(主机标识)-
以及请求的
Controller ID
(或者用FFFFh
表示请求动态分配) -
一个控制器只能关联一个主机,处于关联状态时不可再次连接。
🧯 控制器关联的断开机制
虽然没有显式命令可以中断关联,但以下情形会导致自动断开:
情形 | 说明 |
---|---|
控制器被关闭(Shutdown) | 使用 Admin Command 停止控制器 |
Controller Level Reset | 控制器重置 |
管理或 I/O Queue 的 NVMe Transport 连接断开 | 例如网络中断 |
某个 I/O Queue 的连接断开,且不支持单独删除该队列 | 必须删除整个关联 |
若需主动移除某个 I/O Queue,可以使用 Disconnect Command
(第 6.4 节)。
🧠 动态模型的实用指令流程举例
主机使用 Connect 命令,指定 Controller ID = FFFFh
↓
NVM Subsystem 分配一个动态控制器并建立 Admin Queue
↓
主机提交 Create I/O Queue 命令建立 I/O 通道
↓
之后可正常读写命名空间(根据控制器初始化时附加的命名空间列表)
🔍 使用场景举例
🎯 场景 A:云存储中的多主机共享基础架构
- 主机 1 使用
Connect
命令获取动态控制器 A - 主机 2 同样使用
FFFFh
请求另一个控制器 B - 控制器 A 和 B 都是动态的,起始状态相同
- 它们可能通过共享命名空间实现数据访问一致性(需主机同步机制配合)
✅ 小结:控制器模型对比表
属性 | 静态控制器 | 动态控制器 |
---|---|---|
生命周期 | 永久存在 | 按需分配 |
控制器状态保留 | 是 | 否 |
初始状态是否一致 | 否 | 是 |
是否支持 PCIe | 是 | 否 |
是否支持 Fabrics | 支持但较少 | 是(推荐) |
是否继续分析 3.2 节 NVM Subsystem 结构与命名空间管理,或者转向 3.3 节队列机制的详细结构(SQ/CQ)?我可以继续配图+逐段讲解~