附录与参考资料 - 第443页
继续我们对 NVMe Base Specification Revision 2.0b 第 8.26 节的深入分析,本节页码为 第 432 页,重点内容包括两个虚拟资源类型的定义和机制:
🧩 本节结构概览
- ✅ 控制器及其资源支持能力要求
- ✅ Virtual Queue Resource (VQ 资源) 定义
- ✅ Virtual Interrupt Resource (VI 资源) 定义
- ✅ SR-IOV 与虚拟化增强功能的协同
一、控制器对虚拟化增强的支持要求
若 NVMe 子系统支持 Virtualization Enhancements,则必须具备以下条件:
🧷 主控制器必须支持:
- 至少 两个 Private 队列对资源(Admin + 一个 I/O);
Identify Controller数据结构中 OACS 字段 设置表明支持 Virtualization Management 命令;- 实现并支持 Virtualization Management 命令;
- 支持 CNS=14h 的 Primary Controller Capabilities Structure(图 281);
- 支持 CNS=15h 的 Secondary Controller List(图 282);
- 支持 Namespace Management 能力(§8.11);
🧷 子控制器要求:
- 至少有一个;
- 其资源只能由唯一的主控制器分配;
- 每类 Flexible Resource 只能属于一个控制器,不得共享。
二、🌀 Virtual Queue Resource(虚拟队列资源)解析
✅ 定义:
- 一个 VQ 资源 = 一个 Submission Queue(SQ)+ 一个 Completion Queue(CQ);
- 分配给控制器的 VQ 资源,其 资源标识符即队列标识符(Queue ID)。
🧾 功能说明:
| 功能项 | 描述 |
|---|---|
| 是否支持 VQ 资源 | 由 Primary Controller Capabilities Structure 中 Controller Resource Types 字段指示 |
| 若不支持 | 所有队列资源均为 Private 类型(静态分配) |
| 支持后 | 可用 Virtualization Management 命令分配给 Secondary Controller |
📘 查询资源分配方式:
- 使用
Identify(CNS=15h)读 Secondary Controller List; - 或使用
Get Features - Number of Queues (FID=07h)。
⚠️ 在线前置条件:
- 若 未分配任何 VQ 资源,Secondary Controller 不能从 Offline 进入 Online;
- 必须分配至少两个队列对(Admin + I/O)后,方可 Online。
🧷 主控制器额外约束:
| 条件 | 原因 |
|---|---|
| 至少保留两个 Private 队列对 | 保证主控在任何时刻都能完成最基本的管理与 I/O |
📍 主控动态分配自身的 VQ:
- 使用
Virtualization Management中 Primary Controller Flexible Allocation 动作; - 配置生效需 Controller Level Reset;
- 分配状态可通过
Identify(CNS=14h)或Get Features(FID=07h)查询。
三、🔔 Virtual Interrupt Resource(虚拟中断资源)解析
✅ 定义:
- 一个 VI 资源 = 一个中断向量(如 MSI-X 向量);
- 分配后其 资源标识符 = 中断向量编号。
📘 功能说明:
| 功能项 | 描述 |
|---|---|
| 是否支持 VI 资源 | 由 Controller Resource Types 字段指示 |
| 若不支持 | 主从控制器的中断均为 Private 类型 |
四、SR-IOV 与 Virtualization Enhancements 的关系
若子系统同时支持:
- SR-IOV(Single Root I/O Virtualization)
- Virtualization Enhancements
则有如下强制规定:
| 控制器类型 | 角色 |
|---|---|
| SR-IOV PF(物理功能) | 必须为 Primary Controller |
| SR-IOV VF(虚拟功能) | 必须为 Secondary Controller,隶属于对应 PF |
🧠 知识巩固小结:
| 类型 | 定义 | 标识符 | 分配方式 |
|---|---|---|---|
| VQ(虚拟队列) | 管理一对 CQ/SQ | Queue ID | 动态分配 |
| VI(虚拟中断) | 管理一个中断向量 | Interrupt Vector | 动态分配 |
| Primary Controller | 分配资源、状态管理、执行特权命令 | - | 支持 Identify CNS=14h |
| Secondary Controller | 被分配资源后才能上线 | - | 状态切换需 Offline 后配置 |
🔎 下一节建议深入:8.26.3 控制器 Online / Offline 状态机制
这部分将具体解释控制器状态切换时的流程、条件和命令使用方式。如果你准备好了,我可以继续帮你精讲这一小节。是否继续?