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

本文详细解析了VFIO-PCI驱动的拆分过程,重点介绍了probe函数的工作流程,以及VFIO_PCI_Grpoup操作回调中的关键API,如unlocked_ioctl。讨论了如何基于vfio-pci-core设计私有驱动,以解决特定模块的问题.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值