VFIO-PCI驱动作为PCIE驱动,在原来的PCIE驱动卸载后,加载VFIO-PCI驱动,与内核之前扫描到的PCIE设备匹配,触发vfio_pci_probe(),进行本驱动的初始化。该驱动提供了用户态访问PCIE设备的配置空间/BAR空间/中断等资源接口,对应于上图中Device API(代码主要在drivers/vfio/vfio-pci.c)。

之前VFIO-PCI驱动为公共驱动,所有的设备(无论是网卡还是加速器)都是使用该驱动,但是前段时间MLX和HISI在上传热迁移时遇到一些问题,发现需要有部分实现不属于公共部分,因此VFIO-PCI驱动框架作修改,将其拆成两部分,公共部分vfio-pci-core和驱动部分vfio-pci,这个驱动部分仍属于公共驱动,若某个模块需要实现自己的驱动,仍基于公共部分设计自己的驱动。

1 VFIO-PCI probe函数分析

根据设备驱动模型,VFIO-PCI驱动与VFIO设备匹配触发vfio_pci_probe()函数,调用关系如下:

上述为VFIO-PCI驱动的基本步骤,分别都是调用VFIO-PCI-CORE导出的公共函数,分别分配vfio_pci_core_device设备,初始化该设备,并最终注册设备。

其中函数vfio_pci_core_register_device()注册该设备,对该设备分配vfio_group,并与该设备关联。

  1. 根据不同情况,调用vfio_assign_device_set()将vfio_device放到到一组中;
  2. 调用vfio_pci_vf_init()设置bus notifier回调,回调函数为vfio_pci_bus_notifier;
  3. 调用vfio_register_group_dev()分配vfio_group,并将vfio_device与vfio_group关联。

VFIO PCI Group操作回调vfio_group_ops

QEMU通过Group API获取内核中vfio_group相关的信息并进行相关的设置。这里仅介绍unlocked_ioctl回调。

(1).unlocked_ioctl = vfio_group_fops_unl_ioctl

QEMU对Group API的调用都是通过上述函数实现,对不同的API处理如下:

其中VFIO_GROUP_SET_STATUS用于获取group是否可见,是否设置group->container;

VFIO_GROUP_SET_CONTAINER用于将vfio_group与vfio_container关联;

VFIO_GROUP_UNSET_CONTAINER用于将vfio_group与vfio_container取消关联;

VFIO_GROUP_SET_DEVICE_FD用于分配fd,将vfio_device与fd关联。

VFIO代码分析(2)VFIO-PCI驱动1相关推荐

  1. Linux源码阅读——PCI总线驱动代码(三)PCI设备枚举过程

    目录 前言 1.枚举过程 1.1 acpi_pci_root_add 1.2 pci_acpi_scan_root(枚举开始) 1.3 acpi_pci_root_create 1.4 pci_sca ...

  2. Android架构实例分析之编写hello驱动的HAL层代码

    Android架构实例分析之编写hello驱动的HAL层代码 摘要: HAL层中文名称又叫硬件抽象层,可以理解我Linux驱动的应用层.本文实现了一个简单的hello HAL的代码,衔接hello驱动 ...

  3. Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)

    <DPDK 20.05 | rte_pci_bus思维导图 | 第一版> <linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作> <Linux指令:ls ...

  4. LDE显示驱动(四):显示驱动内核底层代码分析

    作者:DayInAI 日期:20190124 一.RTMX 1)int de_rtmx_set_route(unsigned int sel, unsigned char pno, unsigned ...

  5. 【鸿蒙OS开发入门】18 - HDF驱动子系统:加速度计传感器 Driver层驱动代码分析

    [鸿蒙OS开发入门]18 - HDF驱动子系统:加速度计传感器 Driver层代码分析 一.如何添加速度计传感器驱动代码(代码.编译.配置) 1.驱动代码实现 2.驱动编译配置 2.1 linux 编 ...

  6. S3C6410开发板adc驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板adc驱动代码的实现过程进行分析,然后通过一个实例对adc功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 adc的设备驱动主要 ...

  7. S3C6410开发板LED驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...

  8. QSPI Flash驱动代码分析 (QSPI控制器初始化)

    QSPI Flash驱动代码分析 (QSPI控制器初始化) 1. 函数cqspi_controller_enable() 该函数主要使能和去能QSPI控制器.QSPI配置寄存器(偏移量0x00)的bi ...

  9. qualcomm的camera马达驱动代码分析

    前言: 主要给大家介绍基于高通平台的camera马达驱动的编写过程,此过程会涉及到手机对焦功能实现的原理以及如何通过I2C子系统实现数据传输等过程. 一.手机自动对焦原理 手机自动对焦功能是通过将摄像 ...

最新文章

  1. winform是如何自动弹出软键盘_自媒体广告如何创造出更大的价值?
  2. ubuntu dpkg initramfs-tools错误的解决方法
  3. 《软件测试的艺术》读书笔记 - 1
  4. 【⚠️阴沟里翻船,这题都做错了!⚠️】C语言宏定义
  5. CentOS 初体验十六:阿里云安装Nexus搭建Maven私有仓库
  6. wxWidgets:wxMouseEvent类用法
  7. 第四天:规划范围管理
  8. vue watch监听某输入框中是否有值,然后改变某输入框的属性值
  9. python 分类变量xgboost_【转】XGBoost参数调优完全指南(附Python代码)
  10. [转载]MVVM、MVVMLight、MVVMLight Toolkit之我见
  11. 两种贝塞尔曲线选点方法的对比
  12. android 自定义海报,Android仿海报工厂(完)
  13. redisrabbitMQ安装
  14. 回溯法求解n个元素的集合的幂集
  15. CNKI E-Study与Endnote 的参考文献题录互导
  16. 自定义Unity调色板
  17. 阿里巴巴社招Java面试题做题记录
  18. UI设计师为什么要学习字体设计?
  19. 阿里巴巴离职DBA职业生涯总结--吕海波
  20. 基金定投matlab程序,销售基金定投好简单:如何三分钟让客户理智开户做定投

热门文章

  1. 【操作系统】Linux虚拟机入门
  2. vs2013 无法创建项目 终极解决方案
  3. 被腾讯抄袭致死的公司有哪些? 网友留言: 无爆款不抄袭的腾讯!
  4. 电子日历的设计与实现
  5. 桌面宠物 ② 通过js制作属于自己的web网页宠物
  6. Java开发遇到的Bug
  7. Connector odbc 安装
  8. 电脑检测工具eve_最新Lenovo Diagnostics Windows(联想硬件检测诊断工具)下载地址电脑版-CC软件...
  9. 【leetcode热题100】刷题记录(5-8)
  10. Linux中查看进程的虚拟地址空间内存布局