持久内存与安全机制 - 第371页
我们继续深入分析 NVMe 2.0b 规范第 360 页,本页是 Streams 指令机制 的核心之一,讲的是资源分配、多主机访问下的行为定义,以及 Directive 操作的分类。
✳️ Streams 指令资源分配与控制机制(第 8.7.3 节)
📍一、主机如何使用 Stream 资源
一个 Stream 是主机用来描述“同一逻辑数据流”的标识符(Stream ID),值范围是 0001h ~ FFFFh,由主机自行分配,可稀疏。
🔧 三种资源使用模式
对某个命名空间(namespace)来说,主机可以:
- 分配专用资源(exclusive stream resources):
- 主机调用
Allocate Resources指令; - 此资源只供该 Host Identifier 下的主机使用;
-
会减少 NSSA(系统可用流资源数)。
-
其他主机并行分配它们的专用资源:
-
即使是访问同一个命名空间,多个主机也可以各自分配专用资源。
-
未分配资源的主机可以使用“系统共享资源”:
- 来自 NSSA;
- 共享资源只有在没有开启独占分配(NSSC.Bit0 = 1)时才能使用。
🧾 Figure 422:Streams 所支持的指令操作
| 指令类型 | 操作名 | 操作值 | 说明 |
|---|---|---|---|
| Directive Receive | Return Parameters | 01h | 获取 Streams 配置和资源情况(SWS、SGS、NSSA、NSSC等) |
| Get Status | 02h | 获取指定 Stream ID 的状态信息 | |
| Allocate Resources | 03h | 为指定 namespace 分配 host 独占的 stream 资源 | |
| Reserved | 其它值 | 保留 | |
| Directive Send | Release Identifier | 01h | 释放指定 Stream ID(非释放资源,仅释放标识) |
| Release Resources | 02h | 释放之前通过 Allocate 分配的专用资源 | |
| Reserved | 其它值 | 保留 |
📌 Stream Identifier 的作用范围与 Host Identifier 的影响
控制器通过 NSSC 字段的 Bit 0 来决定一个 Stream ID 的作用范围:
✅ 情况一:NSSC.Bit0 = 0 (默认)
- Stream ID 是“Host Identifier 私有”的;
- 同一个命名空间,不同 Host ID 的主机使用相同的 Stream ID,代表不同的流;
- 比如:两个主机都用
Stream ID = 0x1234,代表的是不同数据流。
✅ 情况二:NSSC.Bit0 = 1
- Stream ID 是“Host Identifier 共享”的;
- 不管是哪个 Host ID,
Stream ID = 0x1234代表的是同一个流; - 此时 Stream 是全局跨 Host 使用的,需要协调资源分配。
⚠️ 关于 Host Identifier 的注册
- 多个控制器如果注册了相同的 非 0 Host Identifier,它们被视为是来自同一个主机;
- 若 Host Identifier 是 0h,则视为“唯一主机”,其 Stream ID 不能与其他控制器共享语义。
🎯 应用场景举例
| Host Identifier 状态 | NSSC.Bit0 状态 | Stream ID 含义 |
|---|---|---|
| Host ID 不同 | 0 | 每个 Host ID 的 Stream ID 代表不同流 |
| Host ID 不同 | 1 | 所有 Host 使用的同一个 Stream ID 表示的是同一个逻辑流 |
| Host ID 相同 | 任意 | 表示的是同一个主机,因此 Stream ID 含义一致 |
✅ 小结精华
| 核心点 | 说明 |
|---|---|
| NSSA | 表示当前还可被未独占分配的 stream 资源数 |
| NSSC.Bit0 | 控制是否允许 Stream ID 在不同 Host 之间共享(stream 的全局 or 私有性) |
| 主机分配方式 | 可独占某命名空间的 stream 资源(提高性能,代价是减少全局共享资源) |
| Stream ID 范围 | 主机自行分配,0001h ~ FFFFh,支持稀疏映射 |
接下来我们将继续进入 8.7.3.1.1:Streams - Return Parameters 返回结构体定义,了解 controller 对每个 namespace 或整个 subsystem 的具体配置,比如:
- 最大 Stream 限制(MSL)
- 当前可用(NSSA)
- Stream Write Size(SWS)
- Stream Granularity(SGS)
要继续深入讲解这一结构吗?这对写入调度和性能优化非常关键。