VFIO代码分析(2)VFIO-PCI驱动1

news/2025/2/21 8:33:44/

         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关联。


http://www.ppmy.cn/news/274636.html

相关文章

linux设备模型:pci驱动程序注册过程

一个具有正常探测功能的pci驱动程序应具有基本的pci_driver结构实现,如: static struct pci_driver driver_ops {.name "driver_name", // 驱动名称.id_table pci_ids, // 驱动ids结构.probe pci_probe, // 驱动探测函数.remove pci_remo…

Linux PCI驱动编写

这几天将以前为内核2.6写的驱动移植到了4.1下,在这里记录一下过程,以及从头整理一下linux下pci驱动的编写方法。   以前的驱动没有使用到linux下的probe方法,在4.1内核下成功编译后,一直无法进入中断,因此参考ch36x的…

Linux的PCI驱动介绍(入门)

1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置空间则由Linux内核中的PCI初始化代码使用。内核在启动时负…

pci驱动开发详解

一、在了解pic启动开发前,作为开发人员需了解以下内核结构体: struct pci_device_id { __u32 vendor, device;/* Vendor and device ID or PCI_ANY_ID*/ __u32 subvendor, subdevice;/* Subsystem IDs or PCI_ANY_ID */ __u32 class, class_…

pci

PCI学习笔记 (2011-01-25 12:18) 标签: PCI 配置空间 枚举 分类: PowerPC架构 1.PCI设备编号 每一个PCI device都有其unique PFA(PCI Fcntion Address) PFA由 bus number、device number、function number组成。 一条PCI总线支持256个PFA&…

pcie驱动介绍

转载: pcie驱动介绍_fight_onlyfor_you的博客-CSDN博客_pcie驱动 PCIE设备的地址由总线号、设备号和功能号组成,分别称为厂家ID、设备ID和设备类代码 我们可以利用lspci工具了解这些概念。PCI工具集的一部分,下载地址为http://mj.ucw.cz…

FeignClient【问题】Method threw ‘feign.codec.DecodeException‘ exception.也许是最简单的解决方法

1.问题详情 Method threw feign.codec.DecodeException exception. # detail Could not extract response: no suitable HttpMessageConverter found for response type [class java.lang.Object] and content type [text/json;charsetUTF-8]Openfeign版本&#xff1a; <…

动态测试数据处理

分类 动态测试数据&#xff1a; 1、确定性数据&#xff1a;能够用明确的数学表达式进行描述的数据称为确定性数据。 Ⅰ、周期数据 Ⅱ、非周期数据 2、随机性数据&#xff1a;无法用明确的数学表达式表述&#xff1b;若在一个…