0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于VFIO的详细研究解析

Linux阅码场 来源:博客园 作者:EwanHai 2021-05-02 11:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

主要研究VFIO在虚拟化中的应用,但VFIO的应用不止于虚拟化。

VFIO的全称是Virtual Function IO,但这个名字并不能反应它的特点,以下两个假名字更能反应VFIO的特点:

Very Fast IO

由于VFIO是将设备直接透传给虚拟机,所以Guest中与该设备相关的IO性能会大幅提高,接近native性能。

Versatile Framework for userspace IO

这个名字反映了VFIO的功能,即能够将device安全地映射到用户空间,使用户能够对device进行操作。

研究目的

研究利用-device vfio-pci的方式将PCI透传到虚拟机中后,在虚拟机中访问PCI设备的配置空间,MMIO寄存器,IO Port的流程是怎样的。

VFIO原理

VFIO把设备通过IOMMU映射的DMA物理内存地址映射到用户态中,让用户态程序可以自行操纵数据的传输,还可以自行注册中断处理函数,从而在用户态下实现设备的驱动程序。

因此VFIO的基础是IOMMU.

IOMMU

基础功能

地址翻译

IOMMU可以将能直接访问memory的IO总线(DMA–capable)连接到RAM中。

与传统的MMU功能类似,MMU能将CPU使用的虚拟地址转化为物理地址,而IOMMU能将device使用的虚拟地址(也称为设备地址或者IO地址)转化为物理地址。

如果没有IOMMU,DMA也能直接访问RAM中的内容,但是让DMA没有限制地访问RAM是一件很危险的事情,而IOMMU能够对这个过程加以限制,当DMA访问的地址合法时,IOMMU才返回正确的数据。

硬件中断重映射

除了翻译地址的功能,IOMMU还能对硬件中断进行重映射,达到屏蔽部分中断,或自定义中断处理函数的目的。

设备隔离

基于地址翻译和硬件中断重映射两大功能,IOMMU就具有了隔离设备的能力,这提高了设备访问RAM时和设备发出中断时的安全性。

除了将单个设备隔离的功能外,IOMMU还能隔离一组设备,如隔离PCI桥上的几个设备,所以IOMMU还有一个概念,叫做IOMMU_GROUP, 代表一组被隔离的设备的集合。

通过把host的device和对应driver解绑,然后绑定在VFIO的driver上,就会在/dev/vfio/目录下出现一个group,这个group就是IOMMU_GROUP号,如果需要在该group上使用VFIO,需要将该group下的所有device与其对应的驱动解绑。

VFIO Container

在IOMMU_GROUP的基础上,VFIO封装了一层Container Class,Container的作用是,当我们想在不同的IOMMU_GROUP之间共享TLB和page tables(用于地址翻译的页表)时,就将这些group放到同一个container中,因此Container可以看做是IOMMU_GROUP的集合。

虚拟化中VFIO的应用

这里演示一个将网卡设备利用VFIO透传到虚拟机中的例子。需要注意的是,利用VFIO将PCI设备透传到虚拟机之后,Host将无法使用该设备。

虚拟机默认网卡

首先利用默认qemu选项启动虚拟机后,查看lspci的输出,看看虚拟机默认使用的网卡是什么?

11c76f90-9e23-11eb-8b86-12bb97331649.png

可以看到虚拟机默认的网卡是Intel的82540EM,是由Qemu-kvm软件模拟出来的一款网卡。

将Host的PCI网卡透传到虚拟机

首先在Host上使用lspci查看拥有的PCI网卡型号,可以看到Realtek的一款网卡,该网卡的PCI标记为06:00.0.

11d31ac0-9e23-11eb-8b86-12bb97331649.png

要使用VFIO,必须在Linux启动时添加启动项intel_iommu=on,因为VFIO的底层依赖IOMMU.

加载VFIO-PCI module

sudo modprobe vfio-pci

如果加载成功,可以在dmesg中看到相关log.

11ff38da-9e23-11eb-8b86-12bb97331649.png

