本篇文章为大家展示了qemu Virtio设备该如何创建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联公司是一家专注于网站建设、网站制作与策划设计,勉县网站建设哪家好?创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:勉县等地区。勉县做网站价格咨询:028-86922220
qemu设备虚拟机化的roadmap可以概括为全虚拟化 -> 半虚拟化 (又可以分为用户空间和内核空间) -> 设备穿透 (又可以分为完整设备穿透和单根虚拟化)。所有的这些演进都是为了提升虚拟设备的性能。
Virtio则是属于一种半虚拟化解决方案,它是一种前后端架构,虚拟机内部需要安装特定的virtio设备驱动作为前端,模拟的设备作为后端,后端可以放在用户空间模拟,也可以放在内核空间模拟。放在内核空间模拟就是vhost的实现,如DPDK,SPDK等。
Virtio代理的好处就是特定的设备驱动前后端通过virtqueue进行通信,virtqueue就是一块前后端共享的memory。从而前后端之间的通信通过对共享memory的读写就可以了,相比较全虚拟机化,每次的读写虚拟设备都需要做vm exit和vm entry,通信的代价变小了。
Virtio带来的不便就是需要开发特定的virtio设备驱动,虚拟机需要安装设备驱动。
这里分析了virtio balloon设备的创建流程,从qemu指定参数-device xxx设备开始到设备最终的实例化过程。
qemu中设备对象的实现采用了QOM模型,模拟了面向对象语言中的封装、继承和多态。遵循该框架可以很方便的开发新的设备。下图展示了类之间的继承关系。这里比较特别的一点是每一个virtio设备都会有一个伴生的PCI设备,叫做virtio PCI代理设备。该设备主要的作用是实现设备总线相关的功能,而设备类只需要关注设备具体功能的实现。
virtio balloon设备的创建过程如下:
1. 在main函数中会遍历指定的-device参数,然后调用device_init_func来做设备的初始化。
2. 会依次调用device_init_func-> qdev_device_add -> object_new -> object_initialize_with_type。主要的初始化工作都是在object_initialize_with_type中完成的。
3. 首先会调用type_initialize完成类的初始化。在类的初始化中会设置类的realize回调函数为virtio_balloon_pci_realize。该函数在做类对象的实例化的时候会调用。
4. 之后会调用object_init_with_type做类对象的初始化。会递归从父对象开始执行instance_init。TYPE_DEVICE的instance_init函数为device_initfn。该函数调用执行了object_property_add_bool增加了三个属性。其中realized属性是当设置了对象真正创建的时候调用的。其set回调函数设置为device_set_realized。任何一个设备创建的时候都会调用该函数。
5. 设备类和对象实例初始化完成后会回到qdev_device_add函数,接下来就会进行具体的设备实现过程。
6. 调用object_property_set_bool将realized属性设置为true,从而会调用刚才设置的回调函数device_set_realized。
7. 会首先调用DeviceClass的realize函数即virtio_pci_dc_realize。该函数是在virtio_pci_class_init中设置的。
8. 父类的realize函数会一次调用子类的realize函数。接着会调用PCIDeviceClass的realize函数即pci_qdev_realize。
9. 然后依次调用VirtioPCIClass、VirtioBalloonPCIClass的realize函数。从而实现了VirtioBalloonPCI设备的创建。最后还需要创建VirtioBalloon设备,将其挂载到PCI总线上。
10. 即依次调用VirtioDeviceClass、VirtioBalloonDeviceClass的realize函数。VirtioBalloon设备的具体实现就是在函数virtio_balloon_device_realize中。
整个流程如下图所示,类之间的调用流则如类继承关系图中红线所示。
在virtio_balloon_device_realize中,调用virtio_add_queue为设备添加了三个virtqueue。其中两个的回调处理函数为virtio_ballon_handle_output,另一个是virtio_balloon_receive_stats。从而构建了从设备的输入输出通道,以及当收到输入输出信息时调用的回调处理函数。
至此设备创建完成,但是还差最后一步将设备挂载到virtio总线上去。该步骤是在函数virtio_device_realize中实现的。该函数调用vdc->realize创建了具体设备后,会调用virtio_bus_device_plugged,该函数的作用就是将virtio设备插入到virtio总线。
上述内容就是qemu Virtio设备该如何创建,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。