QEMU模拟的VIRTIO设备同时也是PCIE设备,Guest中VIRTIO PCIE驱动与之匹配,根据设备驱动模型,最终触发probe函数virtio_pci_probe()。该probe函数使能PCIE设备,并注册VIRTIO设备,并与VIRTIO-BLK匹配,触发VIRTIO-BLK驱动probe函数。

这里涉及两个驱动:VIRTIO-PCI驱动和VIRTIO-BLK驱动。
作为PCIE驱动,其执行过程基本与其他PCIE驱动步骤类似如下:
通过函数register_virtio_device()注册virtio_device;
其中virto_pci_modern_probe()详细过程如下:

前面VIRTIO PCIE驱动注册virtio_device,根据设备驱动模式,由于加载virtio_driver,最终触发probe函数virtblk_probe()。Probe函数实际上执行block驱动基本操作如下:

除了上述BLOCK层驱动基本操作外,它会通过init_vq()初始化vblk的virtqueue,它会分配vqs,并设置vq对应的callback函数virtblk_done(),且通过函数vdev->config->find_vqs()设置中断用于通知数据处理完成。
该过程分配vqs,并为每个vq分配一个中断,用于通知Guest数据处理完成,中断处理函数最终调用vq->callback(),对于VIRTIO-BLK,调用函数virtblk_done()。同时设置vq,包括设置notify函数,用于通知数据下发完成。