当前位置: 首页 > news >正文

QEMU源码全解析18 —— QOM介绍(7)

接前一篇文章:QEMU源码全解析17 —— QOM介绍(6)

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

上一回完成了对于QOM的第二部分 —— 类型的初始化的讲解。本回继续往下讲解。

前文说过,QOM整个运作包括3个部分:类型的注册、类型的初始化以及对象的初始化。但是这里需要加一个部分 —— 类型的层次结构(这就有点像桃花三结义,后续四弟——赵云赵子龙)。

从上一回讲的type_initilize函数可以看到,类型初始化时会初始化父类型,因此有必要对于类型的层次结构进行专门的介绍,QOM通过这种层次结构实现了类似C++等面向对象语言中的继承概念。

仍以前文中的edu设备为例。为了便于理解和加深印象,再次贴出edu设备相关代码。在hw/misc/edu.c中:

static void pci_edu_register_types(void)
{static InterfaceInfo interfaces[] = {{ INTERFACE_CONVENTIONAL_PCI_DEVICE },{ },};static const TypeInfo edu_info = {.name          = TYPE_PCI_EDU_DEVICE,.parent        = TYPE_PCI_DEVICE,.instance_size = sizeof(EduState),.instance_init = edu_instance_init,.class_init    = edu_class_init,.interfaces = interfaces,};type_register_static(&edu_info);
}
type_init(pci_edu_register_types)

在edu设备的类型信息edu_info结构中有一个parent成员,这就指定了edu_info的父类型的名称。edu设备的父类型是TYPE_PCI_DEVICE,表明edu设备被设计成一个PCI设备。TYPE_PCI_DEVICE的定义在include/hw/pci/pci.h中,如下所示:

#define TYPE_PCI_DEVICE "pci-device"

TYPE_PCI_DEVICE的类型信息在hw/pci/pci.c中,代码如下:

static const TypeInfo pci_device_type_info = {.name = TYPE_PCI_DEVICE,.parent = TYPE_DEVICE,.instance_size = sizeof(PCIDevice),.abstract = true,.class_size = sizeof(PCIDeviceClass),.class_init = pci_device_class_init,.class_base_init = pci_device_class_base_init,
};

其父类型(对于edu设备类型TYPE_PCI_EDU_DEVICE来说是爷类型)是TYPE_DEVICE,在include/hw/qdev-core.h中定义,如下:

#define TYPE_DEVICE "device"

TYPE_DEVICE的类型信息在hw/core/qdev.c中,代码如下:

static const TypeInfo device_type_info = {.name = TYPE_DEVICE,.parent = TYPE_OBJECT,.instance_size = sizeof(DeviceState),.instance_init = device_initfn,.instance_post_init = device_post_init,.instance_finalize = device_finalize,.class_base_init = device_class_base_init,.class_init = device_class_init,.abstract = true,.class_size = sizeof(DeviceClass),.interfaces = (InterfaceInfo[]) {{ TYPE_VMSTATE_IF },{ TYPE_RESETTABLE_INTERFACE },{ }}
};

再往上追根溯源,TYPE_DEVICE的父类型(对于edu设备类型TYPE_PCI_EDU_DEVICE来说是曾祖类型)是TYPE_OBJECT,在include/qom/object.h中定义,如下:

#define TYPE_OBJECT "object"

TYPE_OBJECT的类型信息在qom/object.c中(转回到object.c这个文件了),代码如下:

static const TypeInfo object_info = {.name = TYPE_OBJECT,.instance_size = sizeof(Object),.class_init = object_class_init,.abstract = true,
};

TYPE_OBJECT没有父类了,也就是说到TYPE_OBJECT这就到头了,它是所有能够初始化实例的最终祖先。

回顾一下,edu类型的层次关系为:

TYPE_PCI_EDU_DEVICE -> TYPE_PCI_DEVICE -> TYPE_DEVICE -> TYPE_OBJECT

这里,我不由得想起了封神榜,二郎神杨戬的师傅是玉鼎真人,玉鼎真人的师傅是元始天尊,元始天尊的师傅是鸿钧祖师。在封神榜里到鸿钧老祖这就到头了,什么截教、阐教、道教,好的坏的都是鸿钧老祖的徒子徒孙(当然,封神榜里还能更进一步,西方教的两个教主就不属于鸿钧祖师这一支,而是混鲲道人这一支,也就是说真正的根是鸿钧和混鲲的师傅创始元灵)。讲虚拟化愣讲出《封神榜》来了,回来吧,回来吧。

类似于device,所有interface的祖先都是TYPE_INTERFACE,在include/qom/object.h中定义,如下:

#define TYPE_INTERFACE "interface"

TYPE_INTERFACE的类型信息也在qom/object.c中(就在TYPE_OBJECT上边),代码如下:

