温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

qemu Virtio设备该如何创建

发布时间:2022-01-12 14:48:35 来源:亿速云 阅读:271 作者:柒染 栏目:云计算

本篇文章为大家展示了qemu Virtio设备该如何创建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、什么是Virtio?

qemu设备虚拟机化的roadmap可以概括为全虚拟化 -> 半虚拟化 (又可以分为用户空间和内核空间) -> 设备穿透 (又可以分为完整设备穿透和单根虚拟化)。所有的这些演进都是为了提升虚拟设备的性能。

Virtio则是属于一种半虚拟化解决方案,它是一种前后端架构,虚拟机内部需要安装特定的virtio设备驱动作为前端,模拟的设备作为后端,后端可以放在用户空间模拟,也可以放在内核空间模拟。放在内核空间模拟就是vhost的实现,如DPDK,SPDK等。

Virtio代理的好处就是特定的设备驱动前后端通过virtqueue进行通信,virtqueue就是一块前后端共享的memory。从而前后端之间的通信通过对共享memory的读写就可以了,相比较全虚拟机化,每次的读写虚拟设备都需要做vm exit和vm entry,通信的代价变小了。

Virtio带来的不便就是需要开发特定的virtio设备驱动,虚拟机需要安装设备驱动。

二、Virtio balloon设备创建流程

这里分析了virtio balloon设备的创建流程,从qemu指定参数-device xxx设备开始到设备最终的实例化过程。

qemu中设备对象的实现采用了QOM模型,模拟了面向对象语言中的封装、继承和多态。遵循该框架可以很方便的开发新的设备。下图展示了类之间的继承关系。这里比较特别的一点是每一个virtio设备都会有一个伴生的PCI设备,叫做virtio PCI代理设备。该设备主要的作用是实现设备总线相关的功能,而设备类只需要关注设备具体功能的实现。

qemu Virtio设备该如何创建

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。任何一个设备创建的时候都会调用该函数。

qemu Virtio设备该如何创建

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中设置的。

qemu Virtio设备该如何创建

8. 父类的realize函数会一次调用子类的realize函数。接着会调用PCIDeviceClass的realize函数即pci_qdev_realize。

9. 然后依次调用VirtioPCIClass、VirtioBalloonPCIClass的realize函数。从而实现了VirtioBalloonPCI设备的创建。最后还需要创建VirtioBalloon设备,将其挂载到PCI总线上。

10. 即依次调用VirtioDeviceClass、VirtioBalloonDeviceClass的realize函数。VirtioBalloon设备的具体实现就是在函数virtio_balloon_device_realize中。

整个流程如下图所示,类之间的调用流则如类继承关系图中红线所示。

qemu Virtio设备该如何创建

在virtio_balloon_device_realize中,调用virtio_add_queue为设备添加了三个virtqueue。其中两个的回调处理函数为virtio_ballon_handle_output,另一个是virtio_balloon_receive_stats。从而构建了从设备的输入输出通道,以及当收到输入输出信息时调用的回调处理函数。

qemu Virtio设备该如何创建

至此设备创建完成,但是还差最后一步将设备挂载到virtio总线上去。该步骤是在函数virtio_device_realize中实现的。该函数调用vdc->realize创建了具体设备后,会调用virtio_bus_device_plugged,该函数的作用就是将virtio设备插入到virtio总线。

上述内容就是qemu Virtio设备该如何创建,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI