QEMU源码全解析 —— virtio(1)

2023-12-11 22:52
文章标签 源码 解析 qemu virtio

本文主要是介绍QEMU源码全解析 —— virtio(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接前一篇文章:

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

virtio简介

对于一台虚拟机而言,除了要虚拟化CPU和内存,当然也要虚拟化外部设备,这其中最为典型和关键的是存储和网络。那么这些外部设备应该如何虚拟化呢?

  • 全虚拟化

当然,一种方式(方案)还是完全虚拟化。使用QEMU完全模拟设备,比如,有什么样的硬盘或网卡设备,就使用QEMU模拟一个一模一样的软件的硬盘和网卡设备。这样在虚拟机里边的操作系统看来,使用这些设备和使用物理设备是一样的。传统的设备模拟中,虚拟机内部设备驱动完全不知道自己处在虚拟化环境中。对于网络和存储等,I/O操作会走完整的“虚拟机内核栈 -> QEMU -> 宿主机内核栈”。虽然在这种方式下,做到了完全而真正的虚拟化,但QEMU又充当了翻译官的角色,每个指令都需要与翻译,在此过程(“虚拟机内核栈 -> QEMU -> 宿主机内核栈”)中,会产生很多的VM Exit和VM Entry,性能很差,实在是太慢了。

  • 半虚拟化

另一种方式(方案)是半虚拟化虚拟机里边的操作系统不是一个通用的操作系统,它知道自己是运行在虚拟机里边的也清楚使用的硬盘和网络等设备都是虚拟的,应该加载特殊的驱动才能运行。这些特殊的驱动往往要通过虚拟机里外配合工作的模式,来加速对于物理存储设备和网络设备(等)的使用。而本段的主角——virtio就是采用的此种方式。

virtio方案是旨在提高性能的一种优化方案,在该方案中,虚拟机能够感知到自己处于虚拟化环境,并且会加载相应的virtio总线驱动和virtio设备驱动。

virtio基本原理

在虚拟化技术的早期,不同的虚拟化技术会针对不同硬盘(物理存储)和网络等设备实现不同的驱动。虚拟机里边的操作系统也要根据不同的虚拟化技术及物理存储和网络设备,选择加载不同的驱动。但是,由于硬盘设备和网络设备太多了,驱动纷繁芜杂。

后来就慢慢形成了一定的标准,这就是virtio。顾名思义,virtio就是virtual io的缩写,也即虚拟化I/O设备的意思。virtio负责对于虚拟机提供统一的接口。也就是说,在虚拟机里边的操作系统加载的驱动,以后都统一加载virtio就可以了。

半虚拟化的基本原理如下图所示:

上图主要包括两部分内容:一个是VMM创建出模拟的设备;另一个是操作系统内部安装好该模拟设备的驱动,这个驱动和设备之间使用对应的接口进行通信。

以e1000网卡为例,在传统的全虚拟化方式下,虚拟机内核中的网卡驱动还是与具体的硬件设备相同,也就是说QEMU模拟的是e1000的网卡。虚拟机操作系统还是通过传统的方式进行包的收发。e1000以及其它模拟设备网卡的驱动在收发包的时候,会有很多次的写网卡寄存器或者IO端口的操作,这会导致VM Exit,使得网卡的性能比较差(与上边提到的一致)。

而在半虚拟化环境下,设备和驱动都是新的、专门用来适应虚拟化环境的。虚拟机中的设备驱动与QEMU中的虚拟网卡设备定义一套自己的协议进行数据传输,通过自己约定的接口,可以很方便地进行通信。

virtio即是这样一种利用半虚拟化技术提供I/O性能的框架。virtio框架如下图所示:

virtio是一种前后端架构,包括前端驱动(Front-End Driver)后端设备(Back-End Device)以及自身定义的传输协议。通过传输协议,virtio不仅可以用于QEMU/KVM方案,也可以用于其它的虚拟化方案。如虚拟机可以不必是QEMU,而也可以是其它类型的虚拟机;后端不一定要在QEMU中实现,也可以在内核中实现(这实际上就是vhost方案)。

接下来对以上三个组件做简单介绍:

  • 前端驱动

前端驱动为虚拟机内部的virtio模拟设备对应的驱动每一种前端设备都需要有对应的驱动才能正常运行。前端驱动的主要作用是:1)接收用户态的请求;2)然后按照传输协议将这些请求进行封装;3)再写I/O端口;4)发送一个通知到QEMU的后端设备。

  • 后端设备

后端设备则是在QEMU中,用来接收前端驱动发过来的I/O请求,然后从接收的数据中按照传输协议的格式进行解析。对于网卡等需要实际物理设备交互的请求,后端驱动会对物理设备进行操作,从而完成请求,并且会通过中断机制通知前端驱动。

  • virtio队列

virtio前端和后端驱动的数据传输通过virtio队列(virtio queue,virtqueue)完成一个设备会注册若干个virtio队列,每个队列负责处理不同的数据传输。这些队列有的是控制层面的队列、有的是数据层面的队列。virtqueue是通过vring实现的。vring是虚拟机和QEMU之间共享的一段环形缓冲区。当虚拟机需要发送请求到QEMU的时候就准备好数据,将数据描述放到vring中,写一个I/O端口。然后

这篇关于QEMU源码全解析 —— virtio(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482379

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