命名空间管理 - 📘 控制器初始化步骤(续) (第122页)
NVME2.0协议解读 1 min read

命名空间管理 - 📘 控制器初始化步骤(续) (第122页)

Blog Author

我们继续深入分析 NVM Express® Base Specification, revision 2.0b 第 111 页 内容,这一部分继续描述了控制器初始化流程,并引入了 控制器初始化时的就绪模式(Controller Ready Modes)。


📘 控制器初始化步骤(续)

我们已经分析了前面的控制器初始化过程,接下来补充并解析 步骤 4 到 11 的详细操作。

✅ 步骤 4:配置控制器设置

主机应根据 控制器能力 配置控制器的一些关键设置: 1. 选择仲裁机制(CC.AMS:指定控制器如何进行命令调度和资源分配,常见的机制包括 轮询(Round Robin)加权轮询(Weighted Round Robin) 等。 2. 初始化内存页大小(CC.MPS:配置控制器的内存页面大小,通常是为了保证内存管理的一致性。


✅ 步骤 5:启用控制器

通过设置 CC.EN = 1,启用控制器,使其可以开始处理命令。


✅ 步骤 6:等待控制器准备就绪

主机需要等待控制器状态寄存器中的 CSTS.RDY 字段变为 1,表示控制器已经准备好可以接受命令。


✅ 步骤 7:获取控制器配置

主机向控制器发送 Identify Command,并请求 Identify Controller 数据结构(CNS = 01h),此时可以获得控制器的配置信息。


✅ 步骤 8:获取 I/O 命令集特定配置

根据 CC.CSS 字段的值,主机获取控制器支持的命令集配置:

  1. 如果 CC.CSS = 000b,主机通过 Identify Namespace 获取每个命名空间的配置。
  2. 如果 CAP.CSS[6] = 1,则主机执行以下步骤:
  3. 向控制器发送 Identify I/O Command Set 命令(CNS = 1Ch);
  4. 使用 Set Features 命令(FID 19h)启用相应的命令集组合;
  5. 对每个启用的 I/O 命令集:
    • 向控制器发送 Identify I/O Command Set Specific Active Namespace ID List 命令(CNS = 07h);
    • 对返回的每个 NSID,执行 Identify Namespace 命令(CNS = 00h);
    • 同时获取其他 I/O 命令集特定的命名空间数据结构和控制器数据结构。

✅ 步骤 9:确定 I/O 队列配置

主机查询以下信息: 1. 最大 I/O 队列大小:从控制器的 CAP.MQES 获取; 2. I/O 提交队列和完成队列的数量:通过 Set Features 命令获得。


✅ 步骤 10:创建 I/O 队列

使用 Connect Command(参见第 6.3 节)创建 I/O 提交队列和完成队列对。


✅ 步骤 11:启用异步事件通知

主机通过 Set Features 命令启用异步事件通知,并可提交一个或多个 Asynchronous Event Request 命令,监听控制器异步发生的事件(如健康状态、命名空间变化等)。

🔔 异步事件通知 使得主机能够实时收到控制器的状态变化或事件通知,帮助更高效地管理设备。


❗ 关键点总结

步骤 操作 说明
步骤 4 配置控制器设置 配置仲裁机制、内存页面大小
步骤 5 启用控制器 设置 CC.EN = 1,启动控制器
步骤 6 等待控制器准备就绪 等待 CSTS.RDY = 1
步骤 7 获取控制器配置 通过 Identify 命令获取控制器基本信息
步骤 8 获取命令集配置 根据 CC.CSS 配置获取命令集与命名空间信息
步骤 9 查询 I/O 队列配置 确定最大队列大小和队列数量
步骤 10 创建 I/O 队列 使用 Connect 创建 I/O 队列对
步骤 11 启用异步事件通知 提交 Asynchronous Event Request 命令监听事件

📘 四、控制器就绪模式(Controller Ready Modes)

控制器的就绪模式决定了在初始化过程中,主机如何判断控制器是否已准备好处理命令。在 NVM Express 规范中,控制器有两种就绪模式:

两种就绪模式

  1. 模式 1CSTS.RDY = 1,表示控制器已准备好。
  2. 模式 2CSTS.RDY = 0,控制器处于初始化或低功耗状态。

这些步骤和模式构成了控制器的完整初始化流程,确保主机与控制器之间的通信稳定、顺畅。