中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备2

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

在上一篇文章中,对于面试所提出的问题“virtio会创建哪些设备?”,有了初步答案,即virtio后端设备分为两大类设备:virtio PCI控制设备和virtio设备。具体来说,就是virtio-pci设备和具体的virtio设备。本回对于细节进行讲解,在初步回答此面试问题的基础上,深入回答此问题。

virtio设备的初始化

virtio设备首先需要创建一个PCI设备,叫作 virtio PCI代理设备(就是上边的virtio PCI控制设备),这个代理设备挂到了PCI总线上;接着,virtio代理设备再创建一条virtio总线,这样virtio设备就可以挂到这条总线上了。

首先来看virtio PCI代理设备类型的定义,在hw/virtio/virtio-pci.c中,如下:

static const TypeInfo virtio_pci_info = {.name          = TYPE_VIRTIO_PCI,.parent        = TYPE_PCI_DEVICE,.instance_size = sizeof(VirtIOPCIProxy),.class_init    = virtio_pci_class_init,.class_size    = sizeof(VirtioPCIClass),.abstract      = true,
};

其中:

  • TYPE_VIRTIO_PCI

TYPE_VIRTIO_PCI的定义在include/hw/virtio/virtio-pci.h中,如下:

#define TYPE_VIRTIO_PCI "virtio-pci"
OBJECT_DECLARE_TYPE(VirtIOPCIProxy, VirtioPCIClass, VIRTIO_PCI)
  • TYPE_PCI_DEVICE

TYPE_PCI_DEVICE的定义在include/hw/pci/pci_device.h中,如下:

#define TYPE_PCI_DEVICE "pci-device"
typedef struct PCIDeviceClass PCIDeviceClass;
DECLARE_OBJ_CHECKERS(PCIDevice, PCIDeviceClass,PCI_DEVICE, TYPE_PCI_DEVICE)
  • VirtIOPCIProxy

VirtIOPCIProxy结构的定义也在include/hw/virtio/virtio-pci.h中,如下:

struct VirtIOPCIProxy {PCIDevice pci_dev;MemoryRegion bar;union {struct {VirtIOPCIRegion common;VirtIOPCIRegion isr;VirtIOPCIRegion device;VirtIOPCIRegion notify;VirtIOPCIRegion notify_pio;};VirtIOPCIRegion regs[5];};MemoryRegion modern_bar;MemoryRegion io_bar;uint32_t legacy_io_bar_idx;uint32_t msix_bar_idx;uint32_t modern_io_bar_idx;uint32_t modern_mem_bar_idx;int config_cap;uint32_t flags;bool disable_modern;bool ignore_backend_features;OnOffAuto disable_legacy;/* Transitional device id */uint16_t trans_devid;uint32_t class_code;uint32_t nvectors;uint32_t dfselect;uint32_t gfselect;uint32_t guest_features[2];VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];VirtIOIRQFD *vector_irqfd;int nvqs_with_notifiers;VirtioBusState bus;
};
  • VirtioPCIClass

VirtioPCIClass结构的定义也在include/hw/virtio/virtio-pci.h中,如下:

struct VirtioPCIClass {PCIDeviceClass parent_class;DeviceRealize parent_dc_realize;void (*realize)(VirtIOPCIProxy *vpci_dev, Error **errp);
};

再回顾一下virtio PCI代理设备类型的定义:

static const TypeInfo virtio_pci_info = {.name          = TYPE_VIRTIO_PCI,.parent        = TYPE_PCI_DEVICE,.instance_size = sizeof(VirtIOPCIProxy),.class_init    = virtio_pci_class_init,.class_size    = sizeof(VirtioPCIClass),.abstract      = true,
};

由定义可知,virtio PCI代理设备的父设备是一个PCI设备(.parent        = TYPE_PCI_DEVICE,);virtio PCI代理设备的类型为VirtioPCIClass(.class_size    = sizeof(VirtioPCIClass),);virtio PCI代理设备的实例为VirtIOPCIProxy(.instance_size = sizeof(VirtIOPCIProxy),),注意这是一个抽象设备,所以并不能创建其实例,只能由其子类去创建。

QEMU(源码)中定义了所有virtio设备的PCI代理设备,如virtio balloon PCI设备、virtio scsi PCI设备、virtio crypto PCI设备等。以virtio scsi PCI设备为例,其定义在hw/virtio/virtio-scsi-pci.c中,如下:

static const VirtioPCIDeviceTypeInfo virtio_scsi_pci_info = {.base_name              = TYPE_VIRTIO_SCSI_PCI,.generic_name           = "virtio-scsi-pci",.transitional_name      = "virtio-scsi-pci-transitional",.non_transitional_name  = "virtio-scsi-pci-non-transitional",.instance_size = sizeof(VirtIOSCSIPCI),.instance_init = virtio_scsi_pci_instance_init,.class_init    = virtio_scsi_pci_class_init,
};