static const TypeInfo interface_info = {.name = TYPE_INTERFACE,.class_size = sizeof(InterfaceClass),.abstract = true,
};

还是得回到《封神榜》,这个TYPE_INTERFACE就相当于西方教那一支。也就是说理论上TYPE_OBJECT和TYPE_INTERFACE还应该有一个共同的父亲,即类、接口的父亲,我看应该是系统。不过QEMU中就没再往上追了。

欲知后事如何,且看下回分解。

相关文章:

QEMU源码全解析18 —— QOM介绍(7)

接前一篇文章:QEMU源码全解析17 —— QOM介绍(6) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上一回完成了对…...

【华为OD机试】 选修课

题目描述 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序…...

225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。 int to…...

IDEA将本地项目上传到码云

一、创建本地仓库并关联 用IDEA打开项目,在菜单栏点击vcs->create git repository创建本地仓库, 选择当前项目所在的文件夹当作仓库目录。 二、将项目提交本地仓库 项目名右键就会出现“GIT”这个选项->Add->Commit Directory, 先将项目add…...

Ubuntu更改虚拟机网段(改成桥接模式无法连接网络)

因为工作需要,一开始在安装vmware和虚拟机时,是用的Nat网络。 现在需要修改虚拟机网段,把ip设置成和Windows端同一网段,我们就要去使用桥接模式。 环境: Windows10、Ubuntu20.04虚拟机编辑里打开虚拟网络编辑器&#…...

谷粒商城第七天-商品服务之分类管理下的删除、新增以及修改商品分类

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 删除功能 2.2 新增功能 2.3 修改功能 三、后端部分 3.1 删除接口 3.2 新增接口 3.3 修改接口 四、总结 一、总述 1.1 前端思路 删除和新增以及修改的前端无非就是点击按钮,就向后端发送请求…...

Redis学习路线(1)—— Redis的安装

一、NoSQL SQL VS NoSQL 1、名称 SQL 主要是指关系数据库。NoSQL 主要是指非关系数据库。 2、存储结构 SQL 是结构化的数据库,以表格的形式存储数据。NoSQL 是非结构化的数据库,以Key-Value(Redis),JSON格式文档&…...

《MySQL 实战 45 讲》课程学习笔记(五)

数据库锁:全局锁、表锁和行锁 根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要…...

使用GADL对高程数据进行填洼

对于DEM数据中存在的洼地(sink)问题,可以使用GADL(Geospatial Data Abstraction Library)中的功能进行填洼操作。GADL是一个开源的GIS库,提供了许多对地理空间数据进行处理和分析的功能。 下面是使用GADL对…...

Spring Boot集成Swagger3.0,Knife4j导出文档

文章目录 Spring Boot集成Swagger3.0,Knife4j导出文档效果展示如何使用简要说明添加依赖添加配置类测试接口token配置位置 官网 说明情况 demo Spring Boot集成Swagger3.0,Knife4j导出文档 效果展示 如何使用 简要说明 Knife4j的前身是swagger-bootstrap-ui,前身swagger-boo…...

在.NET Framework中的连接字符串ConnectionStrings属性

在.NET Framework中&#xff0c;ConfigurationManager.ConnectionStrings属性是用来访问在Visual Studio IDE应用程序配置文件中配置的数据库连接字符串的。每个连接字符串在Visual Studio IDE配置文件中都以<add>元素的形式出现&#xff0c;该元素是<connectionStrin…...

kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space

文章目录 现象排查解决 现象 我们信控平台使用Java语言开发&#xff0c;Spring Cloud微服务架构&#xff0c;采用容器化部署&#xff0c;所有服务都部署在docker里面&#xff0c;使用docker-compose进行管理&#xff0c;使用portainer进行监控平台部署客户现场后&#xff0c;一…...

mac卸载与安装指定版本node

一、查看当前node.js版本 node -v 二、卸载当前node.js # 这里是卸载npm的 sudo npm uninstall npm -g# 这里是用来删除node创建的各种文件夹 sudo rm -rf /usr/local/lib/node sudo rm -rf /usr/local/lib/node_modules sudo rm -rf /var/db/receipts/org.nodejs.* sudo rm…...

机器学习深度学习——Dropout

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——权重衰减 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 Drop…...

Intel和AMD 与 x86,ARM,MIPS有什么区别?

先说amd和intel amd和Intel这俩公司的渊源很深&#xff0c;早期时Intel先是自己搞了个x86架构&#xff0c;然后amd拿到了x86的授权也可以自己做x86了。接着intel向64位过渡的时候自己搞了个ia64&#xff08;x64架构&#xff09;但是因为和x86架构不兼容市场反应极差&#xff0…...

QT编写的串口助手

QT编写的串口助手 提前的知识 创建UI界面工程 找帮助文档 添加串口的宏...

C语言字符串的处理

