持久内存与安全机制 - 第371页
NVME2.0协议解读 1 min read

持久内存与安全机制 - 第371页

Blog Author

我们继续深入分析 NVMe 2.0b 规范第 360 页,本页是 Streams 指令机制 的核心之一,讲的是资源分配、多主机访问下的行为定义,以及 Directive 操作的分类。


✳️ Streams 指令资源分配与控制机制(第 8.7.3 节)


📍一、主机如何使用 Stream 资源

一个 Stream 是主机用来描述“同一逻辑数据流”的标识符(Stream ID),值范围是 0001h ~ FFFFh,由主机自行分配,可稀疏。


🔧 三种资源使用模式

对某个命名空间(namespace)来说,主机可以:

  1. 分配专用资源(exclusive stream resources)
  2. 主机调用 Allocate Resources 指令;
  3. 此资源只供该 Host Identifier 下的主机使用;
  4. 会减少 NSSA(系统可用流资源数)。

  5. 其他主机并行分配它们的专用资源

  6. 即使是访问同一个命名空间,多个主机也可以各自分配专用资源。

  7. 未分配资源的主机可以使用“系统共享资源”

  8. 来自 NSSA;
  9. 共享资源只有在没有开启独占分配(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)

要继续深入讲解这一结构吗?这对写入调度和性能优化非常关键。