virtio技术(3)virtqueue机制

news2024/9/28 13:28:09

virtio技术(3)virtqueue机制

virtio的关键技术是virtqueue机制,其提供了一套统一的用于virito前端和后端的通信机制。virtqueue的核心数据结构是vring,这是virtio前端驱动和后端Hypervisor虚拟设备之间传输数据的载体。

vring数据结构

vring数据结构示意图如下:
在这里插入图片描述
vring主要由三个部分组成:描述符表(Descriptor Table)、可用描述符表(Avaliable Ring)和已用描述符表(Used Ring)。virtio协议规定,vring结构关联的内存由客户机中的前端驱动负责分配和回收。Linux内核virtio前端驱动定义的vring数据结构如下:

struct vring {
    unsigned int num;   /* vring的队列深度,表示一个VRing有多少个buffer */
    struct vring_desc *desc;    /* 指向Descriptor Table */
    struct vring_avail *avail;  /* 指向Avaliable Ring */
    struct vring_used *used;    /* 指向Used Ring */
};

描述符表

描述符表用于保存一系列描述符,每一个描述符都被用来描述客户机内的一块内存区域。对于这块内存区域,如果存放的是前端驱动写给设备的数据,称这个描述符为out类型的;如果存放的是前端驱动从设备读取的数据,称这个描述符为in类型的。描述符数据结构定义如下:

struct vring_desc {
    __virtio64 addr;   
    __virtio32 len;     
    __virtio16 flags;  
    __virtio16 next; 
}; 

描述符通过以下字段指定内存区域的各个属性:

字段作用
addr表示内存区域在客户机物理地址空间中的起始地址
len该字段的意义取决于该内存区域的读写属性。如果该区域是只写的,数据传递方向只能从后端设备到前端驱动,此时len表示设备最多可以向该内存块写入的数据长度。反之,如果该区域是只读的,此时len表示后端设备必须读取的来自前端驱动的数据量。
flag用于标识描述符自身的特性,一共有三种可选值。VRING_DESC_F_WRITE表示当前内存区域是只写的,即该内存区域只能被后端设备用来向前端驱动传递数据。VRING_DESC_F_NEXT表明该描述符的next字段是否有效。VRING_DESC_F_INDIRECT表明该描述符是否指向一个中间描述符表。
next驱动和设备的一次数据交互往往会涉及多个不连续的内存区域。通常的做法是将描述符组织成描述符链表的形式来表示所有的内存区域。next字段便是用来指向下一个描述符。通过flag字段中的值VRING_DESC_F_NEXT,就可以间接地确定该描述符是否为描述符链表的最后一个。

可用描述符表

可用描述符表用于保存前端驱动提供给后端设备且后端设备可以使用的描述符。可用描述符表由一个flags字段、idx索引字段以及一个以数组形式实现的环组成。可用描述符表数据结构定义如下:

struct vring_avail {
    __virtio16 flags;
    __virtio16 idx;
    __virtio16 ring[];
}; 

各个字段作用描述如下:

字段作用
flags标志位,表示可用描述符表的一些属性,包括是否需要设备在使用了可用描述符表中的表项后发送中断给驱动。
idx用于索引ring数组中下一个可用的位置
ring用于存放描述符链表中作为链表头的描述符在描述符表中的索引

已用描述符表

已用描述符表用于保存后端已经处理并且尚未反馈给驱动的描述。与可用描述符表不同的是,已用描述符表中数组ring的每个元素不仅包含后端设备已经处理的描述符链表的头部描述符在描述符表中的索引,而且由于后端设备可能会向前端驱动写回数据或需要告知驱动写操作的状态,还需要包括一个len字段来记录设备写回数据的长度。已用描述符区域数据结构定义如下:

struct vring_used {
    __virtio16 flags;
    __virtio16 idx;
    struct vring_used_elem ring[];
};

各个字段作用描述如下:

字段作用
flags标志位,表示已用描述符表的一些属性,包括是否需要驱动在回收了已用描述符表中的表项后发送通知给设备
idx用于索引ring数组中下一个已用元素的位置
ring存储已用元素的数组,每个已用元素包括描述符索引和数据长度

