本篇参考实践Linux 内核文档 :
Documentation/driver-api/vfio-mediated-device.rst
Documentation/driver-api/vfio.rst
step 1:Build and load the mtty.ko module.
This step creates a dummy device, /sys/devices/virtual/mtty/mtty/.
打开内核CONFIG_SAMPLE_VFIO_MDEV_MTTY配置项,重新编译内核生成mtty.ko.
make CONFIG_VFIO_MDEV=m -C /lib/modules/5.4.0-150-generic/build M=/home/zlcao/Workspace/linux/linux-5.4.260/drivers/vfio/mdev/ modules
make CONFIG_SAMPLE_VFIO_MDEV_MTTY=m -C /lib/modules/5.4.0-150-generic/build M=/home/zlcao/Workspace/linux/linux-5.4.260/samples/vfio-mdev/ modules
重启系统,加载mtty.ko, Files in this device directory in sysfs are similar to the following:
$ sudo insmod /home/zlcao/Workspace/linux/linux-5.4.260/drivers/vfio/mdev/mdev.ko
$ sudo insmod /home/zlcao/Workspace/linux/linux-5.4.260/drivers/vfio/mdev//vfio_mdev.ko
$ sudo insmod /home/zlcao/Workspace/linux/linux-5.4.260/samples/vfio-mdev/mtty.ko
mdev groups:
如果支持创建多种不同类型的MDEV设备,可以在设备SYSFS目录下创建多个目录文件,用于操作对应类型的设备。
安装成功后,可以从/sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-#NUM/name文件中看出两类设备的不同,一个是单线TTY,另一个是双线TTY。
2.Create a mediated device by using the dummy device that you created in the previous step:
可以使用任意合法的UUID,一般使用uuid工具生成一个合法有效的uuid:
# echo "83b8f4f2-509f-382f-3c1e-e6bfe0fa1001" > /sys/devices/virtual/mtty/mtty/mdev_supported_types/mtty-2/create
这步操作对应内核中的如下调用堆栈:
在这一步中,创造了MTTY设备,它是一个PCI设备,所以需要设置配置空间:
新设备创建了一个独立的IOMMU GROUP,并将MDEV加入到这个IOMMU GROUP中。
配置空间0x32534348表示vendor id/product id.它对应的设备为CH352 16550 PCI uart串口驱动,