QEMU源码全解析 —— virtio(4)
接前一篇文章:
本文内容参考:
《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设备相关的数据。
欲知后事如何,且看下回分解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!