DPDK系列之八虚拟化virtio

news2024/11/25 7:25:16

一、virtio的介绍

在一篇文章中对virtio进行了简单的说明。在早期的虚拟化的过程中,无论是KVM还是Vmware亦或是Xen,每个平台想当然的是自己搞自己的IO接口。这就和现在国内的互联各个平台都是大而全一样,怎么可能我用你的支付接口呢?而这样做的结果就是应用方感到非常难受,特别是维护升级以及想改变应用目标的话,这需要的成本不断增加。
而实际上,不管IO如何发展,除非出现一种完全崭新的接口设备,否则它们应用基本逻辑应用没有多大差异,这也为统一设备的接口和提高兼容性打开了大门。
而virtio可以说因时而动,它提供了通用的抽象接口,它是一种半虚拟化的设备抽象接口规范,它在QEMU和KVM中被广泛应用。它分为两部分,即virtio(前端)和vhost(后端)。virtio的数据流交互其实就是通过两个VRing来进行转发的。

二、virtio的框架流程

其主要架构如下:

在这里插入图片描述

从图上可以看出,其共分为了四层,前端驱动和后端驱动,以及中间层的virtio 和virtio ring层。
前端驱动和后端设备通过传输层(中间层两层)来实现数据的通信,其主要的流程图如下:

在这里插入图片描述

前端驱动(virtio)中,主要是虚拟机对virtio模拟设备的驱动程序,用来管理virtio设备,接收虚拟机的请求并根据协议连接virtio设备。在Linux内核中,基本已经实现了一系列的此类前端驱动,如virtio-ballon、virtio-net、virtio-blk和virtio-scsi等等。同时在DPDK中实现了对网络设备的用户态(virtio-pmd)驱动。
传输层,顾名思义,就是用前后端的数据通信,它主要是支持虚拟机和VMM(Hypervisor)之间。正如图上所讲,利用共享内在实现两个虚拟队列来完成数据的传输。前端虚拟队列用于前端动态数据的传输,后端虚拟队列用于前端设备提交的IO请求处理。
后端设备主要承担两类功能,一个是对virtio后端设备的模拟,第二是依据协议处理虚拟机传过来的请求。不过随着技术的进步,又出现了前面提到的vhost,vhost-user、vDPA等等加速方案。

三、DPDK的virtio的应用

在Linux内核中对virtio的抽象实现如下:
1、底层PCI-e设备抽象层,管理检测PCI-e设备,初始化相应设备驱动程序,其通过两个抽象类即virtio_driver和virtio_device来负责此工作
2、中间virio虚拟队列层,其主要是virtqueue,其主要由vring_virtqueue和vring等类来实现
3、上层网络设备抽象层,通过实现底层抽象类virtio_net_driver和dev来提供普通的网络接口使用
而在DPDK基本上也是沿袭了这个路线。
DPDK中对virtio设备的优化:
1、单帧mbuf的网络包收发优化,固定了环表表项和描述符表项的映射
2、Indirect特性在网络发送包中的支持,即发送包只需要一个描述符(普通的包至少需要两个)
这要归功于DPDK中并没有完全实现virtio中对所有相关IO的实现,只是实现了对网卡设备的支持,这样就可以针对其进行具体的上述优化了。

四、源码

DPDK中对相关虚拟化virtio的实现代码主有以下几部分(DPDK主目录/drviers/net/virtio或vhost):
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

其主要内容包括:
1、从整体上讲,在net路径下有vhost和virtio两块;在virtio中有virtio-user及相关抽象实现;而在wirtio-user中又有用户态的vhost等
2、在virtio文件夹中,通过文件名也基本可以判断出其功能:virtio_ethdev.c是上层设备的抽象即前端驱动;而virtio_pci.c是底层抽象即后端的驱动;而virtio_rxtx.c等含有rxtx源码文件都负责传输的,而virtio_ring.h,virtqueue.c又是传输的抽象层
3、virtio_user中又提供了相关用户态的实现,它实现DPDK对容器对virtio的支持并且可以用于与Kernel通信。

把整体的框架框住,下来就可以从头按顺序进行分析,不要着急。

五、总结

virtio一个完整的协议抽象,不可能在一两篇文章中分析介绍完成,所以大家先有一个印象,然后再后面,遇到具体的问题再具体的分析。同时,会根据在DPDK的应用情况,对相关的源码和流程以及相关的体系结构进行整理分析。每天进步一点点吧,不断前行,不断积累,就会有量变到质变的过程。

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

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

相关文章

Python高频面试题——装饰器(带大家理解装饰器的本质)

装饰器概念装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限验证等场景…

【C++】通过stack、queue、deque理解适配器模式

破镜不能重圆,枯木可以逢春。 文章目录一、stack1.stack的介绍2.stack相关OJ题(巧妙利用stack数据结构的特征)3.stack的模拟实现二、queue1.queue的介绍2.queue的相关OJ题(巧妙利用queue数据结构的特征)3.queue的模拟实…

多图片怎么转换成PDF?这招教你轻松转换

多图片怎么转换成PDF?我们经常会传输图片文件给同事或者朋友,但是多张图片的传输比较麻烦,有的时候传输比较慢,而且也不便于查看,所以我们就可以将需要传输的多张图片转换成一个PDF文件,这样查看文件时就可…

mxnet版本与numpy,requests等都不兼容问题

简介 跟着李沐学AI时遇到的mxnet环境问题。 问题 使用pip install mxnet时会重新安装相匹配的numpy和requests,而这新安装的这两个版本不满足d2l所需的版本。 然后报错: ERROR: pips dependency resolver does not currently take into account all …

常用docker命令

帮助启动类命令 镜像命令 docker images options -a :列出本地所有的镜像(含历史映像层) -q :只显示镜像ID。docker search 某个XXX镜像名字 网站 Docker命令 docker search [OPTIONS] 镜像名字 案例 docker search redis option…

【AI绘图学习笔记】奇异值分解(SVD)、主成分分析(PCA)

这节的内容需要一些线性代数基础知识,如果你没听懂本文在讲什么,强烈建议你学习【官方双语/合集】线性代数的本质 - 系列合集 文章目录奇异值分解线性变换特征值和特征向量的几何意义什么是奇异值分解?公式推导SVD推广到任意大小矩阵如何求SV…

【C++的OpenCV】第十二课-OpenCV图像常用操作(九):找到图像的边界(轮廓)findContours()和drawContours()

🎉🎉🎉欢迎各位来到小白piao的学习空间!\color{red}{欢迎各位来到小白piao的学习空间!}欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖💖&#x1f496…

PMP项目管理项目整合管理

目录1 项目整合管理概述2 制定项目章程3 制定项目管理计划4 指导与管理项目工作5 管理项目知识6 监控项目工作7 实施整体变更控制8 结束项目或阶段1 项目整合管理概述 项目整合管理包括对隶属于项目管理过程组的各种过程和项目管理活动进行识别、定义、组合、统一和协调的各个…

Linux服务器还有漏洞?建议使用 OpenVAS 日常检查!

几乎每天都会有新的系统漏洞产生,系统管理员经常忙于管理服务器,有时候会忽略一些很明显的安全问题。扫描 Linux 服务器以查找安全问题并不是很简单的事情,所以有时候需要借助于一些专门的工具。 OpenVAS 就是这样一种开源工具,它…

Easy Deep Learning——池化层

池化是什么?它有什么作用? 还是草地的场景,把草地分成一块块的网格,数量还是太多了,如何继续简化输入数据呢? 这时候可以只取一块网格中所有的小草的大小形状的平均值或者最大值作为一个输入数据,这样就大…

Tik Tok新手秘籍,做好五点可轻松起号

新手做TikTok需要有一个具体的规划布局,如果没有深思熟虑就上手开始的话,很有可能会导致功亏一篑,甚至是浪费时间。因此,想要做好 TikTok,就必须从最基本的运营细节开始,一步一步来,下面为大家分…

近红外荧光染料修饰氨基IR 825 NH2,IR 825-Amine,IR-825 NH2

IR 825 NH2,IR 825-NH2,IR825 Amine,IR825-Amine,新吲哚菁绿-氨基,荧光染料修饰氨基产品规格:1.CAS号:N/A2.包装规格:10mg,25mg,50mg,包装灵活&am…

数据结构(3)— 线性表之顺序存储详解介绍(含代码)

(1)博客代码在数据结构代码---GitHub仓库;线性表介绍线性表的基础概念(1)甲骨文表示:线性表是零个或多个数据元素的有限序列。(2)线性表,顾名思义,就是说这个…

git | git 2023 详细版

文章目录一、Git命令1.2 设计用户签名1.3 初始化本地库1.4 查看本地库状态1.5 添加至暂存区1.6 从暂存区删除1.7 将暂存区的文件提交到本地库1.8 查看版本信息二、Git分支2.1 查看分支2.2 创建分支2.3 切换分支2.4 合并分支三、GitHub3.1 代码克隆clone3.2 给库取别名3.3 推送本…

【服务器管理】Wordpress服务器内存占用太高(优化方案详解)

简述 在刚刚配置完服务器之后,想着试一试wordpress这个功能,结果打开服务器后台,发现本来就不多的内存被占用了一大半。 我真的服了,我还啥都没干呢,就这么多的内存占用,那之后我开始弄了还得了。因此有必…

masstransit的message几个高级用法

1)问题,Class MessageA 基类,Class MessageB继承自MessageA; 用bus.Publish方法本想把有些消息只发给B队列,结果由于其继承关系A队列也获得了消息; 解决方法用send, Uri uri new Uri(RabbitM…

专项攻克——二叉树

文章目录一、二叉树定义、分类二、二叉树的存储结构三、创建二叉树四、遍历方式一、二叉树定义、分类 二叉树:是N个结点的有序集合,该集合或者为空集,或者由一个根节点跟两棵互不相交的、分别称为根节点的左子树或者右子树的二叉树组成。每个…

vue项目打包Gzip压缩,IIS发布

什么是gzip、有何用? gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器)必须共同支持gzip。目前主流的浏览器,Chrome…

18 个重要的 JavaScript 字符串方法

1. trim()它删除了两侧的空白。ECMAScript 2019 中还包含 trimStart() 和 trimStart() 方法。它们与 trim() 相同,但 trimStart() 和 trimEnd() 分别从字符串的开头和结尾删除空格。2. match()match() 方法返回匹配字符串的数组。3. split()split() 方法将字符串转换…

5大GPU厂商共建 | openKylin社区GPU SIG首次例会召开!

3月8日,openKylin社区GPU SIG首次例会以线上形式召开。此次会议由长沙景美集成电路设计有限公司、摩尔线程智能科技(北京)有限责任公司、格兰菲智能科技有限公司、象帝先计算技术(重庆)有限公司等GPU厂商的多位SIG Mai…