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

uverbs的交互方式——ioctl和write

verbs是RDMA设备的标准使用接口,verbs接口中控制面相关的接口实现由用户态的libibverbs.so和内核态的ib_uverbs.ko配合完成。用户态的libibverbs负责将RDMA控制命令信息封装成特定的数据结构,之后通过系统调用传递到内核中;ib_uverbs.ko负责实际实现这些系统调用,根据系统调用传入的参数获取RDMA控制命令的信息,并执行相应的命令。

RDMA verbs实现示意图(来自 RDMA杂谈 - 知乎)

 libibverbs与ib_uverbs间传递命令信息的syscall有两种:ioctl和write。verbs实现中使用ioctl和write分别实现了各类命令信息的传递,同一个命令既可以通过ioctl,也可以通过write来实现。

在早期的实现中,libibverbs是通过write syscall来传递信息的,但在cve-2016-4565中发现了这种实现存在安全漏洞,因此之后在[rdma-core] verbs: Allow all commands to be invoked by ioctl - Patchwork中使用ioctl重新实现了控制命令的传递。为了保持向后兼容,libibverbs和ib_uverbs中都保留了基于write的实现,但在绝大部分情况下,都应该使用ioctl版本的实现来保证内核的安全性。

libibverbs中通过_execute_cmd_write函数实现了对ioctl和write接口的兼容性封装和配置选择。在未指定VERBS_WRITE_ONLY的情况下,会使用ioctl_write函数来实现之前通过write系统调用实现的功能。在ioctl_write中,会将原本用于write的ib_uverbs_cmd_hdr结构转换为ibv_command_buffer结构,最后调用ioctl来下发命令。这种情况下,ibv_command_buffer的object_id和method_id分别设置为UVERBS_OBJECT_DEVICE和UVERBS_METHOD_INVOKE_WRITE,值都为0。

在当前的libibverbs实现中,_execute_cmd_write函数本身只会在libibverbs或者ib_uverbs不直接支持命令通过ioctl实现时才会调用。原本在这种情况下,会使用write实现命令,而现在则会使用ioctl_write实现。这个逻辑在_execute_ioctl_fallback中实现。

这里比较奇怪的一点是为什么不为这些命令也直接支持ioctl操作模式,而是要用fallback到一个特殊的ioctl操作的方式实现。原因是部分命令的内核处理逻辑是对数据结构的用户态内存空间布局有依赖的,因此必须通过一种类似于write的方式去处理。(这块不是很理解,没有细看相关实现。参见https://lpc.events/event/2/contributions/144/attachments/125/157/plumbers-2018.pdf)

相关文章:

  • Hadoop-Yarn
  • mysql面试题
  • Vue-条件渲染和循环渲染
  • 二、前端-VUE(2)
  • 在腾讯云服务器的Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细)
  • springboot系列(二十):如何通过redis实现手机号验证码功能 |超级详细,建议收藏
  • 原始套接字
  • 【C语言刷LeetCode】1953. 你可以工作的最大周数(M)
  • 猿创征文|Python基础——Visual Studio版本——Web开发
  • 【C语言刷LeetCode】395. 至少有 K 个重复字符的最长子串(M)
  • 利用 HomeAssistant 实现电脑远程开关机
  • 练习31-35:多表关联查询、多条件自连接查询、子查询、窗口函数等
  • windows下安装protocol buffer
  • Kubernetes 调度器学习
  • Android ADB常用命令
  • 自己简单写的 事件订阅机制
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Java的Interrupt与线程中断
  • leetcode46 Permutation 排列组合
  • Nodejs和JavaWeb协助开发
  • Objective-C 中关联引用的概念
  • React系列之 Redux 架构模式
  • 读懂package.json -- 依赖管理
  • 给初学者:JavaScript 中数组操作注意点
  • 将 Measurements 和 Units 应用到物理学
  • 解决iview多表头动态更改列元素发生的错误
  • 驱动程序原理
  • 算法-图和图算法
  • 一道面试题引发的“血案”
  • Python 之网络式编程
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​水经微图Web1.5.0版即将上线
  • #git 撤消对文件的更改
  • #微信小程序(布局、渲染层基础知识)
  • $.ajax()方法详解
  • (3)(3.5) 遥测无线电区域条例
  • (3)nginx 配置(nginx.conf)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)球球大作战
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .“空心村”成因分析及解决对策122344
  • .net web项目 调用webService
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET成年了,然后呢?
  • .NET开发人员必知的八个网站
  • ::什么意思
  • @GetMapping和@RequestMapping的区别
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [Angular 基础] - 表单:响应式表单