中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录

本文参考以下文章:

VirtIO实现原理——PCI基础

VirtIO实现原理——virtblk设备初始化

特此致谢!

本文对于中移(苏州)软件技术有限公司面试问题中的“(1)virtio会创建哪些设备?”进行解答与解析。

要弄清楚并回答这个问题,首先得从virtio这个“根”上讲起。

传统的设备模拟中,虚拟机内部设备驱动完全不知道自己处在虚拟化环境中。对于网络和存储等设备,I/O操作会完整地走完“虚拟机内核栈->QEMU->宿主机内核栈”这一过程,会产生很多的VM Exit和VM Entry,因此性能很差。

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

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

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

主要包括两部分的内容:一个是VMM创建出模拟的设备,即后端设备;另一个是虚拟机操作系统内部安装好该模拟设备的驱动,即前端驱动。在半虚拟化环境下,设备和驱动都是新的、专门用来适应虚拟化环境的。虚拟机中的设备驱动(前端驱动)与QEMU中的虚拟网卡设备(后端设备)定义一套自己的协议来进行数据传输,通过自己约定的接口,可以很方便地进行通信。virtio即是这样一种利用半虚拟化技术提供I/O性能的框架。

到这儿,就可以初步知道题目的意思了,所谓“virtio会创建哪些设备”主要指的是virtio后端设备都有哪些。具体的设备接下来就会讲到,这里先别着急,且容我慢慢道来。

先来介绍一下virtio框架,如下图所示:

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

  • 前端驱动(Front-End Driver)

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

  • 后端设备(Back-End Device)

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

至此,对于问题“virtio会创建哪些设备?”就有了初步答案。这个问题会转换为virtio后端设备都有哪些?根据上图可知,分为两大类设备virtio PCI控制设备virtio设备。具体来说,就是virtio-pci设备和具体的virtio设备,包括:

1af4:1041  network device (modern)
1af4:1042  block device (modern)
1af4:1043  console device (modern)
1af4:1044  entropy generator device (modern)
1af4:1045  balloon device (modern)
1af4:1048  SCSI host bus adapter device (modern)
1af4:1049  9p filesystem device (modern)
1af4:1050  virtio gpu device (modern)
1af4:1052  virtio input device (modern)

legacy:
#define PCI_DEVICE_ID_VIRTIO_NET         0x1000
#define PCI_DEVICE_ID_VIRTIO_BLOCK       0x1001
#define PCI_DEVICE_ID_VIRTIO_BALLOON     0x1002
#define PCI_DEVICE_ID_VIRTIO_CONSOLE     0x1003
#define PCI_DEVICE_ID_VIRTIO_SCSI        0x1004
#define PCI_DEVICE_ID_VIRTIO_RNG         0x1005
#define PCI_DEVICE_ID_VIRTIO_9P          0x1009
#define PCI_DEVICE_ID_VIRTIO_VSOCK       0x1012
#define PCI_DEVICE_ID_VIRTIO_PMEM        0x1013
#define PCI_DEVICE_ID_VIRTIO_IOMMU       0x1014
#define PCI_DEVICE_ID_VIRTIO_MEM         0x1015

下一回开始对于细节进行讲解,在初步回答此面试问题的基础上,深入回答此问题。

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

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

相关文章

网络安全产品之认识漏洞扫描设备

文章目录 一、什么是漏洞扫描设备二、漏洞扫描设备的主要功能三、漏洞扫描设备的主要技术四、漏洞扫描设备的主要类型五、漏洞扫描设备的使用方式六、漏洞扫描设备如何与其他安全设备联动七、漏洞扫描设备的应用场景 漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在…

eNSP学习——VLAN基础配置及Access接口

