一、什么是 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 代理设备。该设备主要的作用是实现设备总线相关的功能,而设备类只需要关注设备具体功能的实现。
(免费订阅,永久学习)学习地址: