队列模型 - 📘 控制器初始化流程(续)——共 12 步 (第120页)
我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 109 页 内容,这一页主要阐述了 控制器初始化完整步骤,具体包括确定支持的命令集、配置控制器寄存器、启用控制器、创建 I/O 队列以及异步事件配置等。
📘 控制器初始化流程(续)——共 12 步
以下是控制器从重置后到完全可用的推荐初始化过程,共分为 12 个步骤,每一步都至关重要:
✅ 步骤 3:确定支持的 I/O 命令集
- 读取
CAP.CSS字段:用于指示控制器支持哪些命令集(Command Sets Support)。 - 配置
CC.CSS字段:主机根据支持情况,配置控制器当前使用的命令集: CAP.CSS[7]=1→CC.CSS = 111b(表示支持多个命令集)CAP.CSS[6]=1→CC.CSS = 110b(表示支持 Zoned Namespace Command Set)CAP.CSS[6]=0 且 CAP.CSS[0]=1→CC.CSS = 000b(仅支持 NVM Command Set)
✅ 步骤 4:配置控制器设置(CC 控制器配置寄存器)
CC.AMS:选择仲裁机制(如轮询、加权轮询、供应商自定义等)CC.MPS:设置内存页大小(Memory Page Size)
✅ 步骤 5:启用控制器
- 设置
CC.EN = 1,开启控制器。
✅ 步骤 6:等待控制器准备就绪
- 通过轮询
CSTS.RDY == 1来判断控制器是否已经准备好处理命令。
✅ 步骤 7:识别控制器配置
- 向控制器发送
Identify命令,CNS = 01h,获取 Identify Controller 数据结构。
✅ 步骤 8:确定 I/O 命令集特定配置
8a)如果是 NVM 命令集(CC.CSS=000b)
- 逐个命名空间发送
Identify (CNS = 00h),识别每个命名空间的基本信息。
8b)如果支持多个 I/O 命令集(如 CAP.CSS[6] = 1)
- 发送
Identify(CNS = 1Ch)获取支持的 I/O Command Set 描述结构。 - 使用
Set Features(FID = 19h)设置启用的 I/O Command Set 组合。 - 针对启用的每个命令集:
- 使用
Identify (CNS = 07h)获取命名空间列表(根据 CSI 值区分命令集)。 - 对每个 NSID 执行:
- 如果是 NVM 或基于 NVM 的命令集(如 ZNS),则发送
Identify (CNS = 00h)。 - 同时发送其他 Identify 命令获取:
- I/O 命令集特定的命名空间结构;
- I/O 命令集特定的控制器结构;
- 命令集无关的命名空间结构。
- 如果是 NVM 或基于 NVM 的命令集(如 ZNS),则发送
✅ 步骤 9:确定支持的 I/O 队列数量
- 使用
Set Features(FID = 07h)配置和查询 I/O Submission 和 Completion Queue 的数量。 - 配置中断(如 MSI / MSI-X)来支持多队列异步通知。
✅ 步骤 10:创建 I/O Completion Queues
- 依据主机需求和控制器支持数量,通过
Create I/O Completion Queue命令创建相应数量的完成队列。
✅ 步骤 11:创建 I/O Submission Queues
- 同理,根据系统配置和控制器支持,发送
Create I/O Submission Queue命令创建提交队列。
✅ 步骤 12:启用异步事件通知(Asynchronous Events)
- 使用
Set Features命令设置要启用的异步事件种类(例如健康状态变化、命名空间变化等),以便在事件发生时控制器可以通知主机。
🧠 总结与关键理解点
| 步骤 | 要点 |
|---|---|
| 步骤 3 | 确定并设置控制器支持的命令集(CSS) |
| 步骤 4-6 | 配置并启用控制器,确保其准备就绪 |
| 步骤 7-8 | 获取控制器与命名空间的结构信息,尤其是多命令集支持的处理 |
| 步骤 9-11 | 创建并配置多队列结构,用于高并发 I/O |
| 步骤 12 | 启用异步事件通知,提升系统智能响应能力 |
如果你希望进一步了解某个子步骤(比如 Identify 命令结构、MSI-X 的配置细节,或 CSS/CSI 选择策略),我可以为你展开讲解!是否想继续阅读下一页?或者深入某一部分?