概述

VFIO是一套用户态驱动框架,它提供两种基本服务:

  • 向用户态提供访问硬件设备的接口
  • 向用户态提供配置IOMMU的接口

VFIO由平台无关的接口层与平台相关的实现层组成。接口层将服务抽象为IOCTL命令,规化操作流程,定义通用数据结构,与用户态交互。实现层完成承诺的服务。据此,可在用户态实现支持DMA操作的高性能驱动。在虚拟化场景中,亦可借此完全在用户态实现device passthrough。

VFIO实现层又分为设备实现层与IOMMU实现层。当前VFIO仅支持PCI设备。IOMMU实现层则有x86与PowerPC两种。VFIO设计灵活,可以很方便地加入对其它种类硬件及IOMMU的支持。

接口

与KVM一样,用户态通过IOCTL与VFIO交互。可作为操作对象的几种文件描述符有:

  • Container文件描述符

    • 打开/dev/vfio字符设备可得
  • IOMMU group文件描述符
    • 打开/dev/vfio/N文件可得 (详见后文)
  • Device文件描述符
    • 向IOMMU group文件描述符发起相关ioctl可得

逻辑上来说,IOMMU group是IOMMU操作的最小对象。某些IOMMU硬件支持将若干IOMMU group组成更大的单元。VFIO据此做出container的概念,可容纳多个IOMMU group。打开/dev/vfio文件即新建一个空的container。在VFIO中,container是IOMMU操作的最小对象。

要使用VFIO,需先将设备与原驱动拨离,并与VFIO绑定。

用VFIO访问硬件的步骤:

  • 打开设备所在IOMMU group在/dev/vfio/目录下的文件
  • 使用VFIO_GROUP_GET_DEVICE_FD得到表示设备的文件描述(参数为设备名称,一个典型的PCI设备名形如0000:03.00.01)
  • 对设备进行read/write/mmap等操作

用VFIO配置IOMMU的步骤:

  • 打开/dev/vfio,得到container文件描述符
  • 用VFIO_SET_IOMMU绑定一种IOMMU实现层
  • 打开/dev/vfio/N,得到IOMMU group文件描述符
  • 用VFIO_GROUP_SET_CONTAINER将IOMMU group加入container
  • 用VFIO_IOMMU_MAP_DMA将此IOMMU group的DMA地址映射至进程虚拟地址空间

逻辑

VFIO设备实现层与Linux设备模型紧密相连,当前,VFIO中仅有针对PCI的设备实现层(实现在vfio-pci模块中)。设备实现层的作用与普通设备驱动的作用类似。普通设备驱动向上穿过若干抽象层,最终以Linux里广为人知的抽象设备(网络设备,块设备等等)展现于世。VFIO设备实现层在/dev/vfio/目录下为设备所在IOMMU group生成相关文件,继而将设备暴露出来。两者起点相同,最终呈现给用户态不同的接口。欲使设备置于VFIO管辖之下,需将其与旧驱动解除绑定,由VFIO设备实现层接管。用户态能感知到的,是一个设备的消失(如eth0),及==/dev/vfio/N文件的诞生==(其中N为设备所在IOMMU group的序号)。由于IOMMU group内的设备相互影响,只有组内全部设备被VFIO管理时,方能经VFIO配置此IOMMU group。

把设备归于IOMMU group的策略由平台决定。在PowerNV平台,一个IOMMU group与一个PE对应。PowerPC平台不支持将多个IOMMU group作为更大的IOMMU操作单元,故而container只是IOMMU group的简单包装而已。对container进行的IOMMU操作最终会被路由至底层的IOMMU实现层,这实际上将用户态与内核里的IOMMU驱动接连了起来。

总结

VFIO是一套用户态驱动框架,可用于编写高效用户态驱动;在虚拟化情景下,亦可用来在用户态实现device passthrough。通过VFIO访问硬件并无新意,VFIO可贵之处在于第一次向用户态开放了IOMMU接口,能完全在用户态配置IOMMU,将DMA地址空间映射进而限制在进程虚拟地址空间之内。这对高性能用户态驱动以及在用户态实现device passthrough意义重大。

