命名空间管理 - 🔧 第一部分:主机发起 NVM 子系统重置的能力(写 NSSR.NSSRC) (第130页)
NVME2.0协议解读 1 min read

命名空间管理 - 🔧 第一部分:主机发起 NVM 子系统重置的能力(写 NSSR.NSSRC) (第130页)

Blog Author

下面是对 《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.EN1 → 0,直接触发控制器重置。
3. 传输特定重置 各 NVMe Transport 协议(如 PCIe、Fabrics)可能定义自己的控制器重置机制。

✅ 重置后控制器的行为:

  1. 停止处理所有未完成的 Admin 和 I/O 命令
  2. 删除所有 I/O Submission Queues
  3. 删除所有 I/O Completion Queues
  4. 进入空闲状态(Idle),并将 CSTS.RDY 清零为 0
  5. 重置控制器属性与内部状态(见 §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 QueueI/O Completion Queue,而无需重置整个控制器

✅ 操作步骤(基于 memory-based transport,如 PCIe):

  1. 使用 Delete I/O Submission QueueDelete I/O Completion Queue 命令删除目标队列;
  2. 等待删除命令成功完成(也意味着挂起命令被处理或中止);
  3. 使用 Create I/O Submission QueueCreate I/O Completion Queue 命令重建队列;
  4. 在此过程中,主机可以根据需要修改队列属性(如大小、中断映射等)。

📘 小结与教学重点:

类别 重点说明
主机发起子系统重置 是否可写 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),我可以一步步系统性地展开。是否继续?