【RDMA内核驱动】ibv_reg_mr(注册内存)源码分析
ibv_reg_mr是 RDMA(远程直接内存访问)中用于注册内存区域的关键函数,其核心逻辑涉及内存页锁定、物理地址转换及 HCA(主机通道适配器)注册。以下从内核实现角度分析其流程:
一、什么是 MR(Memory Region)?
MR(Memory Region,内存区域)是 RDMA 技术中的核心概念,它是一段已注册的、可供 RDMA 硬件直接访问的内存。
要让硬件直接访问内存,必须先"注册":
二、为什么需要注册 MR?
1、物理地址转换
用户程序看到的是虚拟地址,而 RDMA 硬件需要物理地址才能进行 DMA 操作。
2、内存页锁定
RDMA 操作是异步的,硬件可能在任何时刻访问内存。如果内存被换出(swap out)到磁盘,硬件就会访问无效的物理地址。
注册时会调用get_user_pages()/ib_umem_get()锁定物理页,防止被换出。
3、权限控制
RDMA 硬件需要知道对该内存的访问权限。
4、生成访问密钥(STag / lkey / rkey)
注册后,硬件会返回一个STag(Steering Tag),作为访问该内存的"钥匙"。
RDMA 数据包中携带 STag,硬件根据 STag 验证访问合法性并查找物理地址。
二、总体流程图
三、详细调用栈
1、入口函数
2、MR对象分配
3、普通内存注册
4、PBL建立
5、硬件注册
四、PBL 资源分配体系(独立子系统)
上述流程中,PBL 分配是一个独立的资源管理系统:
五、关键数据结构转换路径
六、总结
注册 MR 的本质:在用户程序、操作系统和 RDMA 硬件之间建立一套完整的内存访问契约。
这个机制使得 RDMA 能够实现真正的零拷贝、CPU 旁路、硬件直通的数据传输,是高性能网络和存储系统的核心技术。
备注:本文参考了Linux内核驱动源码对Intel E810网络设备驱动进行的详细分析、总结。转载请注明出处,谢谢!
