深入理解 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)
- 解析 Key :网卡收到数据包,提取出
R_Key,获得 MR Index。 - 第一级(查 HEM) :网卡以 MR Index 检索 MR HEM 表 ,找到对应的 MR Context,并在其中校验密钥和读写权限。
- 第二级(查 MTR) :权限校验通过后,网卡从该 MR Context 中提取出 MTR 表的配置 ,结合数据包里的虚拟地址(VA)偏移量去查 MTR 表 ,最终拿到具体的物理地址(PA)。
- 落盘/落内存:网卡通过 PCIe 总线向该物理地址发起 DMA,完成零拷贝数据传输。
五、 总结与排查建议
在实际的 RDMA 性能调优或 Bug 排查中,分清这两个表能帮你快速定位问题:
- 如果是 MTR 相关报错 :通常与内存注册(MR Register)有关,需要关注
Hop Num(寻址层级是否过多导致查表延迟高)或内存对齐、物理页连续性问题。 - 如果是 HEM 相关报错 :通常发生在初始化或大规模创建 QP/MR 时,提示硬件条目内存不足,需要调整驱动的底层资源分配参数(如
num_mpts、num_qps等)。
希望这篇技术分享能帮你梳理清楚 HNS RoCE 驱动中的内存管理逻辑。