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就能够从vring中读取数据信息,进而从内存中读出数据。QEMU完成请求之后,也将数据结构存放在vring中,前端驱动也就可以从vring中得到数据。

vring的基本原理如下图所示:

vring包含三个部分:

第一部分是描述符表(Descriptor Table),用来描述I/O请求的传输数据信息,包括地址、长度等信息;

第二部分是可用的vring(Available Vring),这是前端驱动设置的表示后端设备可用的描述符表中的索引

第三部分是已经使用的vring(Used Vring),这是后端设备在使用完描述符表后设置的索引,这样前端驱动可以知道哪些描述符已经被用了。

欲知后事如何,且看下回分解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/238379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:符号和符号表

文章目录 什么是符号?什么是符号表?全局符号和本地符号1. 全局符号:symtab符号表 2. 本地符号: 符号在汇编阶段符号在链接阶段1.由模块 m 定义并能被其他模块引用的全局符号。2.由其他模块定义并被模块 m 引用的全局符号。3.只被模…

电脑长截图、滚动截图软件!早用早享受!

FastStone Capture软件在屏幕捕捉、滚动截屏、屏幕录制、图片处理方面能力十分突出, 帮助用户以专业的方式来创建所需图片或视频。 最新版本 : FastStone Capture 10.3 软件大小 : 7.75MB 适配系统 : Windows Vista/7/8/10/11,WinXP 软件名称&#xff1a…

VCSA7.0加入Windows AD域失败的处理过程

一、问题现象 vcsa7.0加入AD域时提示“Idm client exception: Error trying to join AD, error code 2453” 二、处理过程 (一)检查是否DNS问题 查看dns是否设置正确,如下: 1. Enable SSH on VCSA. 2. Command> shell 3…

微信小程序---wxs脚本

WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。 WXS 与 JavaScript 是不同的语言,有自己的语法,并不和 JavaScript 一致。 1.wxs和JavaScript的区别 2.wxs脚本基础语法 &a…

短视频引流获客系统:引领未来营销的新潮流

在这个信息爆炸的时代,短视频已经成为了人们获取信息的主要渠道之一。而随着短视频的火爆,引流获客系统也逐渐成为了营销领域的新宠。本文将详细介绍短视频引流获客系统的开发流程以及涉及到的技术,让我们一起来看看这个引领未来营销的新潮流…

CRAMdb:动物微生物组的组成和功能综合数据库

中国中医科学院陈同、石河子大学胡圣伟、倪伟及团队在Nucleic Acids Research发表与动物相关的微生物数据CRAMdb,数据库中包含9430种细菌、278种古细菌、2216种真菌和458种病毒等超1.2万种微生物。与同类型其他数据库对比,CRAMdb囊括微生物更加广泛&…

R语言,table()函数实现统计每个元素出现的频数+并将最终统计频数结果转换成dataframe数据框形式

在 R中,要统计dataframe数据框中每个元素出现的频数,可以使用table()函数。以下是一个示例: 目录 一、创建数据 二、统计第一列每个元素出现的频数 三、统计第二列每个元素出现的频数 四、将频数结果转换为数据框,并改列名 一…

keil生成bin文件(通用型)

有些时候需要在keil里面生成bin文件,但找到的各种方式五花八门,特别是要填写文件路径等没有通用性,搞个不同的工程就得改下,找到这个跟路径无关的代码,进行记录下。 首先还是点开keil的设置: 按照上面的图…

多维时序 | MATLAB实现SAO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现SAO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SAO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SAO-CNN-B…

Flask template+Vue +项目中include引入其他模版(其他模版也会用到vue)的使用探索

项目背景是:团队的历史项目,是flask tmeplate写的前段页面。然后我在一个页面A.html中引入了vue文件,使用了vueelement_ui技术。现在想在此A页面中插入另外一个页面B.html的内容(试图tab分开),因为入口只有…

Cython笔记:基本使用方法

1 Cython 介绍 Cython 是一种编程语言,用于编写 C 扩展的 Python 模块。它结合了 Python 的易用性和 C 的执行效率,旨在提高特定类型的任务的性能,特别是涉及大量数值计算的任务。 1.2 几个特征 1.2.1 Python 语法的基础 Cython 的大部分语…

Echarts 折线图 颜色填充 标记点 相关设置

数据 const xData [小米, 三星, 苹果] const yData [2451, 5415, 4012]配置项 {xAxis: {type: category,data: xData},yAxis: {type: value},series: [{type: line, //设置折线图data: yData,}] }曲线图(平滑过度) smooth: true内容填充(…

HTML如何使用图片链接

文章目录 图片链接的使用常见图片类型PNGJPGGIFBMP 图片链接的使用 在 HTML 中&#xff0c;图像由 标签定义。 是空标签&#xff0c;意思是说&#xff0c;它只包含属性&#xff0c;并且没有闭合标签。 语法&#xff1a; <img src”图片路径" title“鼠标悬浮在图片上…

甲醛处理企业网站效果如何

甲醛往往是新装房间主所担心的问题&#xff0c;而甲醛处理公司则可以处理甲醛问题&#xff0c;市场需求也比较高&#xff0c;虽然具备同城服务属性&#xff0c;但外地或连锁经营也非常适合&#xff0c;而品牌们也遇到一些痛点&#xff1a; 1、品牌宣传拓客难 甲醛处理公司也需…

AI数字人直播能力堪比真人涌入直播大军!

近几年&#xff0c;国内外电商直播产业飞速发展。相关报告显示&#xff0c;截至2022年12月&#xff0c;电商直播用户规模为5.15亿人次&#xff0c;占网民数量的48.2%&#xff0c;总结来说&#xff0c;近一半的网民都在各类直播间购买过商品。 但是随着直播行业不断发展&#xf…

14-Kafka-Day02

第 4 章 Kafka Broker 4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 &#xff08;1&#xff09;启动 Zookeeper 客户端。 bin/zkCli.sh 因为你在配置kafka的时候指定了它的名字。 &#xff08;2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: …

【算法】算法题-20231211

这里写目录标题 一、387. 字符串中的第一个唯一字符二、1189. “气球” 的最大数量三、1221. 分割平衡字符串 一、387. 字符串中的第一个唯一字符 简单 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回…

C++ Qt开发:LineEdit单行输入组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍LineEdit单行输入框组件的常用方法及灵活运用…

加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

文章目录 &#x1f680;前言&#x1f680;异或运算以及与运算&#x1f680;加法的实现&#x1f680;减法的实现&#x1f680;乘法的实现&#x1f680;除法的实现 &#x1f680;前言 这也是阿辉开的新专栏&#xff0c;知识将会很零散不成体系&#xff0c;不过绝对干货满满&…

算法通关村——滑动窗口高频问题

滑动窗口之最长子串 无重复字符的最长子串 LeetCode3. 给定一个字符串s&#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例&#xff1a; 输入&#xff1a;s “abcabcbb” 输出&#xff1a;3 解释&#xff1a;因为无重复字符的最长子串是"abc"&#…