VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

        VHOST SCSI设备的模拟是由QEMU和HOST共同实现的,QEMU模拟VHOST SCSI设备配置空间等,而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。

        在QEMU中VHOST SCSI设备继承关系如下:

        其它设备以及对应class_init函数和realize具现化实现与VIRTIO-SCSI一致,这里介绍TYPE_VHOST_SCSI部分。

VHOST SCSI具现化过程

VHOST SCSI具现化过程如下:

TYPE_VHOST_SCSI设备具现化过程如上图所示:

(1)打开/dev/vhost-scsi文件,用于与HOST内核交互;

(2)调用virtio_scsi_common_realize,用于初始化vq,并设置handle_output为空,因为在HOST上作handle_output,因此QEMU中并不需要设置;

(3)初始化vhost设备,包含如上步骤:

  1. 调用vhost_set_backend_type设置后端类型,这里设置kernel_ops表示在HOST内核上模拟VHOST设备;
  2. 调用vhost_ops->vhost_set_owner,在后端创建内核线程vhost_worker,并与vq关联上;
  3. 调用vhost_ops->vhost_get_features从后端获取支持的features;
  4. 调用vhost_virtqueue_init设置virtqueue CALL机制;
  5. 注册memory_listener_register;

        上述很多操作通过/dev/vhost-scsi进行系统调用,在HOST内核上执行。

VHOST SCSI设备启动过程

当准备工作完成后,启动VHOST设备过程如下:

其中重要的步骤发下:

(1)通过k->set_guest_notifier设置通知guest机制;

(2)启动vhost设备时,包括如下步骤:

  1. 通过vhost_ops->vhost_set_mem_table将虚拟机内存视图传递给HOST内核;
  2. 对于每个vq,与HOST内核设置virtqueue情况,包括设置每个vq的数目,对每个vq设置基地址,将VRING desc/avail/used映射到HVA并往HOST内核设置这些地址,设置KICK机制,设置CALL机制

KVM对应操作

(1)打开/dev/vhost-scsi

分配vhost_scsi,初始化vhost work,设置handle_kick回调函数,用于虚拟机通知HOST设备时的执行函数。

(2)VHOST_SET_OWNER

VHOST_SET_OWNER用于创建内核线程,并将vq与worker关联上。

(3)后端类型设置

后端类型设置通过vhost_set_backend_type实现,这里包括三种VHOST后端:

这里VHOST_KERNEL定义的kernel_ops如下所示:

  1. VHOST_KERNEL,内核用于VHOST后端
  2. VHOST_USER,用户态用于VHOST后端
  3. VHOST_VDPA,VDPA用于VHOST后端

 (4)VHOST_SET_MEM_TABLE

(5)VRING相关的设置

VHOST_SET_VRING_NUM用于在HOST内核中设置VRING支持数目大小

VHOST_SET_VRING_BASE用于在HOST内核中设置VRING的基地址

VHOST_SET_VRING_KICK用于在HOST内核中设置KICK机制的eventfd

VHOST_SET_VRING_CALL用于在HOST内核中设置CALL机制的eventfd

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

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

相关文章

链表-真正的动态数据结构

创建节点 public class Node {T val;Node next;public Node(T val, Node next) {this.val val;this.next next;}public Node() {this(null, null);}public Node(T val) {this(val, null);}} 创建一个空链表 //创建链表public Node header;private int size;public MyLinkedLi…

做一个有灵魂的软件测试员

有没有觉得自己每天的工作千篇一律,每天一上班就盼着下班? 一个月似乎能令自己开心的时间也就是发工资的那一天? 自己的工作生活总感觉被人牵着走,兜兜转转过了一年又一年? 测试员的工作性质决定了与重复、枯燥和乏…

知识库管理工具哪个好?我建议你可以试一下这个!

对于很多企业/用户来说,在职业成长和个人发展的过程中,是需要借助知识库管理工具来进行知识内容沉淀的。 随着工具市场的发展,各种知识库管理工具层出不穷,今天我就结合数据安全、知识管理体系、简单实用三个方面出发,…

HTTP协议(超级详细)

HTTP协议介绍 基本介绍: HTTP:超文本传输协议,是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议,是基于TCP/IP通信协议来传送数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现&#xff0…

