标签:ons slot 内核引导 ack 需求 evel 虚拟机启动 bash comment
转自:https://blog.csdn.net/rong_toa/article/details/110845945
《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》
《提升KVM异构虚拟机启动效率:透传(pass-through)、DMA映射(VFIO、PCI、IOMMU)、virtio-balloon、异步DMA映射、预处理》
《内核引导参数IOMMU与INTEL_IOMMU有何不同?》
《Linux驱动:VFIO概述(vfio/iommu/device passthrough)》
《Linux内核:VFIO Mediated Device(vfio-mdev)内核文档(翻译)》
目录
1. Virtual Function I/O (VFIO) Mediated devices[1]
原文为vfio mediated device内核文档[5],我翻译一下。
对没有内置SR-IOV功能的设备进行DMA虚拟化的需求越来越多。以前,为了虚拟化一个这样的设备,开发者需要自己开发管理接口和API,然后把它们集成到用户态应用中。为了简化这种用户空间软件集成,我们找出了这种设备公共需求然后开发了一种统一的接口。
VFIO驱动框架为直接设备访问提供了统一的API。它将设备直接访问安全地(以一种IOMMU保护的环境)暴露给用户,是一种IOMMU/设备无关的框架。此框架用于多种设备,如GPU、网卡和计算加速器等。有了这种直接设备访问,虚拟机或者用户态应用可以直接访问物理设备。Mdeiated devices便是重用了VFIO这种框架。
Mediated core driver为mdiated device提供了一个公共的管理接口,它可以被不同类型的设备驱动所利用。这个模块提供了的通用接口可以进行如下操作:
Mediated core driver也提供注册总线驱动的接口。比如,一个mediated VFIO mdev驱动就是为mediated devices设计的,并且支持VFIO的API。Mediated bus driver可以将一个mediated device加入或者移出一个VFIO group。
以下的上层图展示了VFIO mediated driver框架的主要组件和接口。这张图展示了NVIDIA、Intel和IBM设备,因为这些设备是首先使用这些模块的。
Mediated core driver提供了如下类型的注册接口:
Mediated总线驱动注册接口
为mediated总线驱动设计的注册接口提供了如下接口来表示mediated设备的驱动:
一个mdev的dediated总线驱动应该在函数调用中使用这个结构来从mediated core driver中注册和注销(unregister)他自己:
extern void mdev_unregister_driver(struct mdev_driver *drv);
这个mediated总线驱动是负责从VFIO group中添加(设备bound时)和删除(设备unbound时)mediated设备(mdev)。
物理设备驱动接口提供了mdev_parent_ops
[3]结构来定义API,用于管理mediated core driver中和物理设备相关的工作。
The structures in the mdev_parent_ops structure are as follows:
mdev_parent_ops
结构中的数据结构如下:
dev_attr_groups
: parent device的属性mdev_attr_groups
: mediated device的属性supported_config
: 定义所支持配置的属性The functions in the mdev_parent_ops structure are as follows:
mdev_parent_ops
结构中的函数如下:
create
: 在driver中为一个mdev分配基本的资源remove
: 当一个mdev被销毁时在driver中free掉相关资源(Note that mdev-core provides no implicit serialization of create/remove
callbacks per mdev parent device, per mdev type, or any other categorization.
Vendor drivers are expected to be fully asynchronous in this respect or
provide their own internal resource protection.)
(注意,mdev-core不为每个mdev parent device、每个mdev类型或者任何其他配置提供create/remove回调的隐式序列化。提供商驱动被期望完全得同步或者提供他们自己的内部资源保护。)
mdev_parent_ops
结构中的回调如下:
open
: 打开mdev的回调close
: 关闭mdev的回调ioctl
: mdev的ioctl回调 callback of mediated deviceread
: read模拟回调write
: write模拟回调mmap
: mmap模拟回调一个驱动应该用在注册到mdev core driver时用mdev_parent_ops
这个结构
However, the mdev_parent_ops structure is not required in the function call
that a driver should use to unregister itself with the mdev core driver::
但是,mdev_parent_ops
结构在从mdev core driver注销时并不需要:
extern void mdev_unregister_device(struct device *dev);
The management interface through sysfs enables user space software, such as
libvirt, to query and configure mediated devices in a hardware-agnostic fashion.
This management interface provides flexibility to the underlying physical
device’s driver to support features such as:
管理接口是通过sysfs来让用户态软件(如libvirt)进行请求和配置mdevs的,这种管理是一种硬件无关的形式。这种管理接口给底层硬件设备驱动提供了灵活的特性支持,比如:
mdev_bus
类目录中的链接/sys/class/mdev_bus/
这个目录包含到已注册到mdev core driver设备的链接。
其中:
sprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);
(或者用mdev_parent_dev(mdev)来访问core mdev代码外的parent device)
其中:
remove
回调失败。例子:
echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove
mdev设备可以在运行时进行创建和绑定。热插拔mdev的步骤和热插拔PCI设备的步骤相同。
以下API用于提供在VFIO驱动中从User PFN到Host PFN的转换:
这些函数会回调后端IOMMU模块(struct vfio_iommu_driver_ops
[4]结构中的pin_pages函数和unpin_pages函数)。挡墙这些回调在TYPE1 IOMMU模块中被支持。其他IOMMU后端模块中(如PPC64 sPAPR模块)若想支持,他们就需要提过这两个回调函数的实现。
samples/vfio-mdev/
文件夹中的mtty.c
是一个展示mdev框架怎么用的简单驱动程序。
这个简单驱动创建了一个mdev设备来模拟一个PCI串口设备。
Step 1 创建和加载mtty.ko
模块:
这步会创建一个dummy设备/sys/devices/virtual/mtty/mtty/
sysfs中的设备目录如下:
Step 2 用这个dummy设备创建一个mdev设备:
Step 3 为qemu-kvm添加如下参数:
Step 4 启动虚拟机
In the Linux guest VM, with no hardware on the host, the device appears
as follows::
在Linux为GuestOS的虚拟机中,设备会被这样显示:
在Linux为GuestOS的虚拟机中,dmesg会有如下输出:
Step 5 在Linux为guestOS的虚拟机中,查看串口设备:
Step 6 用minicom或者其他终端模拟程序,打开串口/dev/ttyS1
或者/dev/ttyS2
并禁用硬件流控制:
Step 7 向minicom终端打字或者发数据给终端模拟程序并读数据
数据会在host mtty驱动回显。
Step 8 销毁所创建的mdev:
# echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove
Documentation/vfio.txt
有VFIO的更多信息,我也在以前的博客中翻译过。include/linux/mdev.h
文件中的struct mdev_driver
结构include/linux/mdev.h
文件中的struct mdev_parent_ops
结构include/linux/vfio.h
文件中的struct vfio_iommu_driver_ops
结构Linux内核:VFIO Mediated Device(vfio-mdev)内核文档(翻译)【转】
标签:ons slot 内核引导 ack 需求 evel 虚拟机启动 bash comment
原文地址:https://www.cnblogs.com/sky-heaven/p/14231853.html