查看网卡所在的IOMMU Group

$ readlink /sys/bus/pci/devices/000000.0/iommu_group.。/.。/.。/.。/kernel/iommu_groups/3

可以看到该Realtek网卡位于iommu_group的group3.

查看设备所在iommu_group的所有设备

$ ls /sys/bus/pci/devices/000000.0/iommu_group/devices/000005.0 000005.1 000000.0

可以看到在iommu_group3中,除了该Realtek网卡,还有2个设备。

将设备与对应的驱动解绑

为了将设备透传到虚拟机中,需要将设备与其对应的驱动解绑,这样该设备就可以使用VFIO的驱动了。注意,不仅要将要透传的设备解绑,还要将与设备同iommu_group的设备都解绑,才能透传成功。

$ echo 000000.0 | sudo tee /sys/bus/pci/devices/000000.0/driver/unbind000000.0$ echo 000005.0 | sudo tee /sys/bus/pci/devices/000005.0/driver/unbind000005.0 $ echo 000005.1 sudo tee /sys/bus/pci/devices/000005.1/driver/unbind000005.1

查看设备的Vendor和DeviceID

$ lspci -n -s 06:00.0 06:00.0 0200: 10ec:8168 (rev 15)

可以看到该Realtek网卡的Vendor为10ec,DeviceID为8168.

将设备绑定到vfio-pci module

$ echo 10ec 8168 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id10ec 8168

可以通过ls /dev/vfio查看是否绑定成功,如果绑定成功,/dev/vfio目录下会出现该device所属的iommu_group号。

121b8a6c-9e23-11eb-8b86-12bb97331649.png

这里的3就是我们要透传的Realtek网卡所在的iommu_group号。

启动虚拟机

$ sudo x86_64-softmmu/qemu-system-x86_64 -m 4096 -smp 4 -hda ~/ewan/Workspace/img/Ubuntu18.04_loop.img-enable-kvm -cpu host -device vfio-pci,host=06:00.0

这里我使用的是从源码编译的qemu,但是从apt-get安装的的qemu也是可以的。

进入guest之后运行lspci,可以看到相比之前的PCI设备,多了一个Realtek网卡,这个网卡和host上的信息一模一样,证明将网卡透传到Guest成功!。

1224b880-9e23-11eb-8b86-12bb97331649.png

编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dma
    dma
    +关注

    关注

    3

    文章

    582

    浏览量

    106277
  • 虚拟机
    +关注

    关注

    1

    文章

    975

    浏览量

    30700
  • guest
    +关注

    关注

    0

    文章

    3

    浏览量

    3456

原文标题:VFIO(Virtual Function IO)研究

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LTC5592:高性能双路下变频混频器的详细解析

    LTC5592:高性能双路下变频混频器的详细解析 一、引言 在无线通信领域,混频器作为关键的射频前端器件,其性能直接影响着整个通信系统的质量。LTC5592 作为一款高性能的双路下变频混频器,在
    的头像 发表于 04-24 17:40 600次阅读

    SGM25062:6通道负载开关的详细解析与应用

    SGM25062:6通道负载开关的详细解析与应用 在电子设备设计中,负载开关是一种关键的元件,它能够有效地管理电源分配和保护电路。SG Micro Corp推出的SGM25062 6通道负载开关
    的头像 发表于 03-24 11:35 181次阅读

    SGM6061:55V、1.5A高频降压转换器的详细解析与应用设计

    SGM6061:55V、1.5A高频降压转换器的详细解析与应用设计 一、引言 在电子设备的电源设计中,降压转换器扮演着至关重要的角色。SG Micro Corp推出的SGM6061是一款高性能
    的头像 发表于 03-19 16:15 236次阅读

    SGM4552:1位双向电压电平转换器的详细解析

    SGM4552:1位双向电压电平转换器的详细解析 在电子设计中,电压电平转换是一个常见且关键的需求。SG Micro Corp推出的SGM4552 1位双向电压电平转换器,为我们提供了一种可靠
    的头像 发表于 03-16 14:35 201次阅读

    SGM834A:140dB 范围对数电流 - 电压转换器的详细解析

    SGM834A:140dB 范围对数电流 - 电压转换器的详细解析 在电子设计领域,对于电流信号的精确测量和转换一直是重要的研究方向。SGM834A 作为一款单电源对数电流 - 电压转换器,为低频
    的头像 发表于 03-10 10:25 204次阅读

    风华贴片电阻料号编码的详细解析

    风华贴片电阻的料号编码通常遵循一套系统化的命名规则,涵盖了产品类型、封装尺寸、温度系数、阻值、精度、额定功率及包装方式等关键参数。以下是对风华贴片电阻料号编码的详细解析: 一、编码结构 风华贴片电阻
    的头像 发表于 03-04 16:23 404次阅读
    风华贴片电阻料号编码的<b class='flag-5'>详细</b><b class='flag-5'>解析</b>

    2.45 GHz 高频陶瓷带通滤波器详细解析

    2.45 GHz 高频陶瓷带通滤波器详细解析 在高频电子电路设计中,滤波器是不可或缺的关键元件。今天我们就来详细探讨 Johanson Technology 公司的 2.45 GHz 带通滤波器(P
    的头像 发表于 02-04 16:45 665次阅读

    915 MHz低通滤波器详细解析:从规格到性能

    915 MHz低通滤波器详细解析:从规格到性能 引言 在电子工程领域,滤波器是不可或缺的元件,尤其是在高频通信系统中。今天我们要详细探讨的是Johanson Technology公司的915 MHz
    的头像 发表于 02-03 14:35 254次阅读

    TDK多层高通滤波器DEA162400HT - 8004B1的详细解析

    TDK多层高通滤波器DEA162400HT - 8004B1的详细解析 作为电子工程师,在射频电路设计中,滤波器是至关重要的组件之一。今天就来详细聊聊TDK的一款多层高通滤波器DEA162400HT
    的头像 发表于 01-07 17:55 803次阅读

    TDK多层带通滤波器DEA202450BT - 2114F1详细解析

    TDK多层带通滤波器DEA202450BT - 2114F1详细解析 在电子设备的设计中,滤波器是不可或缺的关键组件,它对于信号的处理和优化起着至关重要的作用。今天我们就来详细探讨一下TDK的多层
    的头像 发表于 12-30 18:10 1185次阅读

    AP61402:高效同步降压转换器的详细解析

    AP61402:高效同步降压转换器的详细解析 在电子设计领域,电源管理芯片的性能直接影响着整个系统的稳定性和效率。今天要给大家介绍的是DIODES公司的AP61402,一款高性能的同步降压转换器
    的头像 发表于 12-10 17:15 1695次阅读
    AP61402:高效同步降压转换器的<b class='flag-5'>详细</b><b class='flag-5'>解析</b>

    关于保偏光纤的详细解释

    保偏光纤(Polarization-Maintaining Fiber,简称PMF)是一种特殊设计的光纤,其核心功能是在传输过程中保持光的偏振态不变。以下是关于保偏光纤的详细解释: 1. 偏振态
    的头像 发表于 09-25 10:13 1288次阅读
    <b class='flag-5'>关于</b>保偏光纤的<b class='flag-5'>详细</b>解释

    mqtt dns解析失败是为什么?

    解析域名的ip地址就能正常连上,而直接解析域名就不行,为什么呢
    发表于 09-16 06:38

    PTC热敏电阻在空调中的使用及详细功能解析

    PTC热敏电阻在空调中的使用及详细功能解析 一、什么是PTC热敏电阻? 首先,PTC是“Positive Temperature Coefficient”的缩写,意为“正温度系数”。PTC热敏电阻
    发表于 09-08 11:10

    AIcube1.4目标检测模型导入yolotxt格式数据集后一直显示数据正在解析,为什么?

    AIcube1.4目标检测模型导入yolotxt格式数据集后一直显示数据正在解析 数据有问题,把数据情况说的详细
    发表于 08-13 07:16