用惯了Java C#这些语言&#xff0c;C语言中处理字符串还是有些不习惯的&#xff0c;所以这里写一下学习笔记。 C中字符串就是字符数组&#xff0c;是指向字符的指针&#xff0c;并且以空字符 \0 结尾&#xff0c;字符串作为函数的参数传递时一般使用指针类型&#xff0c;使用数…...

Docker 阿里云容器镜像服务

阿里云-容器镜像服务ACR 将本地/服务器docker image&#xff08;镜像&#xff09;推送到 阿里云容器镜像服务仓库 1. 在容器镜像服务ACR中创建个人实例 2. 进入个人实例 > 命名空间 创建命名空间 3. 进入个人实例 > 镜像仓库 创建镜像仓库 4. 进入镜像仓库 > 基本信…...

10kV 电力电缆交流耐压试验方案

...

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度6

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

颠覆式突破限制:五大核心技术实现网盘下载加速革命

颠覆式突破限制&#xff1a;五大核心技术实现网盘下载加速革命 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xf…...

智能驾驶之红绿灯识别 斑马线识别 减速带识别 yolo数据集 深度学习数据集 第10625期

智能驾驶之红绿灯识别 斑马线识别 减速带识别 yolo第10625期 README 项目概述 本数据集聚焦于智能驾驶核心道路要素的识别任务&#xff0c;提供高质量标注图像&#xff0c;专为训练和评估目标检测模型而设计。数据涵盖城市道路常见交通设施与标记&#xff0c;适用于自动驾驶感知…...

如何优化A-to-Z-Resources-for-Students文档的行距与段距:提升阅读体验的完整指南

如何优化A-to-Z-Resources-for-Students文档的行距与段距&#xff1a;提升阅读体验的完整指南 【免费下载链接】A-to-Z-Resources-for-Students ✅ Curated list of resources for college students 项目地址: https://gitcode.com/GitHub_Trending/at/A-to-Z-Resources-for…...

Windows下Nessus破解版安装全攻略:从下载到解除限制一步到位

Windows系统下Nessus安全扫描工具的正规安装与使用指南 在网络安全领域&#xff0c;漏洞扫描是保障系统安全的重要环节。Tenable Nessus作为业内知名的漏洞扫描工具&#xff0c;以其全面的漏洞检测能力和稳定的性能赢得了众多安全从业者的青睐。本文将详细介绍如何在Windows环境…...

终极指南:Muzic数据增强技术PDAugment如何通过音高和时长调整提升模型性能

终极指南&#xff1a;Muzic数据增强技术PDAugment如何通过音高和时长调整提升模型性能 【免费下载链接】muzic 这是一个微软研究院开发的音乐生成AI项目。适合对音乐、音频处理以及AI应用感兴趣的开发者、学生和研究者。特点是使用深度学习技术生成音乐&#xff0c;具有较高的创…...

Windows下QT5.15.2安装MQTT模块全攻略(附分支选择避坑指南)

Windows下QT5.15.2安装MQTT模块全攻略&#xff08;附分支选择避坑指南&#xff09; 在物联网开发领域&#xff0c;MQTT协议因其轻量级和高效性成为设备通信的首选方案。对于使用QT5.15.2进行跨平台开发的工程师而言&#xff0c;在Windows环境下正确配置MQTT模块往往是项目起步的…...

如何快速部署AI模型:免费本地化解决方案完整指南

如何快速部署AI模型&#xff1a;免费本地化解决方案完整指南 【免费下载链接】LocalAI mudler/LocalAI: LocalAI 是一个开源项目&#xff0c;旨在本地运行机器学习模型&#xff0c;减少对云服务的依赖&#xff0c;提高隐私保护。 项目地址: https://gitcode.com/GitHub_Trend…...

Celery 入门与原理剖析:从使用到理解

在现代 Web 应用和后台系统中&#xff0c;异步任务处理是提升系统响应速度、解耦业务逻辑的关键技术。Celery 作为 Python 生态中最流行的分布式任务队列框架&#xff0c;因其简洁的 API 和强大的功能被广泛采用。本文将分为两部分&#xff1a;首先演示如何基于 Redis 快速上手…...

如何用G-Helper实现CPU降压调优:华硕笔记本用户的散热与续航提升指南

如何用G-Helper实现CPU降压调优&#xff1a;华硕笔记本用户的散热与续航提升指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other mo…...

跨平台工具链部署指南:Rust工具集多系统安装与配置实践

跨平台工具链部署指南&#xff1a;Rust工具集多系统安装与配置实践 【免费下载链接】coreutils 跨平台的 Rust 重写 GNU 核心工具集。 项目地址: https://gitcode.com/GitHub_Trending/co/coreutils 基础安装篇&#xff1a;三步完成跨平台部署 零依赖极速部署&#xff…...