使用virtqueue的通信流程

设备使用virtqueue主要包括两部分过程:驱动通过描述符列表和可用描述符表提供数据缓冲区给设备用,和设备使用描述符后再通过已用描述符表归还给驱动。
在这里插入图片描述

前端驱动写入

客户机操作系统通过驱动提供数据缓冲区给设备使用,具体包括以下步骤:

  1. 把数据缓冲区的地址、长度等信息赋值到空闲的描述符中;
  2. 把该描述符指针添加到该虚拟队列的可用环表的头部;
  3. 更新该可用环表中的头部指针;
  4. 写入该虚拟队列编号到Queue Notify寄存器以通知设备。

后端设备使用

每次后端设备取用可用描述符时,需要知道剩余可用描述符在数组ring中的起始位置。后端设备会维护一个变量last_avail_idx,用来标记这个位置。当切换到主机中时,后端设备将检查last_avail_idx和idx的值,数组ring中位于last_avail_idx和idx-1之间的部分就是可供后端设备使用的区域。
在这里插入图片描述
设备使用数据缓冲区后(基于不同种类的设备可能是读取或者写入,或是部分读取或者部分写入),将用过的缓冲区描述符填充已用环表,并通过中断通知驱动。具体的过程如下:

  1. 把使用过的数据缓冲区描述符的头指针添加到该虚拟队列的已用环表的头部;
  2. 更新该已用环表中的头部指针;
  3. 根据是否开启MSI-X中断,用不同的中断方式通知驱动

前端驱动回收

当设备驱动回收已用的设备描述符时,需要知道剩余已用标识符在数组ring中的起始位置,前端驱动会维护一个变量last_used_idx,用来标记这个位置。当切换到虚拟机中时,前端驱动将检查last_used_idx和idx的值,数组ring中位于last_used_idx和idx-1之间的部分便是可供前端驱动回收的区域。
在这里插入图片描述

相关参考

  • 《深入浅出DPDK》
  • 《深入浅出系统虚拟化:原理与实践》
  • 《深度探索Linux系统虚拟化:原理与实现》

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

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

相关文章

Word处理控件Aspose.Words功能演示:使用 Java 将 RTF 转换为 PDF

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

改变podman的存储路径

使用podman容器时,podman会默认使用/var/lib/containers路径作为存储路径,可能会导致根磁盘空间占用过大,那如何修改podman的存储路径呢?本文将带你一起来探讨。 前几天公司的服务器根目录磁盘空间不足了,经过查找问题…

JAVA - fastjson 中 JSONObject 的顺序问题

目录 1. JSONObject 存在的默认排序问题一 1.1. 解决方案一 1.2. 解决方案二 2. JSONObject 存在的默认排序问题二 2.1. 解决方案一 2.2. 解决方案二 在使用 fastjson 中的 JSONObject 有时候会遇到数据顺序发生了变化,而实际需求中需要保持原有的顺序。 1…

【软件测试】测试人的巅峰?测试专家?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 经常有人谈到&#…

如何实现全网置灰?CSS3来解决

文章目录前言正文网站示例核心代码前言 当发生大事时,部分小伙伴会发现:“怎么某APP是灰的?不会是手机出问题了吗?” 然后再打开其他APP,发现:“都是灰的啊!明白了,看来是有大事发生…

UKF 无迹卡尔曼滤波

目录参考:UKF数学原理:UKF的基本非线性系统描述:计算sigma point和权重参数UKF的基本预测步和更新步:UKF代码实现:参考: UKF数学原理: UKF的基本非线性系统描述: The UKF takes i…

vue element-ui 手机号校验 验证码校验 获取验证码倒数60秒无样式实现模板

上一篇其实发过了。。。 但是实在真的是太丑了 丑到自己看不下去了 加个对话框好看很多&#xff0c;再发一次 原链接为&#xff1a;https://blog.csdn.net/ZZDT099/article/details/128496693?spm1001.2014.3001.5502 <template><el-dialog title"校验手机号…

