DPDK系列之八虚拟化virtio
一、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的应用情况,对相关的源码和流程以及相关的体系结构进行整理分析。每天进步一点点吧,不断前行,不断积累,就会有量变到质变的过程。
相关文章:
DPDK系列之八虚拟化virtio
一、virtio的介绍 在一篇文章中对virtio进行了简单的说明。在早期的虚拟化的过程中,无论是KVM还是Vmware亦或是Xen,每个平台想当然的是自己搞自己的IO接口。这就和现在国内的互联各个平台都是大而全一样,怎么可能我用你的支付接口呢…...
直播间与2位优秀创作者分享经历
我是卢松松,点点上面的头像,欢迎关注我哦! 昨天,卢松松的直播间好像又被推荐给了2.9万人观看,讲了一个小时后直播间的人数一直攀升,最终冲破了2万人大关。晚些时候,白杨SEO也来到了我的直播间&…...
linux上快速安装 Flarum 指南
一、安装Composer Composer是PHP的依赖管理器(类似于Node.js的npm或Python的 pip ),它可用于当前流行的PHP平台,例如Drupal、Magento等。那么如何安装PHP Composer呢?本文将为大家介绍下在Debian 10上安装PHP Composer的教程。 在安装 Composer 之前,请确保您的 Debian …...
数学不好,英语不行,非本专业,可以学IT吗?
看到很多想入行IT编程的小伙伴,都会问一些比较类似的问题。 比如: 不是计算机专业的,可以学编程吗? 数学一直就不好,可以转行学IT吗? 学编程开发,对英语的要求会不会很高? 01、…...
软件测试13
Linux命令 1.pwd:查看当前所在的路径位置 2.ls:查看当前路径下有哪些文件 3.cd:切换路径 4.touch:创建普通文件,可以创建单文件,也可以创建多文件(touch a,touch b c) 5…...
React(八):引出Hook、useState、useEffect的使用详解
React(八)一、类组件的优劣势1.类组件的优势2.类组件的劣势(1)复杂组件会难以理解(2)复杂的class(3)组件复用状态很难二、Hook初体验useState1.使用Hook的计数器案例2.详解useState&…...
32*4VKL128 LQFP44超低功耗/超低工作电流/抗干扰LCD液晶段码驱动IC/LCD驱动芯片(IC) 适用于激光/红外线测距仪
产品型号:VKL128产品品牌:永嘉微电/VINKA封装形式:LQFP44产品年份:新年份原厂,工程服务,技术支持!VKL128概述:VKL128是一个点阵式存储映射的LCD驱动器,可支持最大128点(3…...
自定义控件(?/N) - 事件分发
一、外部传递到ViewGroup中Activity会通过 getWindow( ) 获取PhoneWindow对象并调用它的superDispatchTouchEvent( ),该方法会调用它(PhoneWindow)的内部类 DecorView 的 superDispatchTouchEvent( ),而它(DecorView&a…...
诗一样的代码命名规范
有文化:落霞与孤鹜齐飞,秋水共长天一色;没文化:太阳落山的时候,看见一只鸟在水上飞;日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力…...
L1-010 比较大小 L1-030 一帮一 L1-015 跟奥巴马一起画方块 L1-035 情人节
本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数,其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出,其间以“->”相连。 输入样例: 4 2 8 输出样例: 2->4->8 // 题目链接 https://pintia.cn/prob…...
打怪升级之如何发送HEX进制的数据出去
Hex数据老大难 不少人都困扰于如何将电脑中读取到的string类型的数据变成整形发送出去。一半来说,不论你调用的通信方式是串口的还是网络的,亦或是PCIE的,其在电脑端的实际情况都是以系统API的形式呈现的。而系统API函数提供的接口ÿ…...
国产8K摄像机拍摄回顾与画面数据反馈
本文分析两款国产8K摄像机,一款是全画幅,一款是M43画幅。一、全新国产全画幅8K B1机器参数数据汇总:全画幅8K 60fps,受益于8K全画幅的优势与大幅升级的图像处理系统,BOSMA 8K摄像机系统提升到新的高度。拍摄支持&#…...
C++中拷贝构造和赋值重载的注意事项以及编译器的优化处理
C中拷贝构造和赋值重载的注意事项以及编译器的优化处理前言1. 拷贝构造和赋值重载的易混淆点和注意事项1.1 易混淆点1.2 注意事项2.编译器对拷贝构造和赋值重载的优化处理前言 本文可以帮助你对下面: (1)何时调用拷贝构造何时调用赋值重载 &a…...
Java设计模式_单例模式
Java设计模式_单例模式 亦称: 单件模式、Singleton 意图 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a…...
刚刚学完CSS :display float,flex flow 傻傻分不清了
目录 描述 示例: CSS 中的 display CSS 中的 float CSS 中的 flex 描述 刚刚学完CSS ,导致浮动(float),弹性布局(display:flex)好几个字段配置属性已经分不清了。 display float 就同层级别…...
python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片
python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、程序的用处 一键视频 可以根据一…...
MySQL OCP888题解048-letter N in slow query log(慢查询日志里的字母N)
文章目录1、原题1.1、英文原题1.2、中文翻译1.3、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3.1、知识点1:mysqldumpslow - 总结缓慢的查询日志文件4、实验4.1、实验14.1.1、实验目的4.1.2、实验前准备4.1.3、实验步骤4.1.4、实验结论5、总结1、原题 1.1…...
数据采集 - 笔记 2
1快速实现西门子S7系列PLC数据采集 快速实现西门子S7系列PLC数据采集 - 知乎 2 什么是时序数据库? 时序数据库(Time Series Database)是一种特殊类型的数据库,用于存储和处理时间序列数据。时间序列数据是指按时间顺序排列的数…...
电子技术——数字IC技术,逻辑电路和设计方法
电子技术——数字IC技术,逻辑电路和设计方法 在我们之前的学习中,我们学习了CMOS技术,然而CMOS技术并不是唯一的数字逻辑技术,因此,本节系统的介绍当今使用的数字技术和逻辑电路族。 数字IC技术和逻辑电路族 逻辑电…...
[ROS2 知识] 包依赖关系和rosdep详述
一、说明 如果你建立一个工作空间,试图将所有包的依赖项搞明白,或者期望将包的依赖项全部安装到工作空间中,您看本文是正确选择。本文将解释如何使用 rosdep 管理外部依赖项。 二、介绍rosdep 2.1 rosdep是何物? rosdep 是 ROS 的依赖管理实用程序,可以与 ROS 包和外部库…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
