命名空间管理 - 📘 控制器初始化步骤(续) (第122页)
我们继续深入分析 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 字段的值,主机获取控制器支持的命令集配置:
- 如果
CC.CSS = 000b,主机通过Identify Namespace获取每个命名空间的配置。 - 如果
CAP.CSS[6] = 1,则主机执行以下步骤: - 向控制器发送
Identify I/O Command Set命令(CNS = 1Ch); - 使用
Set Features命令(FID 19h)启用相应的命令集组合; - 对每个启用的 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:
CSTS.RDY = 1,表示控制器已准备好。 - 模式 2:
CSTS.RDY = 0,控制器处于初始化或低功耗状态。
这些步骤和模式构成了控制器的完整初始化流程,确保主机与控制器之间的通信稳定、顺畅。