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

DPDK的VFIO

VFIO概述

VFIO是一种设备直通方案,可以在用户态直接通过VFIO驱动访问硬件。相比UIO,VFIO有IOMMU的保护,非特权用户也可以直接使用,还提供了更多的中断支持。
可以使用MMIO寄存器,通过PCI的配置空间来访问。
主要由3部分组成,group,device,iommu(对应container)。

vfio一般用于绑定VF,PF拥有完全的配置资源,可用于配置VF。图中的PF和所有VF共享PCIe端口的带宽.VF不支持IO空间,需要映射到系统内存。

VFIO会用到vfio-pci和vfio_iommu_type1_driver两个驱动.其中vfio-pci用于访问PCI设备。

一般使用VFIO时,主要是读取PCIe设备的配置空间和DMA信息。

Group

Group是IOMMU进行DMA隔离的最小单元。如果两个设备会找到同一个context entry和同一份页表,就属于同一个group,比如在PCIe-PCI桥下就属于同一个group。VFIO的group和iommu的group可以认为是同一个概念。

找到VF隶属的PCI总线

ethtool -i eth0vf0

bus-info: 0002:02:00.1

一般PF的function是0,所以第一个VF发function index从1开始。后续的VF的function index范围是0-7。

判断PCI地址属于哪个iommu的group

PCI地址的表示方式是Domain:Bus:Device:Function。

readlink /sys/bus/pci/devices/0002:02:00.1/iommu_group

../../../../../../../kernel/iommu_groups/66

看属于哪个设备

lspci -ns 0002:02:00.0

0002:02:00.0 0200: 177d:a063 (rev 50)

Device

Device是iommu拓扑角度理解的独立设备。看字符设备属于哪个用户和组。

ls -l /dev/vfio/90

crw------- 1 root root 247, 0 Aug 23 20:10 /dev/vfio/90

设备绑定

设备路径是/sys/bus/pci/devices/$dbdf,其中dbdf表示Domain, bus, device, function
绑定和解绑其实就是把驱动driver(igb_uio/vfio_pci)和dbdf写到PCI总线的文件里。
绑定:

 
echo $driver > /sys/bus/pci/devices/$dbdf/driver_override

echo $dbdf > /sys/bus/pci/drivers_probe

解绑:

echo $dbdf > /sys/bus/pci/drivers/$dbdf/driver/unbind

IOMMU

屏蔽物理地址,起保护作用。CPU通过MMU转换虚拟地址到物理地址. 设备通过IOMMU转换。

iova是设备发起DMA请求时要访问的地址.IOMMU会转为物理地址.VFIO_IOMMU_MAP_DMA命令把iova通过IOMMU映射到vaddr对应的物理地址.
IOMMU主要实现两个DMA和Interrupt的Remapping功能.
通过DMA Remapping为每个Domian建立独立的IOMMU Page Table,把DMA访问限制在Domain地址空间内。图示为支持DMA remapping的硬件实现地址空间上的隔离.

通过Interrupt Remapping来完成中断重映射和Interrupt Posting,实现中断隔离和中断直接投递。

将来自PCIe设备的中断拦截,是重映射查询中断映射表(Interrupt Remapping Table Entry)找到中断路由信息,然后发给物理CPU.

原文链接:https://mp.weixin.qq.com/s/uZNOhuF6v45Dah4Z65ZGBg

 
更多dpdk学习资料
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 学习地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 君羊909332607 获取

相关文章:

  • 重要?2022年第二批四川省工程技术研究中心组织申报条件、时间、奖励及流程
  • 【老王读Spring Transaction-1】从EnableTransactionManagement顺藤摸瓜,研究@Transactional的实现原理
  • Caddy是什么
  • 脐带间充质干细胞
  • 取暖器遇上智能化!一张床如何分区温控,节能又好用
  • w字符编码
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • 【CSAPP】深入理解计算机系统 第九章 虚拟内存 动态链接 printf 17/26
  • 软文营销评论区怎样营造好的氛围?
  • Android Gradle plugin requires Java 11 问题解决
  • mysql安装,安装mysql配置教程(超级详细图解)
  • 为什么现在西红柿都“硬邦邦”的,放几个星期都不会坏?为你解答
  • java实现微信小程序获取手机号(htts接口实现)
  • 亚马逊,速卖通,国际站卖家为什么要做测评
  • Centos7搭建sftp服务器,开启SFTP上报日志
  • 【个人向】《HTTP图解》阅后小结
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 0x05 Python数据分析,Anaconda八斩刀
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular 2 DI - IoC DI - 1
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • go语言学习初探(一)
  • jquery ajax学习笔记
  • laravel with 查询列表限制条数
  • learning koa2.x
  • MySQL主从复制读写分离及奇怪的问题
  • PermissionScope Swift4 兼容问题
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 类orAPI - 收藏集 - 掘金
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 时间复杂度与空间复杂度分析
  • 通过几道题目学习二叉搜索树
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​configparser --- 配置文件解析器​
  • ​什么是bug?bug的源头在哪里?
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (2)(2.10) LTM telemetry
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Git) gitignore基础使用
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net 路由处理厉害了
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • [.net]官方水晶报表的使用以演示下载
  • [20150321]索引空块的问题.txt
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [C++]C++类基本语法