VIRTIO SCSI设备的模拟是通过QEMU实现的,除了呈现SCSI设备外,它同样也是PCIE设备。QEMU中定义了VIRTIO SCSI设备如下所示:
TYPE_DEVICE -> TYPE_VIRTIO_DEVICE -> TYPE_VIRTIO_SCSI_COMMON ->TYPE_VIRTIO_SCSI
其中前面为父设备,后面为子设备,相关函数执行顺序为:父设备class_init -> 子设备class_init -> 父设备 instance_init -> 子设备instance_init -> 设备realize具现化
其中重点分析TYPE_VIRTIO_DEVICE和TYPE_VIRTIO_SCSI。
TYPE_VIRTIO_DEVICE执行与VIRTIO PCI设备模拟过程中第一部分一样(见“VIRTIO-BLK代码分析(1)VIRTIO设备的模拟”),VIRTIO PCI设备包含common/isr/device/notify BAR,QEMU模拟并注册这几个BAR MR,这里同时也注册read/write函数。这里不再重复介绍。
TYPE_VIRTIO_SCSI设备的具现化执行如下:
它主要是设置virtqueue的回调函数,这里对于传输命令的vq的回调函数为virtio_scsi_handle_cmd,它负责将虚拟机中传递过来的SCSI命令通过blkio API往Host内核发送。
整体过程如下: