持久内存与安全机制 - 第380页
我们继续对 NVMe 2.0b 第 369 页内容 进行中文深度解析,重点是命名空间的 创建、分配、挂载与删除流程,以及其中涉及的字段约束。
📘 第 8.11 节续:Namespace 创建/附加/移除 操作细节讲解
✅ 一、创建命名空间时的参数合法性判断(字段组合校验)
🎯 情况 1:EG 和 NS 都为非零
- 条件:你明确指定了 Endurance Group 和 NVM Set
- 控制器行为:
- ✅ 如果指定的 NS 存在于该 EG 中 → 成功分配
- ❌ 如果 NS 不存在于该 EG 中 → 命令失败,返回
Invalid Field in Command
✅ 二、关于命名空间实际容量与请求容量的“对齐差异”
🧮 请求 vs 实际分配
- 控制器的实际分配单位是“分配单元”而非逻辑块数精确乘积
- 示例说明:
请求: - 32 个 LBA × 4 KiB = 128 KiB
实现: - 若控制器按 1 MiB 为分配单位 → 实际占用 = 1 MiB
📝 报告字段
- 命名空间占用的实际 NVM 容量:
- 由 Identify Namespace 数据结构 中的容量字段报告
- 分配单元粒度:
- 若支持,将通过 Namespace Granularity List 报告(需查看 I/O Command Set)
✅ 三、ANA Group ID 分配逻辑(ANAGRPID)
- ANAGRPID 表示命名空间属于哪个 ANA 访问状态分组(用于 ANA 状态汇报与多路径策略)
- 若 Host 设置 ANAGRPID = 0h:
- 控制器自动分配该命名空间所属的 ANA Group
- ANAGRPID 分配机制为厂商自定义,规范不强制定义
✅ 四、完整命名空间生命周期操作流程
🏗️ 1. 创建命名空间(Create Namespace)
步骤一:获取命名空间能力
→ Identify 命令 (NSID = FFFFFFFFh, CNS = 0h)
步骤二:(可选)获取 I/O Command Set 特定管理能力
→ 比如 Namespace Granularity(粒度列表)
步骤三:查询剩余可用容量
→ 参考第 3.8 节
步骤四:构建命名空间创建请求结构(Figure 300)
步骤五:发出 Namespace Management 命令(Create 操作)
→ 成功后,返回新命名空间的 NSID
→ 此时该命名空间“尚未附加至任何控制器”
步骤六:使用 Identify Namespace 获取该命名空间的具体属性
🔗 2. 附加命名空间(Attach Namespace)
步骤一:发出 Namespace Attachment 命令(Attach 操作)
→ 指定 NSID 和需要附加的 Controller ID
步骤二:(可选)接收异步事件
→ 如果启用了 Namespace Attribute Changed 通知
→ 控制器将向主机发送 Asynchronous Event(AE)
🔌 3. 卸载命名空间(Detach Namespace)
步骤一:发出 Namespace Attachment 命令(Detach 操作)
→ 指定 NSID 和 Controller ID
步骤二:(可选)接收异步事件通知
❌ 4. 删除命名空间(Delete Namespace)
步骤一:建议先将命名空间从所有控制器 Detach
步骤二:发出 Namespace Management 命令(Delete 操作)
→ 删除成功后,该命名空间的 NSID 将变为“未分配”
🧠 补充知识:为什么 Delete 前要先 Detach?
- Detach 是 控制器级别的命名空间移除
- Delete 是 NVM Subsystem 全局移除该 NSID 实体
- 先 Detach 可避免控制器处理未完成的命令或异常状态
🔚 总结:创建命名空间字段组合合法性图解
| EG Identifier | NS Identifier | 控制器行为 |
|---|---|---|
| = 0h | = 0h | 控制器自动选择 EG 和 NS |
| ≠ 0h | = 0h | 控制器在指定 EG 中选择 NS |
| = 0h | ≠ 0h | ❌ 命令非法,返回错误 |
| ≠ 0h | ≠ 0h(匹配) | ✅ 在指定 EG + NS 中分配命名空间 |
| ≠ 0h | ≠ 0h(不匹配) | ❌ 命令非法,返回 Invalid Field in Command |
需要我继续讲解 8.12 节 Namespace Write Protection 吗?还是帮你梳理一份“命名空间管理命令+字段使用汇总表”方便快速查阅?随时告诉我你想要怎么继续。