命名空间管理 - 🔧 第一部分:主机发起 NVM 子系统重置的能力(写 NSSR.NSSRC) (第130页)
下面是对 《NVM Express® Base Specification, revision 2.0b》第119页 关于 NVM 子系统重置能力、控制器级重置、队列级重置 的详细中文解析与教学讲解。
🔧 第一部分:主机发起 NVM 子系统重置的能力(写 NSSR.NSSRC)
- 主机是否可以通过写
NSSR.NSSRC字段来主动发起 NVM Subsystem Reset,取决于控制器的能力。 - 该能力通过
CAP.NSSRS字段 指示。
🧠 重点理解:
有些控制器出于安全或稳定性考虑,可能不允许主机写入 NSSR.NSSRC 来触发子系统重置,以防止误操作影响整个子系统或域。
🌀 第二部分:控制器级重置(Controller Level Reset)
✅ 三种触发方式:
| 方式 | 说明 |
|---|---|
| 1. NVM 子系统重置 | 子系统重置将对所有控制器触发控制器级重置。 |
| 2. 控制器重置 | 当主机将 CC.EN 从 1 → 0,直接触发控制器重置。 |
| 3. 传输特定重置 | 各 NVMe Transport 协议(如 PCIe、Fabrics)可能定义自己的控制器重置机制。 |
✅ 重置后控制器的行为:
- 停止处理所有未完成的 Admin 和 I/O 命令;
- 删除所有 I/O Submission Queues;
- 删除所有 I/O Completion Queues;
- 进入空闲状态(Idle),并将
CSTS.RDY清零为0; - 重置控制器属性与内部状态(见 §3.1.3),但有一些例外:
🚫 例外情况(仅限 memory-based transport):
| 属性 | 是否在 Controller Reset 中重置 | 说明 |
|---|---|---|
| AQA, ASQ, ACQ | 否 | Admin 队列设置不会被清除 |
| CMBMSC | 否 | Controller Memory Buffer 管理不受 Controller Reset 或 Function Level Reset 影响 |
| PMRMSCU, PMRMSCL | 否 | PMR 内存空间控制寄存器在 Controller Reset 中不被清除 |
⚠️ 注意:message-based transport(如 Fabrics)下 无任何例外,所有属性都被重置。
🧠 补充说明:
- 除了“CC.EN=0”的控制器重置之外,其他 Controller Level Reset 类型都会立即断开主机通信。
- 一旦通信中断,控制器将无法通知命令被中止,也无法向完成队列更新条目。
✅ 重置后的主机处理流程:
| 步骤 | 操作 |
|---|---|
| 1 | 更新传输协议相关状态与控制器寄存器 |
| 2 | 设置 CC.EN = 1 启用控制器 |
| 3 | 等待 CSTS.RDY = 1 |
| 4 | 使用 Admin 命令配置控制器(如 Identify、Set Features 等) |
| 5 | 创建 I/O Completion Queues 和 Submission Queues |
| 6 | 开始正常的 I/O 操作流程 |
🔁 第三部分:队列级重置(Queue Level Reset)
✅ 定义:
队列级重置是指主机可以选择性地重置某一个或多个 I/O Submission Queue 或 I/O Completion Queue,而无需重置整个控制器。
✅ 操作步骤(基于 memory-based transport,如 PCIe):
- 使用 Delete I/O Submission Queue 或 Delete I/O Completion Queue 命令删除目标队列;
- 等待删除命令成功完成(也意味着挂起命令被处理或中止);
- 使用 Create I/O Submission Queue 或 Create I/O Completion Queue 命令重建队列;
- 在此过程中,主机可以根据需要修改队列属性(如大小、中断映射等)。
📘 小结与教学重点:
| 类别 | 重点说明 |
|---|---|
| 主机发起子系统重置 | 是否可写 NSSR.NSSRC 取决于 CAP.NSSRS |
| 控制器级重置行为 | 删除所有 I/O 队列,进入空闲态,清除属性(memory-based 有例外) |
| 与主机通信影响 | 除了 CC.EN=0 的 reset,其他 reset 都会中断通信,无法更新完成队列 |
| 队列级重置 | 可独立重置特定 I/O 队列,适用于动态资源管理或错误恢复 |
如果你希望我继续带你解析后续的 Function Level Reset(FLR)、Namespace-level operations 或是 Memory Buffer 管理(如 CMB/PMR),我可以一步步系统性地展开。是否继续?