virtio设备在系统的设备树中的位置如下图所示:

所有的virtio设备都有一个共同的父类TYPE_VIRTIO_DEVICE。仍以virtio balloon设备为例,virtio balloon设备的定义在hw/virtio/virtio-balloon.c中,如下:

static const TypeInfo virtio_balloon_info = {.name = TYPE_VIRTIO_BALLOON,.parent = TYPE_VIRTIO_DEVICE,.instance_size = sizeof(VirtIOBalloon),.instance_init = virtio_balloon_instance_init,.class_init = virtio_balloon_class_init,
};

其中:

  • TYPE_VIRTIO_BALLOON

TYPE_VIRTIO_BALLOON的定义在include/hw/virtio/virtio-balloon.h中,如下:

#define TYPE_VIRTIO_BALLOON "virtio-balloon-device"
OBJECT_DECLARE_SIMPLE_TYPE(VirtIOBalloon, VIRTIO_BALLOON)
  • TYPE_VIRTIO_DEVICE

TYPE_VIRTIO_DEVICE的定义在include/hw/virtio/virtio.h中,如下:

#define TYPE_VIRTIO_DEVICE "virtio-device"
OBJECT_DECLARE_TYPE(VirtIODevice, VirtioDeviceClass, VIRTIO_DEVICE)
  • VirtIOBalloon

VirtIOBalloon结构的定义在中,如下:

struct VirtIOBalloon {VirtIODevice parent_obj;VirtQueue *ivq, *dvq, *svq, *free_page_vq, *reporting_vq;uint32_t free_page_hint_status;uint32_t num_pages;uint32_t actual;uint32_t free_page_hint_cmd_id;uint64_t stats[VIRTIO_BALLOON_S_NR];VirtQueueElement *stats_vq_elem;size_t stats_vq_offset;QEMUTimer *stats_timer;IOThread *iothread;QEMUBH *free_page_bh;/** Lock to synchronize threads to access the free page reporting related* fields (e.g. free_page_hint_status).*/QemuMutex free_page_lock;QemuCond  free_page_cond;/** Set to block iothread to continue reading free page hints as the VM is* stopped.*/bool block_iothread;NotifierWithReturn free_page_hint_notify;int64_t stats_last_update;int64_t stats_poll_interval;uint32_t host_features;bool qemu_4_0_config_size;uint32_t poison_val;
};

再来回顾一下virtio balloon设备的定义:

static const TypeInfo virtio_balloon_info = {.name = TYPE_VIRTIO_BALLOON,.parent = TYPE_VIRTIO_DEVICE,.instance_size = sizeof(VirtIOBalloon),.instance_init = virtio_balloon_instance_init,.class_init = virtio_balloon_class_init,
};

由定义可知,virtio balloon设备的实例对象为VirtIOBalloon。具体的virtio设备、virtio PCI代理设备以及virtio公共设备的关系如下图所示:

到此,就能够完全、完整地回答“virtio会创建哪些设备?”这一面试问题了:

virtio会创建两类设备:

  • virtio PCI控制设备(也可称作virtio PCI代理设备)

virtio PCI代理设备virtio-pci是一个抽象设备,并不能创建实例,只能由其子类去创建实例,如virtio balloon PCI设备virtio-balloon-pci-base、virtio scsi PCI设备virtio-scsi-pci-base、virtio crypto PCI设备virtio-crypto-pci等。

  • virtio设备

virtio 设备virtio-device是一个抽象设备,并不能创建实例,只能由其子类去创建实例,如virtio balloon设备virtio-balloon-device、virtio scsi设备virtio-scsi-device、virtio crypto设备virtio-crypto-device等。

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

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

相关文章

单调性的应用

1单调性 应用场景&#xff1a;常应用于双指针的进一步优化问题中含义&#xff1a;针对指针 i 1 > i i1>i i1>i一定有 j 1 > j j1>j j1>j或者 j 1 < j j1<j j1<j这样我们就可以利用该性质对算法进行进一步优化&#xff0c;避免一些不必要的遍历…

微软人工智能办公AI工具 Copilot Pro 11项 Copilot 功能

Copilot&#xff08;曾用名 Bing Chat 和 Bing Chat Enterprise&#xff09;在此期间成为了许多用户的日常AI伴侣&#xff0c;并在正式发布后将继续为用户提供AI驱动的网络聊天体验。 微软Copilot官方网址链接&#xff1a;Microsoft Copilot: 你的日常 AI 助手 Copilot详情&am…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

Rollup:打包 TypeScript - React 组件库

调用浏览器摄像头拍照组件 1、前提1、安装依赖2、添加 rollup.config.js 配置3、修改 package.json3.1 添加打包命令3.2 添加组件入口3.3 添加组件声明入口3.4 浏览器支持 1、前提 1.1 通过 create-react-app take-photo --template 创建前端应用 1.2 添加组件 TakePhoto (拍照…

3 - 主从复制结构|持久化|数据类型

主从复制结构&#xff5c;持久化&#xff5c;数据类型 主从复制 没有高可用功能命令行配置修改配置文件&#xff08;永久有效&#xff0c;重启了redis服务依然有效&#xff09; 配置带验证的主从复制主从从配置哨兵服务&#xff08;可实现高可用&#xff09;持久化RDB文件的使用…

幻兽帕鲁服务器多少钱一个?32元你敢信吗?4核16G

幻兽帕鲁服务器多少钱&#xff1f;价格便宜&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;4核32G配置113元1个月、339元3个月&#xff1b;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。阿腾云atengyun.com分享阿里云和腾讯云palwor…

LEETCODE 164破解闯关密码

class Solution { public:string crackPassword(vector<int>& password) { //在比较两个字符串大小时&#xff0c;其实是按照字典序逐个比较它们的字符。首先比较两个字符串的第一个字符&#xff0c;如果它们不相等&#xff0c;则可以根据它们的 ASCII 码大小确定它们…

opencv012 滤波器04 中值滤波,双边滤波

中值滤波 取中位数&#xff0c;可以处理椒盐噪音 CV自带medianBlur函数dst cv2.medianBlur(src, ksize) 参数说明&#xff1a;1.src: 需要滤波的图片&#xff1b;2.ksize&#xff1a;核大小&#xff0c;必须是比1大的奇数【举个例子&#xff1a;3&#xff0c;5&#xff0c;7……

RISC-V RVWMO 内存模型解释

RISC-V RVWMO 内存模型解释 引言 本文介绍 RISC-V RVWMO 内存模型。RVWMO 内存模型定义了什么样的全局内存顺序才是合法的。本引言部分将解释为什么会出现不合法的全局内存顺序&#xff0c;以及为什么需要内存模型。 首先引起乱序的全局内存顺序&#xff08;指令重排序&…

10.多柱状图(MuliBarChart)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 话接上回&#xff08;9.单柱状图&#xff08;SingleBarChart&#xff09;&#xff09;&#xff0c;从单柱拓展到多柱状图。 1.数据设置 private void InitValue(List<BasicSerieDto> dtos){Serie…

14.5 Flash查询和添加数据库数据

14.5 Flash查询和添加数据库数据 在Flash与数据库通讯的实际应用中&#xff0c;如何实现用户的登录与注册是经常遇到的一个问题。登录实际上就是ASP根据Flash提供的数据查询数据库的过程&#xff0c;而注册则是ASP将Flash提供的数据写入数据库的过程。 1.启动Access2003&…

C#,获取与设置Windows背景图片的源代码

为了满足孩子们个性化桌面的需求。 这里发布获取与设置Windows背景图片的源代码。 1 文本格式 using System; using System.IO; using System.Data; using System.Linq; using System.Text; using System.Drawing; using System.Collections; using System.Collections.Gene…

JeecgBoot集成TiDB,打造高效可靠的数据存储解决方案

TiDB简介 TiDB是PingCAP公司自主设计、研发的开源分布式关系型数据库&#xff0c;同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生…

基数排序算法

1. 排序算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a; 通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。比较类排序算法包括&#xff1a;插入排序、希尔排序、选择…

第139期 做大还是做小-Oracle名称哪些事(20240125)

数据库管理139期 2024-01-25 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09;1 问题2 排查3 扩展总结 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle A…

SQL - 事务控制

SQL - 事务控制 文章目录 SQL - 事务控制TCL - 事务事务的边界事务的特性事务的应用 事务隔离等级MySQL支持四种隔离级别 TCL - 事务 **模拟场景&#xff1a;**生活当中转账是转账方账户扣钱&#xff0c;收账方账户加钱。用数据库操作来模拟现实转账。 数据库模拟&#xff1a…

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…

软件设计师——软件工程(五)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

安全防御综合组网实验

题目 要求 生产区在工作时间可以访问服务器区&#xff0c;仅可以访问http服务器。办公区全天可以访问服务器区&#xff0c;其中10.0.2.20 可以访问FTP服务器和http服务器。10.0.2.10仅可以ping通10.0.3.10。办公区在访问服务器区时采用匿名认证的方式进行上网行为管理。办公区…