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

news2024/12/26 22:31:41

接前一篇文章:

本文内容参考:

《趣谈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),这是后端设备在使用完描述符表后设置的索引,这样前端驱动可以知道哪些描述符已经被用了。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型】800万纯AI战士年末大集结,硬核干货与音乐美食12月28日准时开炫

文章目录 WAVE SUMMIT五载十届,AI开发者热血正当时酷炫前沿、星河共聚!大模型技术生态发展正当时 回望2023年,大语言模型或许将是科技史上最浓墨重彩的一笔。从技术、产业到生态,大语言模型在突飞猛进中加速重构万物。随着理解、生…

【 TES720D】基于国内某厂商的FMQL20S400全国产化ARM核心模块

板卡概述 TES720D是一款基于国内某厂商FMQL20S400的全国产化核心模块。该核心模块将FMQL20S400(兼容FMQL10S400)的最小系统集成在了一个50*70mm的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用在控制领域&a…

STM32CubeIDE 移植 RT-ThreadNano问题总结

问题汇总 用STM32CubeIDE新建工程时,用STM32CubeMX勾选了RTThread系统,但是生产的工程中没有MiddleWare。 原因:因为更换过workspace,更换完成后配置Firmware and software package时选择到了D:\STM32Cube。 解决:STM32CubeIDE系…

【自定义Source、Sink】Flink自定义Source、Sink对redis进行读写操作

使用ParameterTool读取配置文件 Flink读取参数的对象 Commons-cli: Apache提供的,需要引入依赖ParameterTool:Flink内置 ParameterTool 比 Commons-cli 使用上简便; ParameterTool能避免Jar包的依赖冲突 建议使用第二种 使用Par…

038.Python面向对象_三大特性综合案例1

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

书-二分查找找某个数字p155

#include<stdio.h> int main(){int a[10]{1,4,5,6,7,8,23,34,90,14567};int mid;int low0;int high9;while(low<high){mid(lowhigh)/2;//数组分成两段&#xff0c;前一段low-mid&#xff0c;后一段mid-highif (a[mid]<23)//因为已经是排序好的了&#xff0c;所以如…

Android获取Wifi网关

公司有这样一个应用场景&#xff1a;有一台球机设备&#xff0c;是Android系统的&#xff0c;它不像手机&#xff0c;它没有触摸屏幕&#xff0c;所以我们对球机的操作很不方便&#xff0c;于是我们搞这样一个设置&#xff1a;点击球机电源键5次分享出一个热点&#xff0c;然后…

高德地图已达成全球最大规模车道级导航覆盖

近日&#xff0c;高德地图宣布旗下基于北斗卫星导航系统、深度学习模型、惯性导航、泛在信号等前沿技术研发的车道级导航服务&#xff0c;截止目前已支持在国内99%以上的城市和乡镇道路使用。 这意味着即日起&#xff0c;用户在驾车导航时&#xff0c;无论是在城市还是乡镇&am…

AI大模型专题报告:AI大模型及应用加速落地,持续带动算力产业链发展

今天分享的AI系列深度研究报告&#xff1a;《AI大模型专题报告&#xff1a;AI大模型及应用加速落地&#xff0c;持续带动算力产业链发展》。 &#xff08;报告出品方&#xff1a;长城证券&#xff09; 报告共计&#xff1a;23页 1.行业观点 在 TMT 各子板块&#xff1a;电子…

算法设计复习题

一、选择 1.算法要对异常情况进行适当的处理&#xff0c;就是算法的&#xff08;&#xff09;。 A、正确性 B、可用性 C、健壮性 D、可行性 2.&#xff08; &#xff09;指的是算法中描述的操作都可以通过已经实现的基本操作运算有限次实现。 A、可靠性 B、正确性 C、有效性 …

什么是shell?

系统内核是操作系统的基本组成部分&#xff0c;它负责管理系统的硬件和软件资源&#xff0c;并提供一组基本的系统服务。内核是操作系统的核心&#xff0c;控制着计算机的所有主要功能&#xff0c;包括内存管理、进程管理、设备驱动程序、系统调用和安全防护等。内核在计算机中…

python实战教学之python版“张万森,好久不见”

前言 WINTER IS COMING 最近《一闪一闪亮星星》的电影在火热预售中&#xff0c;家人们抢到票了嘛&#xff0c;前两天小编写了一篇“张万森&#xff0c;下雪了”的文章后&#xff0c;收到了不少小伙伴的反馈&#xff1a;“代码的运行结果只有文字&#xff0c;没有雪花啊”&#…

腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足

目录 前言 出现的问题: 解决方法&#xff1a; 编译安装&#xff1a; 极速安装 其他 我的其他博客 前言 说实话&#xff0c;本人也就是个穷学生买不起啥大的服务器啥的&#xff0c;整了个2核 2内存的服务器 用宝塔按mysql5.5是没问题的&#xff0c;一切换8.0就提醒内存不足…

【NLP】RAG 应用中的调优策略

​ 检索增强生成应用程序的调优策略 没有一种放之四海而皆准的算法能够最好地解决所有问题。 本文通过数据科学家的视角审视检索增强生成&#xff08;RAG&#xff09;管道。它讨论了您可以尝试提高 RAG 管道性能的潜在“超参数”。与深度学习中的实验类似&#xff0c;例如&am…

OpenAI 在中国申请 GPT-6、GPT-7 商标;Google 推迟发布 OpenAI 竞品 Gemini 至明年 1 月【无际Ai资讯】

天眼查 app 显示&#xff0c;近日&#xff0c;欧爱运营有限责任公司&#xff08;OPENAI OPCO&#xff0c;LLC&#xff09;申请多枚「GPT-6」「GPT-7」商标&#xff0c;国际分类为科学仪器、网站服务&#xff0c;当前商标状态均为等待实质审查。 此前 OpenAI CEO Sam Altman 在接…

若依源码分析

一.登录 1.1 生成验证码 基本思路 后端生成一个表达式,74?11 74?转成图片,传到前端进行展示 将结果11存入redis 前端代码实现: 请求后端地址:http://localhost/dev-api/captchaImage,通过反向代理解决前后端跨域问题,将请求路径变为:http://localhost:8080/captchaImag…

音频接口芯片GC8416,GC1809,GC8418的芯片描述与比较分析

GC8416 192KHZ数字音频接收芯片 工作电流在32~192之间&#xff0c;可替代CS8416/CIRRUS LOGIC GC1809&#xff0c;GC8418都是24位&#xff0c;192KHZ音频接收芯片 工作电流最高可达192 可替代MS8413

大数据驱动下的人口普查:新时代下的新变革

人口普查数据大屏&#xff0c;是指一种通过大屏幕显示人口普查数据的设备&#xff0c;可以将人口普查数据以可视化的形式呈现出来&#xff0c;为决策者提供直观、准确的人口数据。这种大屏幕的出现&#xff0c;让人口普查数据的利用变得更加高效、便捷。 如果您需要制作一张直观…

Redis7--基础篇8(集群cluster)

1. 集群&#xff08;cluster&#xff09;介绍 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集 的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个…

Android工程怎么调用C/C++代码(保姆级别,每一步截图+讲解)?

文章目录 背景新建工程拷贝/编写C/C代码编写CMake配置文件写Java代码加载动态/静态库java转换c&#xff0c;c转javanative层打印日志Android去调用Java层的native方法对外提供.so/.a库 jar包检查APK里面是否已经被正常包含.so/.a完成 背景 突然想起做了这么久的JNI开发&#…