virtio 学习随笔 —— 一、virtio基础

一、virtio基础

参考文章:
Virtio: An I/O virtualization framework for Linux
virtio: Towards a De-Facto Standard For Virtual I/O Devices
Virtio on Linux

为什么需要virtio?

在半虚拟化技术问世之前,Hypervisor主要依赖于传统的全虚拟化技术来模拟硬件设备。在全虚拟化架构中,Hypervisor需要完整地模拟底层物理设备及其通信机制,也就是通过软件的方式完全模拟一个硬件[1]。虽然这种完全抽象的模拟方式能“欺骗”Guest,使其认为自己正在使用一个真正的硬件外设,但其实现复杂度高、性能开销大的固有缺陷也尤为明显。具体而言,每次Guest对设备的访问都需要经过多层的特权级切换和上下文转换,导致系统整体性能显著下降[2]。

Rusty Russell为了支持他的虚拟化方案Lguest,开发了virtio框架[3],该框架实现了一种新的虚拟化方案——半虚拟化。这种虚拟化技术不再需要Hypervisor 完全模拟硬件,而是由Guest与Hypervisor共同合作以提高设备模拟效率。

 图1:全虚拟化与半虚拟化
在半虚拟化环境中。Guest操作系统知道其运行在虚拟机之中,并且加入了作为前端的驱动程序【Para-drivers】。Hypervisor为特定设备模拟实现后端驱动程序。这里的前后端驱动就是virtio的架构的组成部分,为模拟设备的访问的开发提供标准化接口,以提高代码重用率及增加效率。

观察图一可以发现,Guest需要与Hypervisor协同完成设备模拟。在这种半虚拟化架构中,Guest能够明确感知自身处于虚拟化环境,因此不再直接使用特权指令,而是通过"Hypercall"机制主动向Hypervisor发起服务请求。这种机制的工作原理是:当Guest OS需要执行特权操作时,不再触发会引发VM Exit的敏感指令,而是直接调用预定义的Hypercall接口,通过寄存器传递参数,以类似于函数调用的方式将请求传递给Hypervisor。

virtio架构

除了前端驱动和后端驱动之外,virtio架构还专门定义了两个中间层,用于实现前后端之间的高效通信。这两层中的上层称之为virtio层,该为虚拟队列接口,它将前端驱动与后端驱动在逻辑上连接起来。驱动可以根据需要使用0-N条队列。例如,virtio网络驱动使用两条队列,分别用于收发数据,而virtio块设备驱动仅使用一条队列。虚拟队列作为虚拟化设施,在当前的virtio实现中采用环形缓冲区(rings)结构来跨越Guest和Hypervisor的边界。但是具体实现方式可以是任意的,只要Guest和Hypervisor保持一致的实现标准即可。


上图展示了virtio的架构,系统为五种设备类型提供了前端驱动支持,分别是块设备驱动,网络设备驱动,PCI模拟驱动balloon驱动(用于动态管理客户机内存使用)以及控制台驱动。

[1]: VM/370—A study of multiplicity and usefulness

[2]: What is server virtualization? The ultimate guide

[3]: virtio: towards a de-facto standard for virtual I/O devices

posted @ 2025-08-26 10:30  Groot_Liu  阅读(39)  评论(0)    收藏  举报