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

2023-09-17 20:03:35

        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

更多推荐

Android10 Settings系列(四)设置应用信息界面,动态控制应用是否可以在设置中卸载强制停止

一、前言笔者最近又遇到了个新的需求,在settings中针对特定应用,禁用应用管理的强行停止和卸载按钮。于是在这里记录分享一下,加深一下印象,方便下次遇到能够快速解决问题二、准备工作我们知道应用管理在Settings应用中,于是准备好定位。那么如何定位呢,这里有两个工具可以使用layoutinspector和uiaut

Jtti:Ubuntu下如何迁移Thunderbird邮件

要迁移Thunderbird邮件,您需要复制和转移Thunderbird的邮件文件和配置文件。以下是一般的迁移步骤:注意:在进行迁移之前,请确保Thunderbird已经安装在目标Ubuntu系统上。备份旧系统的Thunderbird数据:在源系统上打开Thunderbird,点击“帮助”->“故障排除信息”->“打开

Ubuntu 20.04中docker-compose部署Nightingale

lsb_release-r可以看到操作系统版本是20.04,uname-r可以看到内核版本是5.5.19。sudoaptinstall-ydocker-compose安装docker-compose。完成之后如下图:cd/opt/n9e/docker/进入到/opt/n9e/docker/里边。docker-compo

R语言实现样本量的估算(2)

本文默认α=0.05(sig.level),β=0.2(power),根据研究需要可调整。导入包library(pwr)(1)已知标准差和预期差异1、单样本t检验:某治疗措施预期提高某物质水平8mg/L,标准差为10mg/L。#单样本t检验pwr.t.test(d=8/10,#期望的平均差异/总体标准差sig.leve

HTML5编写旅游网页

网页样例::代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title></hea

关于wParam和lParam

在VC的函数参数中常出现WPARAM和LPARAM,这两个有什么特殊意义么?它们的含义是不是要事先定义?WPARAM和LPARAM一般在消息里面用的很多,其实没有特殊的含义的。是两普通的变量。是怎样通过wParam,lParam传参数的呢?有时候表示点的坐标,有时表示控件的ID,是不是事先定义好的?WPARAM是32位

云原生之使用Docker部署Teedy轻量级文档管理系统

云原生之使用Docker部署Teedy轻量级文档管理系统一、Teedy介绍1.1Teedy简介1.2Teedy特点二、本地环境介绍2.1本地环境规划2.2本次实践介绍三、本地环境检查3.1检查Docker服务状态3.2检查Docker版本3.3检查dockercompose版本四、下载Teedy镜像五、部署Teedy轻

如何通过SQL批量删除重复数据

文章目录前言一、GROUPBY、HAVING是什么二、编写SQL1.查询重复数据2.删除SQL总结前言浅浅记录一下,工作问题。今天在库中看到存在很多重复数据,本文将介绍怎么通过SQL语句批量删除重复数据的一种方式。一、GROUPBY、HAVING是什么我们先来了解一下GROUPBY,HAVING。GROUPBY是SQL

2023年 python结合excel实现快速画图(零基础快速入门)

目录1.适用人群2.环境配置3.基本用法3.1数据读取3.2数据分析3.3数据组装3.4制表:4.快速提升5.效果展示1.适用人群电脑有python环境,会python基本使用,需要短时间内完成大量画图任务的数据分析的人群。(有过matplab相关画图库及echart用户使用起来会很快)2.环境配置pipinstall

从零开始学习 Java:简单易懂的入门指南之Stream流(二十七)

Stream流Stream流1.体验Stream流2.Stream流的常见生成方式3.Stream流中间操作方法4.Stream流终结操作方法5.Stream流的收集操作6.Stream流综合练习Stream流1.体验Stream流案例需求按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以

Gateway核心架构

1Gateway核心架构1.1基本概念路由(Route)是gateway中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:id,路由标识符,区别于其他Route。uri,路由指向的目的地uri,即客户端请求最终被转发到的微服务。order,用于多个Route之间的排序,数值越小排序越靠前,匹配优

热文推荐