目录 原理概述 实验内容: 实验目的: 实验步骤: 实验拓扑 配置过程 实验编址 基本配置 创建vlan 配置Access接口 原理概述 早期的局域网技术是基于总线型结构的。总线型拓扑结构是由一根单电缆连接所有主机,就导致所…

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman,1983年9月推出GNU项目,并发起自由软件运动(free software movement或free/open…

《Linux高性能服务器编程》笔记07

Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第14章 多线程编程14.1 Linux线程概述14…

Pytest基础

第一章、pytest概述 Pytest 是一个功能强大且易于使用的 Python 测试框架,用于编写和运行单元测试、集成测试和功能测试。以下是 Pytest 测试框架的一些主要特点和用法: 特点: 简单易用: Pytest 的语法简单直观,容易…

7.FPR/TNR-机器学习模型性能的常用的评估指标

FPR/TNR指标在机器学习中并不常用,因此,此处简单的介绍相应的概念和公式,帮助大家全面了解机器学习相关的评估指标。 一.FPR/TNR的定义和公式 在机器学习中,性能评估是了解模型在处理任务中的效果的关键部分。FPR(Fa…

C语言题型归纳

请认真掌握背记并自行编程一遍,运行是检验程序正确的唯一标准!!! 数的交换 :利用第三个变量来实现数值的交换 int tmp; tmp a; a b; b tmp; 数的整除 同时被两个数整除 a%b0 && a%c0 数的分解与合并 …

23111 网络编程 面试题

1.进程与线程的区别 进程之间资源是独立的,是资源分配的最小单位,进程的pid是FILE函数的返回的句柄,子进程初始资源是拷贝父进程的,进程分为用户空间和内核空间; 同一进程下的线程之间共享资源,是任务分配…

做FP独立站怎么引流?这个引流法宝收好了!

近年来,由于卖家数量飙升导致平台竞争持续升级,卖家之间的恶性循环竞争以及平台政策的不断调整等,造成了众多亚马逊等跨境卖家纷纷从平台转向独立站。可是,转型做独立站前要先考虑清楚独立站与平台二者之间的区别。 如果在第三方平…

EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格

EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格 对应表格复制 Sub tableTest()Set winhttp CreateObject("winhttp.WinHttpRequest.5.1")Set HTML CreateObject("htmlfile")Set oWindow HTML.ParentWindowUrl "https://www.taiwanlo…

内网穿透、远程桌面、VPN的理解

最近在研究内网穿透的相关技术,然后回想起一些相关的技术,比如说要远程桌面公司的电脑,VPN连入内网等。然后想着在此处记录一下,各个的区别,这个纯粹是从技术层面的理解,此处不详细解释怎么去实现或者用什么…

el-table在鼠标移动到单元格时变为下拉框,否则是普通文本

el-table将多个单元格改为下拉框&#xff0c;导致渲染卡顿&#xff0c;解决方法在鼠标移动到单元格时变为下拉框&#xff0c;否则是普通文本 <el-table-column label"显示方向" width"150px" align"center" key"direction" prop&q…

Jmeter分布式压测过程常见问题

1、JMeter分布式压测试&#xff0c;结果树响应数据为空 解决&#xff1a;打开主控机的jmeter-bin,打开jmeter-properties,将modeStandard 前面的#去掉&#xff0c;保存重启jmeter 2、JMeter压力测试报Address already in use: connect错误 方法一&#xff1a; cmd中&#x…

Javascript--流程控制

目录 数据类型转换 自动类型转换 强制类型转换 流程控制语句 顺序流程 选择流程 单分支 双分支 多分支 switch 循环流程 for循环 while循环 do...while循环 如何选择 continue和break 循环案例 数据类型转换 由于 javascrip 这个语言它是弱类型语言&#xff0c…

SpringBoot实现热部署

一、热部署&#xff08;Hot Swap&#xff09; 从Java1.4起&#xff0c;JVM引入了HotSwap&#xff0c;能够在Debug的时候更新类的字节码。所以使用热部署&#xff0c;可以实现修改代码后&#xff0c;无须重启服务就可以加载修改的代码&#xff0c;但是它只能用来更新方法体。 实…

Git学习笔记:3 git tag命令

文章目录 git tag 基本用法1. 创建标签2. 查看标签3. 删除标签4. 推送标签到远程仓库5. 检出标签 普通提交和标签的区别1. 提交&#xff08;Commit&#xff09;2. 标签&#xff08;Tag&#xff09; git tag 基本用法 git tag 是 Git 中用于管理和操作标签&#xff08;tag&…

2023-2024年重庆职业院校技能大赛“信息安全管理与评估”比赛样题

2023 年重庆职业院校技能大赛&#xff08;高等职业教育&#xff09; “信息安全管理与评估”样题任务书 第一阶段&#xff1a;任务 1 网络平台搭建&#xff08;50 分&#xff09;任务 2 网络安全设备配置与防护&#xff08;250 分&#xff09; 第二阶段&#xff1a;第一部分 网…

web蓝桥杯真题--14、关于你的欢迎语

介绍 营销号&#xff0c;有时候需要一些特定的欢迎语&#xff0c;但针对特定的用户&#xff0c;我们希望可以个性化一点。本题需要在项目文件中修改代码存在的问题&#xff0c;实现根据模版生成特定用户的欢迎语。 准备 本题已经内置了初始代码&#xff0c;打开实验环境&…

Backend - Django URL 路由 重定向

目录 一、url 的 <> 作用 &#xff08;一&#xff09;操作流程 &#xff08;二&#xff09;前端设置链接 1. 包括&#xff1a; 2. 比如 &#xff08;三&#xff09;后端匹配路由 1. 理解 2. 比如 &#xff08;三&#xff09;后端视图的 get( )的参数 1. 理解 …

python绘图创建两个坐标轴 共享一个x轴

在Matplotlib中&#xff0c;可以使用twiny()或者twinx()方法创建一个共享一条轴线的第二个坐标轴&#xff0c;从而实现绘制两个坐标轴的效果 import matplotlib.pyplot as plt import numpy as np# 创建一些示例数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x)#…