Python之设计模式

一、设计模式_工厂模式实现 设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(Goup Of Four)23种设计模式。当然,我们没有必要全部学…

C#回调函数学习1

回调函数(Callback Function)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。…

MySQL--MySQL索引事务

事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。 使用 (1)开启事务:start…

【Flask】会话保持-API授权-注册登录

http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。 以上是基…

logstash通过kafka通道采集日志信息

1.修改文件/opt/app/elk/logstash-7.5.1/config.d/config1.conf,在input下添加kafka采集配置 #192.168.128.130:9103:kafka地址 #topics:主题 kafka {bootstrap_servers > ["192.168.128.130:9103"]group_id > "logstash"topics > [&…

誉天在线项目~ElementPlus Tag标签用法

效果图 页面展现 <el-form-item label"课程标签"><el-tagv-for"tag in dynamicTags":key"tag"class"mx-1"closable:disable-transitions"false"close"handleClose(tag)"style"margin:5px;">…

Attention is all you need 论文笔记

该论文引入Transformer&#xff0c;主要核心是自注意力机制&#xff0c;自注意力&#xff08;Self-Attention&#xff09;机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息&#xff0c;比如我 吃 苹果&#xff0c;前后的输入之间是有…

Oracle数据库体系结构(三)_逻辑结构

Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式&#xff0c;即在数据库管理系统的层面中如何组织和管理数据&#xff0c;与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现&#xff0c;是不可见的&#xff0c;可以通过查询数据库数据字典了解逻…

c++的库函数std::move() 与 完美转发函数 std:: forward 源码

以下是两个注释&#xff1a; &#xff08;2&#xff09;以下是一个实验&#xff1a;

apisix 开发公共对外接口

apisix 开发公共对外接口 1 背景 公司网关改造&#xff0c;使用 Apisix 替换原有的 Springcloud Gateway&#xff0c;原来网关上自带了一个接口 逻辑比较简单&#xff0c;配置文件中有一个开关&#xff1a; 值为 true&#xff0c;则返回 {"status": 200,"m…

算法通关18关 | 回溯模板如何解决排列和单词搜索问题

1. 排列问题 题目 LeetCode46 给定一个没有重复数字的序列&#xff0c;返回其所有可能的全排列&#xff0c; 思路 排列问题的思路同样使用与字母大小写全排列LeetCode784。 元素在使用过一次的时候&#xff0c;在图中第二层的时候&#xff0c;还会再被使用&#xff0c;所以能…

《动手学深度学习 Pytorch版》 6.6 卷积神经网络

import torch from torch import nn from d2l import torch as d2l6.6.1 LeNet LetNet-5 由两个部分组成&#xff1a; - 卷积编码器&#xff1a;由两个卷积核组成。 - 全连接层稠密块&#xff1a;由三个全连接层组成。模型结构如下流程图&#xff08;每个卷积块由一个卷积层、…

【C语言】【数据存储】用%u打印char类型?用char存128?

1.题目一&#xff1a; #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }%u 是打印无符号整型 解题逻辑&#xff1a; 1. 原反补互换&#xff0c;截断 -128 原码&#xff1a;10000000…10000000 补码&#xff1a;11111111…10000000…

【深度学习】 Python 和 NumPy 系列教程(廿五):Matplotlib详解:3、多子图和布局:subplot()函数

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 简单示例 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名&#xff0c;并且具有强大的功能…

vue修改node_modules打补丁步骤和注意事项

当我们使用 npm 上的第三方依赖包&#xff0c;如果发现 bug 时&#xff0c;怎么办呢&#xff1f; 想想我们在使用第三方依赖包时如果遇到了bug&#xff0c;通常解决的方式都是绕过这个问题&#xff0c;使用其他方式解决&#xff0c;较为麻烦。或者给作者提个issue&#xff0c;然…

大数据-玩转数据-Flink状态后端(下)

一、状态后端 每传入一条数据&#xff0c;有状态的算子任务都会读取和更新状态。由于有效的状态访问对于处理数据的低延迟至关重要&#xff0c;因此每个并行任务(子任务)都会在本地维护其状态&#xff0c;以确保快速的状态访问。 状态的存储、访问以及维护&#xff0c;由一个…