附录与参考资料 - 第441页
我们现在进入 NVMe 2.0b 规范第 8.26 节 - Virtualization Enhancements(虚拟化增强),这是该规范中非常关键、但也偏进阶的部分,适用于构建支持多控制器虚拟化环境(如 SR-IOV 或嵌入式虚拟主机环境)的系统。
📘 中文深入分析与学习指导:虚拟化增强 Virtualization Enhancements(第 8.26 节)
🎯 核心目的:
NVMe 子系统支持多个控制器,以服务多个虚拟或物理主机,每个主机通过一个控制器获得直接 I/O 访问。虚拟化增强机制允许在主控制器(Primary)与从控制器(Secondary)之间动态分配资源。
🧩 控制器的两类角色
| 类型 | 描述 |
|---|---|
| 主控制器(Primary Controller) | 支持虚拟化管理指令,拥有资源分配权限,可向从控制器分配资源 |
| 从控制器(Secondary Controller) | 不能主动管理资源,仅在离线状态下接受主控制器分配的资源 |
📦 支持的虚拟资源类型(Controller Resource Types)
- Virtual Queue Resource(VQ)
- 管理一个 Submission Queue + Completion Queue
-
详见 §8.26.1
-
Virtual Interrupt Resource(VI)
- 管理一个中断向量
- 详见 §8.26.2
🧠 资源类型分类:Private vs Flexible
| 类型 | 描述 |
|---|---|
| Private Resources(私有资源) | 永久性分配,不支持动态分配,不支持 Virtualization Management |
| Flexible Resources(灵活资源) | 可通过主控制器动态分配给从控制器,支持 Virtualization Management 指令 |
✅ 主控制器:可以同时拥有 Private 和 Flexible 资源,但 Private 的编号一定从 0 开始并连续分布。 ✅ 从控制器:要么全是 Flexible,要么全是 Private,不能混合使用。 📏 所有资源 ID(如队列 ID 或中断向量 ID)在分配时必须连续,从 0 开始,不能有间隙。
📘 控制器资源分配模型(以图 478 为例)
让我们用文字模拟图 478 的模型逻辑:
资源类型:Virtual Interrupt Resource (VI)
资源总量:16 个
系统结构:
| 控制器 | 类型 | 资源 ID 范围 | 是否可动态分配 |
|--------|----------|----------------|----------------|
| 主控制器 | Private | 0 - 3 | ❌ 不可变更 |
| 主控制器 | Flexible| 4 - 11 | ✅ 可重新分配 |
| 从控制器A | Flexible| 0 - 1 | ✅ 可重新分配 |
| 从控制器B | Flexible| 0 - 1 | ✅ 可重新分配 |
- 资源由主控制器使用 Virtualization Management 命令 来分配或回收。
- 资源变更必须在 Controller Level Reset(控制器级重置)之后生效,但不包括 CC.EN 置 0 的软重置。
- 从控制器必须处于 Offline 状态才允许修改其资源分配。
🧪 主机如何发现从控制器?
主机可以向主控制器发送 Identify 命令,选择 Secondary Controller List,获取与该主控制器关联的所有从控制器。
🔁 操作总结:
✅ 分配资源:
- 由主控制器使用 Virtualization Management 命令执行。
- 只能操作 Flexible Resource。
- 从控制器必须 Offline。
✅ 修改资源配置:
- 生效时间点:必须经历 Controller Level Reset(非软件 EN 清零)。
❌ 不支持的行为:
- 主机不能直接通过从控制器进行资源配置。
- 从控制器不能在 Online 状态变更资源。
- 资源 ID 不允许出现“洞”(必须从 0 起连续编号)。
📎 实际用途示例(适用于哪些场景)?
| 场景 | 说明 |
|---|---|
| SR-IOV 虚拟化 | 每个虚拟函数作为一个 Secondary Controller,分配专属队列和中断资源 |
| 多主机共享 SSD | 类似云服务器共享 NVMe 盘,控制器 A/B/C 分别服务不同 VM |
| 虚拟主控芯片管理 | 嵌入式系统中,主芯片管理资源,从芯片仅响应指令 |
🧭 下一步推荐阅读:
- §8.26.1 — Virtual Queue Resource(详细定义 VQ 资源的结构与管理方式)
- §8.26.2 — Virtual Interrupt Resource
- §5.28 — Virtualization Management 命令格式
- §3.2.4 — Domain 结构与 Reset 行为对 Virtualization 的影响
如果你有打算开发多控制器支持的 NVMe 子系统,或做 SR-IOV 虚拟化驱动支持,这一节就是核心指导。
需要我下一步继续深入讲解 Virtualization Management 命令格式(5.28 节) 吗?还是我们先看看 VQ / VI 的结构定义?