命名空间管理 - 🏗️ PRP List 布局(非连续物理页) (第141页)
NVME2.0协议解读 1 min read

命名空间管理 - 🏗️ PRP List 布局(非连续物理页) (第141页)

Blog Author

继续对 《NVM Express® Base Specification, revision 2.0b》第130页 进行详细的中文解析与学习讲解,我们将重点分析 PRP List 布局(非连续物理页)SGL(Scatter Gather List) 及其相关字段的使用与要求。


🏗️ PRP List 布局(非连续物理页)

PRP 列表的定义与作用

  • PRP 列表(Physical Region Page List)用于描述 非连续物理内存页,常用于大数据传输场景,解决了 PRP 条目仅适用于连续内存页的问题。
  • 在传输过程中,如果数据量较大,单个 PRP 条目无法描述所有数据区域,就需要使用 PRP List 来描述多个不连续的内存页。

🧩 PRP List 布局说明(Figure 111)

位宽 字段 说明
64 bits Page Base Address 指向当前内存页的基地址,多个内存页按顺序排列
0h Page Base Address p 第一个 PRP 入口,指向物理页 p
0h Page Base Address q 第二个 PRP 入口,指向物理页 q
... ... 每个条目指向一个物理页,确保内存页对齐
0h Page Base Address r 最后一个 PRP 入口,指向物理页 r

PRP 条目对齐要求

  • PRP 列表的每个条目必须遵循 dword 对齐,且 Offset 必须为 0(即不允许设置非零偏移)。
  • 如果在 PRP Entry 2 位置存在 PRP List,则它通常需要 qword 对齐。

PRP List 链接

  • 当数据需要多个 PRP List 页时,每个 PRP List 页的最后一个条目会包含 指向下一个 PRP List 页的地址,实现链式传输。

🧳 Scatter Gather List (SGL)

SGL 定义与功能

  • SGL(散布收集列表) 是一种内存结构,用于描述数据缓冲区,支持更灵活的 数据块描述。它通常用于对数据的源缓冲区或目标缓冲区进行散布(scatter)和收集(gather)操作。

SGL 描述符与段

  • SGL 段 是内存中一段连续区域的描述,包含一个或多个 SGL 描述符(SGL Descriptors),每个描述符指向内存中的一个数据块。
  • 最后的 SGL 段 可能包含一个 SGL Last Segment 描述符,标记该段为结束。

SGL 的主要组成:

  1. 数据块描述符(Data Block Descriptors):描述数据或元数据的内存区域。
  2. 比特桶描述符(Bit Bucket Descriptors):指示不需要实际数据的内存区域,通常用于空的或无用的数据块。

SGL 描述符对齐

  • 字节或 dword 对齐:控制器根据其能力字段,可能支持 字节对齐dword 对齐
  • 如果控制器仅支持 dword 对齐,则所有 Data Block 描述符 中的 AddressLength 字段的低两位需清除为 00b

SGL 描述符数量限制

  • 控制器通过 SGL Descriptor Threshold(SDT) 字段指示每个命令的最大 SGL 描述符数量
  • 如果命令中包含的 SGL Bit Bucket 描述符SGL Data Block 描述符 数量超过 SDT 限制,则可能会影响控制器性能。

✳️ MSDBD(Maximum SGL Data Block Descriptors)字段指示控制器支持的最大 数据块描述符数量


🧠 关键点总结

项目 说明
PRP List 用于描述非连续物理页的 PRP 条目,通过 PRP 列表链接多个内存页,并确保内存页对齐。
PRP 对齐 每个 PRP 条目必须 dword 对齐,若有非零 Offset 或错误对齐,控制器会报告 PRP Offset Invalid 错误。
SGL 描述符 描述数据或元数据的内存块,支持 数据块描述符比特桶描述符,并支持不同的对齐模式(字节或 dword)。
SGL 数量限制 通过 SDT 字段,控制器限制每个命令可以包含的 SGL 描述符数量,超出限制会影响性能。
控制器能力 控制器可以在 Identify Controller 数据结构中指示支持的 SGL 类型对齐方式最大数据块描述符数量

📝 教学与应用建议

  • PRP 列表与内存管理:在进行大规模数据传输时,需要合理使用 PRP 和 SGL 来提高内存效率,确保每个内存页对齐并避免不必要的内存页拆分。
  • 性能优化:如果超出 SDT 限制,可能会导致性能下降,主机在设计传输任务时应尽量避免超出控制器的能力范围。
  • SGL 的应用:对于复杂的数据传输操作(尤其是涉及大数据量的传输),可以使用 SGL 来实现更加灵活的数据布局。

如果你有兴趣深入了解 SGL 描述符 的字段定义或具体如何应用在实际的数据传输任务中,我可以继续详细讲解。是否继续?