算法:反转图像(旋转的矩阵)

前言 今天要介绍的是一个较为经典的算法题&#xff1a;反转图像或者旋转矩阵。这道题的原题是Leetcode上的一道题&#xff0c;在题库序号为48。具体内容粘贴如下&#xff1a; 这种题目就是一个典型的倒置矩阵的思路&#xff0c;大体内容就是将一个矩阵逆向反转90度。首先针对…

Spring Boot学习篇(四)

Spring Boot学习篇(四) 1 BLOB(二进制大类型) 1.1 创建tb_blob表,其sql语句如下所示 CREATE TABLE tb_blob(id number primary key,fname VARCHAR2(50) NOT NULL,f blob )1.2 在entity包下面创建TbBlob实体类 package com.zlz.entity;import lombok.AllArgsConstructor; im…

【嵌入式】NXP/LPC使用GPIO+定时器模拟UART串口接收

目录 一 项目背景 二 原理说明 三 设计实现--GPIO部分 四 设计实现--定时器部分 五 总结 一 项目背景 项目需要使用485串口编码器&#xff0c;编码器的数据以波特率9600持续向外发送。接收端计划使用485转换芯片MCU串口。但是片上的外设资源已经被占用了&#xff0c;没有多…

19.删除链表的倒数第N个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#…

车辆未冲洗抓拍识别 工地车辆冲洗监测 opencv

车辆未冲洗抓拍识别 工地车辆冲洗监测系统t通过opencvpython可以对进出车辆冲洗情况进行自动识别&#xff0c;发现冲洗不合格自动进行抓拍存档。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API&#xff0c;结合了Op…

如何对美国服务器响应速度进行优化

决定一个网站加载速度的最大因素之一是服务器的响应时间。服务器响应时间是你的服务器响应用户请求的速度&#xff0c;它可以大大影响你网站的用户体验。本文中&#xff0c;我们将讨论如何确定美国服务器响应时间慢的原因&#xff0c;尤其是如何对美国服务器响应速度进行优化。…

初探Lua脚本

1、什么是Lua Lua脚本是一个由C语言编写的小巧脚本语言&#xff0c;在所有脚本引擎中&#xff0c;Lua的速度是最快的。Lua的核心代码不过一万多行&#xff0c;因为是C语言编写的&#xff0c;因此Lua可以在几乎所有的操作系统和平台进行编译运行 2、Lua适用场景 1&#xff09;…

minio分布式集群部署

minio分布式集群部署 分布式 Minio 可以让你将多块硬盘或者多台服务器组成一个对象存储服务。由于硬盘分布在不同的节点上&#xff0c;分布式 Minio 避免了单点故障。MinioMinio分布式模式可以帮助你搭建一个高可用的对象存储服务&#xff0c;你可以使用这些存储设备&#xff…

七种分布式系统的解决方案,一次性讲给你听!

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 TB级数据放在一台机器上&#xff1a;难啊&#xff01;到底啥是分布式存储&#xff1f;那啥又是分布式存储系统呢&#xff1f;天哪&#xff01;某台机器宕机了咋办&#xff1f;Master节点如何感知到数据副本消失…

nps内网穿透

nps服务端: linux, 公网ip npc客户端: windows, 内网 文件提取 链接&#xff1a;https://pan.baidu.com/s/1HgujpVoXpLxQ-IgAnI2Izg 提取码&#xff1a;8hyl nps安装 1.上传压缩包到服务器, 解压 2.修改conf文件夹下nps.conf文件 #HTTP(S) proxy port, no startup if em…

vue3 antd项目实战——Form表单使用【v-model数据的双向绑定,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框&#xff08;Radio&#xff09;的使用以及Form表单的双向绑定知识调用&#xff08;form表单的源代码附在文章最后&#xff09;场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…

JVM 面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

C语言:预处理(1)

程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境&#xff1a; 第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第二种是执行环境&#xff0c;它用于实际执行代码。 翻译环境&#xff1a; 组成一个程序的每个…