news 2026/6/30 22:55:25

浅析NVMe协议:PRP/SGL数据传输格式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
浅析NVMe协议:PRP/SGL数据传输格式

文章目录

    • 概述
    • PRP
      • PRP Entry
      • PRP List
    • SGL
      • SGL描述符
      • SGL描述符类型
        • SGL Data Block描述符
        • SGL BitBucket描述符
        • SGL Segment描述符
        • SGL Last Segment描述符
        • Keyed SGL Data Block描述符
        • Transport SGL Data Block描述符
      • SGL Segment
    • 相关参考

概述

NVMe支持PRP(Physical Region Page)和SGL(Scatter-Gather List)两种方式描述数据的位置和长度等信息,其中,PRP是以主机物理页面为基本单位来描述数据的位置信息,存放在PRP里的地址需要满足主机物理页面对齐,配合页面偏移描述数据的实际地址;SGL适合描述多个分散的数据区域,相对于PRP,SGL在使用上要相对灵活一些,地址对齐粒度通常可以是Byte或Dword。

PRP

NVMe协议使用PRP描述数据的示意如下:

PRP Entry

PRP Entry是PRP格式的基本描述单元,指向主机中的一个物理内存页面。NVMe协议定义的PRP Entry格式如下:

PRP Entry包含Page Base Address和Offset:

  • Page Base Address:物理内存页面的地址;
  • Offset:数据在物理内存页面中的偏移,需要满足Dword对齐,通常只有命令中的第一个PRP Entry需要使用Offset来指示数据偏移。

上面的n取决于物理内存页面的大小,典型场景是4KB,那么n的值就是11,主机驱动可以通过CC.MPS字段配置物理内存页面大小到NVMe控制器。

PRP List

PRP List是一系列PRP Entry的数组,用于描述使用多个物理页面的数据,协议定义如下:

SGL

NVMe命令使用SGL描述数据示意如下:

SGL描述符

通用SGL描述符的格式定义如下:

SGL描述符是一个16Byte的表项,其中最高位的Byte描述了SGL的类型信息,包括SGL描述符类型和SGL描述符子类型。

协议支持的SGL描述符类型如下:

对于SGL描述符子类型,主要用于对不同类型SGL描述符的Address字段进一步做解释。

协议主要使用的SGL描述符子类型主要是0和1,其它值取决于传输层特殊定义或保留,对于0和1子类型的含义说明如下:

  • 0指示Address字段包含了64位的内存地址;
  • 1指示Address字段包含了从特定位置的偏移,通常是用于NoF Capsule同时携带了SQE和数据的场景下,描述数据在Capsule中的偏移位置。

SGL描述符类型

SGL Data Block描述符

SGL Data Block描述符记录数据在主机中的位置信息,包含数据起始地址和长度,是SGL中描述数据的基本单元。

SGL Data Block描述符记录的地址和长度,需要满足NVMe Controller对于地址对齐粒度的要求,通常可以是Byte或DWord,最终取决于NVMe Controller Identify里的配置。

SGL BitBucket描述符

SGL BitBucket描述符只携带了长度信息,自身不指向数据,通常用于读写命令中,指示NVMe Controller跳过对应长度的数据不处理。

SGL Segment描述符

SGL Segment描述符记录的是SGL Segment在内存中的地址和长度。

SGL Last Segment描述符

SGL Last Segment描述符用于记录SGL List中最后一级SGL Segment的位置信息。

Keyed SGL Data Block描述符

Keyed SGL Data Block描述符相较于常规的SGL Data Block描述符,额外携带了Key的信息,主要用于RDMA场景访问内存时作权限校验。

Transport SGL Data Block描述符

Transport SGL Data Block描述符提供了特定于NVMe传输层的数据描述方式,描述符本身只描述数据的长度,至于数据的位置以及传输方式,则由对应的传输层进行处理。

SGL Segment

SGL Segment是SGL描述符的数组,用于描述单一SGL描述符无法描述的多个数据区域。

相关参考

  • 《NVM Express Base Specification,Revision 2.3》
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 22:53:19

Confluence高危漏洞CVE-2022-26134应急响应与安全加固实战指南

1. 项目概述:一次紧急的Confluence安全事件响应 上周三凌晨,安全告警平台突然弹出一条高危告警,指向我们内部使用的Atlassian Confluence服务器。点开一看,正是那个让无数安全团队和运维工程师彻夜难眠的CVE-2022-26134。这个漏洞…

作者头像 李华
网站建设 2026/6/30 22:52:58

终极Unity游戏汉化指南:XUnity自动翻译器让外语游戏无障碍畅玩

终极Unity游戏汉化指南:XUnity自动翻译器让外语游戏无障碍畅玩 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的外语游戏而烦恼吗?XUnity自动翻译器正是你需要的完美…

作者头像 李华
网站建设 2026/6/30 22:52:19

犯罪率水平统计 2000至2025年地级市犯罪率水平统计数据集

2000-2025年地级市犯罪率水平数据集说明一、数据集概况 数据主体:各地级市年度犯罪率面板数据时间跨度:2000—2025年适用范围:仅供学术科研、个人学习使用;全部由公开信息整理而成,无涉密、敏感内容,符合数…

作者头像 李华
网站建设 2026/6/30 22:52:13

Adobe-GenP 3.0:终极Adobe全家桶激活器使用指南

Adobe-GenP 3.0:终极Adobe全家桶激活器使用指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款功能强大的Adobe全家桶激活器&…

作者头像 李华
网站建设 2026/6/30 22:50:27

企业级!一个基于 Java 开发的开源 AI 应用开发平台!

大家好,我是 Java陈序员。 现如今,随着大模型落地加速,越来越多企业开始搭建私有化 AI 能力。现阶段大多数开源 AI 平台基于 Python/Go 开发,虽然功能丰富,但对传统 Java 项目非常不友好。对于大量 Java 架构、信创项目…

作者头像 李华
网站建设 2026/6/30 22:47:23

ServerPackCreator:Minecraft服务器包自动化生成解决方案

ServerPackCreator:Minecraft服务器包自动化生成解决方案 【免费下载链接】ServerPackCreator Create a server pack from a Minecraft Forge, NeoForge, Fabric, LegacyFabric or Quilt modpack! 项目地址: https://gitcode.com/gh_mirrors/se/ServerPackCreator…

作者头像 李华