Introduction to PCI Stub driver
本文首先介绍为什么要有PCI Stub driver,然后以一个具体的例子演示如何使用PCI Stub driver。
1.为什么要有PCI Stub driver
当你在当前Linux主机上运行时,一个e1000e的Intel PCIe网卡已经和一个e1000e的驱动结合。当你在主机上再运行一个虚拟机,并将该Intel PCIe网卡passthru
给虚拟机时,就会出现问题:虚拟机想自己驱动这个e1000e网卡,e1000e网卡已经有主机上的驱动了,但是一个设备只能有一个驱动,因而会产生冲突。
解决方案:
将pci设备跟目前绑定的驱动分离
将pci设备交予PCI Stub driver接管
- PCI Stub driver是虚拟的driver
- 当pci设备交予PCI Stub driver接管后,主机上的驱动就不能与该pci设备绑定了
- pci-stub driver was introduced to occupy the driver slot for the pci device
将pci设备交给虚拟机,这样虚拟机就可以驱动pci设备了
2.如何使用PCI Stub driver
在本例子中,pci设备为:IGD(Intel Graphics Device),其bdf为0:2:0。1
2
3
4
5gpudevice=`cat /sys/bus/pci/devices/0000:00:02.0/device`
echo "8086 $gpudevice" > /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:00:02.0" > /sys/bus/pci/devices/0000:00:02.0/driver/unbind
echo "0000:00:02.0" > /sys/bus/pci/drivers/pci-stub/bind
第一行获取IGD 的device id。
gpudevice为IGD的device id。
device id是pci config中的Device ID,该值由硬件提供商设置。
第二行指令将IGD的vendor id与device id写入new_id文件中。
第三行指令的作用是解除IGD与当前驱动的绑定。
第四行完成IGD与pci-stub driver的绑定
ls -l /sys/bus/pci/devices/0000\:00\:02.0/driver
现在可以看到IGD的驱动已经是pci-stub 了。
new_id
, unbind
和bind
的更多介绍请阅读:sysfs-bus-pci
参考资料: