持久内存与安全机制 - 第360页
我们继续用中文深入解读 NVMe Base Specification 2.0b 第 349 页中关于 Capacity Management 的关键机制,特别是:
🧠 容量调整因子(Capacity Adjustment Factor) 🧰 Endurance Group 和 NVM Set 的创建与删除流程
🧮 1. 容量调整因子(Capacity Adjustment Factor)
📌 定义:
Capacity Adjustment Factor = INTEGER((Consumed Capacity / Total Endurance Group Capacity) × 100)
- 该因子用于反映:
创建一个 Endurance Group 时,从控制器视角看它消耗了多少“未分配的 NVM 容量”
🧾 举个例子:
如果 Capacity Adjustment Factor 为 200,你打算创建一个 5 GiB 容量的 Endurance Group
那么你会实际从控制器的 Unallocated NVM Capacity 里消耗:
5 GiB × 200% = 10 GiB
即你要牺牲更多底层物理资源才能换得逻辑容量,可能是为了冗余、垃圾回收、内部维护等。
🏗️ 2. Endurance Group 的创建流程(原子操作)
一旦你请求创建一个 Endurance Group,控制器会立即且不可中断地执行以下步骤:
🧱 步骤如下:
- a) 从控制器的
UNVMCAP字段中 扣除实际消耗容量 - 扣除值 = 你请求的容量 × Capacity Adjustment Factor(再四舍五入到分配粒度)
- b) 将新 Endurance Group 的 ID 加入到 Endurance Group List
🧹 3. Endurance Group 的删除流程(顺序操作)
删除不是原子过程,而是一系列按顺序执行的清理操作:
🧹 步骤如下:
- 从 Endurance Group List 中移除该 Group 的 ID
- 若支持 Media Unit Status 日志,则将该 Group ID 从所有相关的 Descriptor 中清除(设为 0h)
- 删除该 Group 中的所有 NVM Set
- 将 TEGCAP(Total Endurance Group Capacity)对应的值加回 UNVMCAP 中
⚠️ 注意:如果你在这些步骤执行过程中访问相关结构,结果将是未定义的(indeterminate)。
📦 4. NVM Set 的创建流程(原子操作)
同样是原子过程,意味着创建过程不可分割:
🧱 步骤如下:
a) 向 NVM Set List 中添加新的 NVM Set ID
b) 从所属 Endurance Group 的 Unallocated Endurance Group Capacity 中 扣除分配的容量
⚠️ 控制器可能会 向上取整 分配容量,基于其自身的最小分配单元。
🧹 5. NVM Set 的删除流程(顺序操作)
删除一个 NVM Set 是一个涉及多个实体的清除过程:
🧹 步骤如下:
- 从 NVM Set List 中移除该 Set ID
- 如果支持 Media Unit Status 日志,则清除所有与该 Set 相关的描述符内容
- 对于该 Set 下的每个 Namespace:
- a. 所有命令按“Namespace 删除规则”处理(见第 8.11 节)
- b. Namespace ID 从 Allocated List 中移除
- c. 删除 Namespace 本体
- d. 将 Namespace ID 加入 Changed Namespace List
- e. 向其它主机发送 Namespace Attribute Changed 异步事件
- 将该 NVM Set 的容量加回 Endurance Group 中的未分配容量
🧠 总结整理
| 项目 | 是否原子操作 | 涉及资源 | 额外事件/通知 |
|---|---|---|---|
| 创建 Endurance Group | ✅ 是 | UNVMCAP | 否 |
| 删除 Endurance Group | ❌ 否 | 多级结构 | 否 |
| 创建 NVM Set | ✅ 是 | Endurance Group 内的容量 | 否 |
| 删除 NVM Set | ❌ 否 | 多结构 & Namespace 清理 | ✅ 发异步事件通知其它主机 |
如你想继续了解下一节(例如进入 Endurance Group 的命令结构、或 Capacity Management 的命令流程),我可以继续中文方式为你详细解读。需要我继续吗?📘