深入理解 RDMA 内存管理:海思 HNS RoCE 架构中的 HEM 表与 MTR 表有什么区别?

深入理解 RDMA 内存管理:海思 HNS RoCE 架构中的 HEM 表与 MTR 表有什么区别?

在研究 RDMA(远程直接内存访问)技术或阅读华为海思 HNS RoCE 驱动源码时,我们经常会遇到两个核心的多级索引表结构:HEM 表 和 MTR 表。

很多初学者容易把它们搞混,认为它们都是用来做地址翻译的。本文将从管理对象 、层级关系 和数据流向三个维度,带你彻底搞懂它们的根本区别。


一、 快速对比:HEM 与 MTR 核心差异

如果用一句话总结:HEM 表决定了网卡能不能找到这个 MR 的配置,而 MTR 表决定了网卡最终把数据读写到哪片物理内存。

维度 HEM 表 (Hardware Entry Memory) MTR 表 (Memory Translate Region)
核心功能 元数据检索:通过硬件 ID 索引到具体的 Context 实体。 地址翻译:实现虚拟地址(VA)到物理地址(PA)的映射。
管理内容 存放硬件上下文(如 MR Context / MPT、QPC、CQC 等)。 存放 MR 注册的数据缓存区(Data Buffer)的物理页地址。
行业对应 类似于常规 RDMA 中的 Context 控制块索引。 对应传统 RDMA 架构中的 MTT(Memory Translation Table)。
生命周期 通常在驱动初始化时创建,全局管理。 在用户每次调用 ibv_reg_mr 注册内存时动态创建。
层级关系 处于第一层寻址。 处于第二层寻址(由 HEM 引导而来)。

二、 详解 HEM 表:资源的"全局索引目录"

1. 为什么需要 HEM 表?

RDMA 网卡(HCA)需要管理海量的硬件对象,比如:

  • 队列对上下文(QPC)
  • 完成队列上下文(CQC)
  • 内存保护表上下文(MPT / MR Context)

这些 Context 结构体数量庞大,直接全量缓存在网卡片上(On-chip)是不现实的,它们通常以 Entry 的形式存放在主机内存(Host Memory)中。

2. HEM 的工作机制

HEM(Hardware Entry Memory)表 就像是一个全局指针数组 。它支持 0/1/2/3 级寻址(根据资源量动态配置)。

当网卡拿到一个资源的硬件 ID(例如从 L_Key 或 R_Key 中提取出的 MR Index)时,网卡通过硬件逻辑去查 MR HEM 表 ,就能在 Host 内存中精准定位到该 MR 对应的 MR Context(在 HNS 驱动中表现为 hns_roce_v2_mpt_entry 结构体)。


三、 详解 MTR 表:真正的"地址翻译页表"

1. 为什么需要 MTR 表?

当用户层调用 ibv_reg_mr 注册一段内存(Memory Region)时,内核驱动会锁住(Pin)这部分虚拟内存,防止其被置换到磁盘。因为应用层的虚拟地址(VA)在物理上通常是离散的,网卡硬件执行 DMA 必须知道连续或离散的物理页地址(PA)。

2. MTR 的工作机制

MTR(Memory Translate Region)表 是 HNS 驱动中对地址翻译区域的特称,它本质上就是传统 RDMA 里的 MTT(Memory Translation Table) 或 PBL(Page Big List) 。

MTR 表的每一项(Entry)直接记录了用户数据缓冲区的真实物理内存页地址 。当 MTR 表创建完成后,它的基地址、页大小、寻址层级(Hop Num)等关键信息,会被填入到上层的 MR Context 中。


四、 深度串联:一次 RDMA 网络读写的"两级查表"全过程

为了让大家更直观地理解,我们来看一下当远端网卡发来一个 RDMA Write 请求时,网卡硬件内部是如何连续使用这两张表的:

text 复制代码
 远端请求 (带着 R_Key 和 VA)
       │
       ▼
 1. 提取 R_Key 中的 MR Index
       │
       ▼
 2. 查找 [MR HEM 表] ────────► 寻址定位到 ──► [MR Context (MPT)]
                                                  │
                                             (校验权限与密钥)
                                                  │
                                                  ▼
 3. 读取 MTR 基地址 ──────────► 结合 VA 检索 ──► [MTR 表 (页表)]
                                                  │
                                             (解析出物理地址 PA)
                                                  │
                                                  ▼
 4. 执行 DMA ───────────────────────────────► 最终物理内存 (Host RAM)
  1. 解析 Key :网卡收到数据包,提取出 R_Key,获得 MR Index。
  2. 第一级(查 HEM) :网卡以 MR Index 检索 MR HEM 表 ,找到对应的 MR Context,并在其中校验密钥和读写权限。
  3. 第二级(查 MTR) :权限校验通过后,网卡从该 MR Context 中提取出 MTR 表的配置 ,结合数据包里的虚拟地址(VA)偏移量去查 MTR 表 ,最终拿到具体的物理地址(PA)。
  4. 落盘/落内存:网卡通过 PCIe 总线向该物理地址发起 DMA,完成零拷贝数据传输。

五、 总结与排查建议

在实际的 RDMA 性能调优或 Bug 排查中,分清这两个表能帮你快速定位问题:

  • 如果是 MTR 相关报错 :通常与内存注册(MR Register)有关,需要关注 Hop Num(寻址层级是否过多导致查表延迟高)或内存对齐、物理页连续性问题。
  • 如果是 HEM 相关报错 :通常发生在初始化或大规模创建 QP/MR 时,提示硬件条目内存不足,需要调整驱动的底层资源分配参数(如 num_mpts、num_qps 等)。

希望这篇技术分享能帮你梳理清楚 HNS RoCE 驱动中的内存管理逻辑。

相关推荐
leo在掘金6 小时前
25.5k Star 的 DeepInfer 怎么扛住3万亿参数
后端·架构
Linye7 小时前
为什么让 AI 修个小 Bug 却把底层全重写了?聊聊 Coding Agent 的最小修改边界
人工智能·架构
王中阳Go7 小时前
你那条三跳链路的单跳超时,是按压测的 p95 定的,还是拍出来的?
人工智能·后端·架构
H.莓飛7 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla7 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
沫璃染墨8 小时前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp
ting94520008 小时前
Databox MCP Connectors 技术深度解析:协议架构、集成原理与企业落地实践
人工智能·架构
xiaoye-duck9 小时前
《C++ 项目:手写大模型接入 SDK》本地 Ollama 部署与适配
开发语言·网络·c++·语言模型
叼烟扛炮10 小时前
Linux 学习笔记(六十一):网络编程毕业设计——Reactor 反应堆模式
linux·网络·笔记·学习·课程设计
2401_8685347810 小时前
【网络安全
网络·python