QEMU源码全解析 —— virtio(4)

接前一篇文章:

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

上一回开始正式结合代码讲解virtio的实现机制和细节。首先给出了virtio PCI代理设备类型的定义,以及其下的一些virtio设备,如virtio balloon PCI设备、virtio scsi PCI设备以及virtio crypto PCI设备。并且给出了virtio设备在系统的设备树中的位置,如下图所示:

由上图可见,所有的virtio设备都有一个共同的父类TYPE_VIRTIO_DEVICE。例如:

  • virtual balloon设备

virtual balloon设备的定义如下(hw/virtio/virtio-balloon.c中):

static const TypeInfo virtio_balloon_info = {
    .name = TYPE_VIRTIO_BALLOON,
    .parent = TYPE_VIRTIO_DEVICE,
    .instance_size = sizeof(VirtIOBalloon),
    .instance_init = virtio_balloon_instance_init,
    .class_init = virtio_balloon_class_init,
};

static void virtio_register_types(void)
{
    type_register_static(&virtio_balloon_info);
}

type_init(virtio_register_types)

关联:

  • virtio balloon PCI设备

virtio balloon PCI设备的定义在hw/virtio/virtio-balloon-pci.c中,代码如下:

static const VirtioPCIDeviceTypeInfo virtio_balloon_pci_info = {
    .base_name             = TYPE_VIRTIO_BALLOON_PCI,
    .generic_name          = "virtio-balloon-pci",
    .transitional_name     = "virtio-balloon-pci-transitional",
    .non_transitional_name = "virtio-balloon-pci-non-transitional",
    .instance_size = sizeof(VirtIOBalloonPCI),
    .instance_init = virtio_balloon_pci_instance_init,
    .class_init    = virtio_balloon_pci_class_init,
};
 
static void virtio_balloon_pci_register(void)
{
    virtio_pci_types_register(&virtio_balloon_pci_info);
}
 
type_init(virtio_balloon_pci_register)
  • virtual scsi设备

virtual scsi设备的定义如下(hw/virtio/virtio-scsi.c中):

static const TypeInfo virtio_scsi_info = {
    .name = TYPE_VIRTIO_SCSI,
    .parent = TYPE_VIRTIO_SCSI_COMMON,
    .instance_size = sizeof(VirtIOSCSI),
    .class_init = virtio_scsi_class_init,
    .interfaces = (InterfaceInfo[]) {
        { TYPE_HOTPLUG_HANDLER },
        { }
    }
};

static void virtio_register_types(void)
{
    type_register_static(&virtio_scsi_common_info);
    type_register_static(&virtio_scsi_info);
}

type_init(virtio_register_types)

关联:

  • virtio scsi PCI设备

virtio scsi PCI设备的定义在hw/virtio/virtio-scsi-pci.c中,代码如下:

static const VirtioPCIDeviceTypeInfo virtio_scsi_pci_info = {
    .base_name              = TYPE_VIRTIO_SCSI_PCI,
    .generic_name           = "virtio-scsi-pci",
    .transitional_name      = "virtio-scsi-pci-transitional",
    .non_transitional_name  = "virtio-scsi-pci-non-transitional",
    .instance_size = sizeof(VirtIOSCSIPCI),
    .instance_init = virtio_scsi_pci_instance_init,
    .class_init    = virtio_scsi_pci_class_init,
};
 
static void virtio_scsi_pci_register(void)
{
    virtio_pci_types_register(&virtio_scsi_pci_info);
}
 
type_init(virtio_scsi_pci_register)
  • virtual crypto设备

virtual crypto设备的定义如下(hw/virtio/virtio-crypto.c中):

static const TypeInfo virtio_crypto_info = {
    .name = TYPE_VIRTIO_CRYPTO,
    .parent = TYPE_VIRTIO_DEVICE,
    .instance_size = sizeof(VirtIOCrypto),
    .instance_init = virtio_crypto_instance_init,
    .class_init = virtio_crypto_class_init,
};

static void virtio_register_types(void)
{
    type_register_static(&virtio_crypto_info);
}

type_init(virtio_register_types)

关联:

  • virtio crypto PCI设备

virtio crypto PCI设备的定义在hw/virtio/virtio-crypto-pci.c中,代码如下:

static const VirtioPCIDeviceTypeInfo virtio_crypto_pci_info = {
    .generic_name  = TYPE_VIRTIO_CRYPTO_PCI,
    .instance_size = sizeof(VirtIOCryptoPCI),
    .instance_init = virtio_crypto_initfn,
    .class_init    = virtio_crypto_pci_class_init,
};
 
static void virtio_crypto_pci_register_types(void)
{
    virtio_pci_types_register(&virtio_crypto_pci_info);
}
type_init(virtio_crypto_pci_register_types)

以virtio balloon设备为例。再次贴出源码,在hw/virtio/virtio-balloon.c中,如下:

static const TypeInfo virtio_balloon_info = {
    .name = TYPE_VIRTIO_BALLOON,
    .parent = TYPE_VIRTIO_DEVICE,
    .instance_size = sizeof(VirtIOBalloon),
    .instance_init = virtio_balloon_instance_init,
    .class_init = virtio_balloon_class_init,
};

static void virtio_register_types(void)
{
    type_register_static(&virtio_balloon_info);
}

type_init(virtio_register_types)

virtio balloon设备的实例对象为VirtIOBalloon。具体的virtio设备、virtio PCI代理设备、virtio公共设备的关系如下图所示:

上图显示了virtio balloon设备对应的几个数据结构及其关系。VirtIOBalloonPCI是virtio balloon PCI代理设备的实例对象,其中包括两个部分:一个是VirtIOPCIProxy,这是virtio PCI代理设备的通用结构,里边存放了具体virtio PCI代理设备的相关成员;另一个是VirtIOBalloon,此结构中存放的是virtio balloon设备的相关数据。其第一个成员是VirtIODevice,也即virtio公共设备的实例对象。VirtIOBalloon剩下的成员是与virtio balloon设备相关的数据。

欲知后事如何,且看下回分解。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/134952445