原文链接:https://www.cnblogs.com/yi-mu-xi/p/10515609.html

linux用户层驱动--VFIO(五)相关推荐

  1. linux用户层驱动--VFIO(四)

    VFIO--将设备暴露到用户态 在开始之前我们先要说一个东西就是 DMA,直接让设备访问内存,可以不通过 CPU 搬运数据. 这是一个比较简单的体系结构图,设备 和 CPU 通过存储控制器访问存储器. ...

  2. linux用户态驱动--VFIO(一)

    序言 设备驱动可以运行在内核态,也可以运行在用户态,不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是:系统调用开销大:学习曲线陡峭:接口稳定性差:调试困难:bug致命:编程语言选择 ...

  3. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

  4. Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 阅读数:5070 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. ...

  5. Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇

    Core层中有两个重要函数 mmc_alloc_host 用于构造host,前面已经学习过,这里不再阐述:另一个就是 mmc_add_host,用于注册host 前面探测函数s3cmci_probe, ...

  6. linux用户模式驱动,linux设备驱动之控制台驱动

    我们在之前分析过input子系统和tty设备驱动架构.今天需要将两者结合起来.看看linux中的控制台是怎么样实现的. 二:控制台驱动的初始化 之前在分析tty驱动架构的时候曾分析到.主设备为4,次设 ...

  7. linux用户态驱动--VIFIO、IOMMU、UIO(二)

    1.UIO的出现,允许将驱动程序用到用户态空间里实现,但UIO有它的不足之处,如不支持DMA.中断等: 2.随着虚拟化的出现,IOMMU也随之出现,IOMMU为每个直通的设备分配独立的页表,因此不同的 ...

  8. Linux摄像头UVC驱动第五篇--启动传输之设置摄像头参数

    本章主要实现 myuvc_vidioc_streamon()即启动传输 中的摄像头参数设置 向USB摄像头设置参数: 比如使用哪个format, 使用这个format下的哪个frame(分辨率),参考 ...

  9. linux用户层通过spi读写cpld

    cpld的通讯格式会有不同 我这使用的是32bit 需反转的 写时序: 读时序: #include <stdint.h> #include <unistd.h> #includ ...

最新文章

  1. 赠书|大厂面试喜欢考算法,该怎么破?
  2. 威胁报告:mDNS 反射式 DDoS 攻击
  3. liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...
  4. python条件表达式:多项分支,双向分支
  5. NYOJ-42 一笔画问题
  6. Codeigniter 3 拓展HMVC
  7. python的使用说明_Python 的基本使用说明
  8. 【设计模式系列】行为型之责任链模式
  9. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...
  10. u盘循环冗余能修复吗_激素脸怎么办?激素脸还能改善修复好吗?
  11. js29--装饰着模式
  12. MySQL 报错记录
  13. 如何从字符串生成流?
  14. Java对象的强引用、软引用、弱引用和虚引用 笔记
  15. The New Villa
  16. 无需开机QQ宠物永久在线刷等级
  17. MySQL相关知识整理
  18. 中国cdn服务升级成就免费备案
  19. java小组的队名,有创意的队名和口号
  20. 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》

热门文章

  1. python拿来干嘛-python可以用来干什么?
  2. python使用del保留字定义一个函数-python中自定义函数的保留字是
  3. python可以做什么工作好-学完Python我们可以做什么工作?
  4. python可以做什么有趣的东西-您用python做过什么有趣的事?(什么事python)
  5. python如何读取txt文件-如何在python中读取文件夹中的txt文件列表
  6. python读取文件某一行-python和shell读取文件某一行
  7. CVPR2019目标检测方法进展综述
  8. 增加数据_Photoshop XMP元数据沉积造成文件量增加
  9. UVa11134 Fabled Rooks(贪心算法)
  10. UVa10795 - A Different Task