当前位置: 首页 > news >正文

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用

MR简介

RDMA通信中MR(Memory Region)指的是由RDMA软件层在内存中规划出的一片区域,用于存放收发的数据。IB协议中,用户在申请完用于存放数据的内存区域之后,都需要通过调用IB框架提供的API注册MR,才能让RDMA网卡访问这片内存区域。MR就是一块RDMA通信过程中申请使用的内存。一个系统中可以有多个MR。

 视频教程在这:

1.5 RDMA MR(Memory Region, 内存区域)基本概念和作用_哔哩哔哩_bilibili

MR主要有如下三个作用

1、虚拟地址到物理地址的转化

2、控制访问权限

3、避免换页

哈哈哈,下面就简单解释下。

一、虚拟地址到物理地址的转化

RDMA通信过程中,应用程序提供的缓存地址是虚拟地址,但网卡需要物理地址才能通过总线访问主机内存。

CPU的MMU模块可通过查询操作系统建立的系统页表得到物理地址。MMU是Memory Management Unit的缩写,内存管理单元,有时称作分页内存管理单元。

但是RDMA网卡难以利用MMU,原因是:

1、每种CPU体系结构的页表格式不完全相同

但更重要的原因是,没有权限:

2、页表是系统的核心功能,为保障系统安全,不能访问。

因此注册MR的过程中,RDMA网卡驱动创建并填写一个虚拟地址到物理地址的映射表,映射表被存储在RDMA网卡的Memory Translation Table(MTT)中,这样需要的时候就能通过查表把虚拟地址转换成物理地址了。

二、控制访问权限

网卡具有访问内存的能力,如果用户/恶意程序/Bug传入了一个非法的地址(比如系统内存或者其他进程使用的内存),网卡对其进行读写可能造成信息泄露或者内存覆盖。因此需要一种机制来确保网卡只能访问已被授权的、安全的内存地址。

注册MR的动作会产生两个密钥——L_Key(Local Key,本地密钥)和R_Key(Remote Key,远程密钥),说是钥匙,它们的实体其实就是一串序列而已。它们将分别用于保障对于本地和远端内存区域的访问权限。下面两张图分别是描述L_Key和R_Key的作用,通过L_Key可访问RDMA注册的MR,R_Key可访问远端RDMA注册的MR,其余区域都访问不了:

本地是如何知道对端节点的可用虚拟地址和对应的R_Key的?其实两端的节点在真正的RDMA通信之前,都会通过某些方式先建立一条链路(比如Socket连接)并通过这条链路交换一些RDMA通信所必须的信息(比如对端的数据缓存虚拟地址和长度,R_Key,QPN等)。

在访问对端MR时,需要把对端MR的R_Key填写到本地的WQE(工作队列元素)中。

三、避免换页

计算机物理内存是有限的,所以操作系统在操作系统内存不足时,通过换页机制来暂时把某个进程不用的内存内容保存到硬盘中,并在系统页表中删除相应的表项。当该进程需要使用时,再通过缺页中断把硬盘中的内容搬移回内存,并保证内存页的虚拟地址不变。

此时数据所在内存的虚拟地址没变,但物理地址变了。这会导致虚拟地址到物理地址的映射关系发生改变。但RDMA网卡经常会绕过CPU对用户提供的虚拟地址进行访问,如果虚拟地址到物理地址的映射关系发生改变,MR地址映射表就失去了意义,RDMA网卡将无法正确的找到物理地址。

为了防止换页所导致的虚拟地址到物理地址映射关系发生改变,注册MR时会调用Linux内核提供的pin_user_pages_fast函数"Pin"住这块内存(亦称“锁页”),即锁定虚拟地址到物理地址的映射关系。也就是说,MR这块内存区域会长期存在于物理内存中不被换页,直到完成通信之后,用户主动注销这片MR。

参考资料:

Linux高性能网络详解,从DPDP、RDMA到XDP

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • html改写vue日志
  • 【银河麒麟服务器操作系统】java进程oom现象分析及处理建议
  • 计数,桶与基数排序
  • 建投数据人力资源系列产品获得欧拉操作系统及华为鲲鹏技术认证书
  • vue2 使用代码编辑器插件 vue-codemirror
  • 力扣题解(组合总和IV)
  • spark shell
  • 汽车及零部件研发项目管理系统:一汽东机工选择奥博思 PowerProject 提升研发项目管理效率
  • 人是一个AI Agent吗?
  • React Hook 总结(React 萌新升级打怪中...)
  • python打包exe文件-实现记录
  • Linux下如何安装配置Elastic Stack日志收集系统
  • 【Rust光年纪】解锁Rust语言核心库奥秘:加密、数字签名和数据库操作全面解析
  • spark 动态资源分配dynamicAllocation
  • Linux cd 和 pwd 命令
  • 【刷算法】求1+2+3+...+n
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular 响应式表单 基础例子
  • CSS魔法堂:Absolute Positioning就这个样
  • go语言学习初探(一)
  • iOS小技巧之UIImagePickerController实现头像选择
  • Javascript弹出层-初探
  • laravel5.5 视图共享数据
  • oschina
  • React-Native - 收藏集 - 掘金
  • webpack+react项目初体验——记录我的webpack环境配置
  • #考研#计算机文化知识1(局域网及网络互联)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (二)fiber的基本认识
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (黑马C++)L06 重载与继承
  • (十六)串口UART
  • (十三)Maven插件解析运行机制
  • (四)模仿学习-完成后台管理页面查询
  • (转)编辑寄语:因为爱心,所以美丽
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • *Django中的Ajax 纯js的书写样式1
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net IOC框架入门之一 Unity
  • .NET Micro Framework初体验
  • .NET 中 GetProcess 相关方法的性能
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .skip() 和 .only() 的使用
  • /etc/sudoer文件配置简析
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [AIGC] 如何建立和优化你的工作流?
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [C/C++]关于C++11中的std::move和std::forward
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