QEMU源码全解析14 —— QOM介绍(3)

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

本文内容参考:

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

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

特此致谢!

上回书讲到了QOM中第一部分——类型的注册,讲了一半,本文接着往下讲。

进入QEMU的main函数不久,就以MODULE_INIT_QOM为参数调用了函数module_call_init(也是上文书讲过的)。那么具体是什么时候调用的module_call_init(MODULE_INIT_QOM)?在QEMU源码qemu-7.1.0(7.1.0版本源码)中搜索此关键字,会有很多地方,那么哪一个才是main函数不久后调用到的?

QEMU源码全解析7 —— QEMU主函数中我曾经讲过main函数,是在softmmu/main.c中,为了便于理解和加深印象,再次贴出源码:

int qemu_main(int argc, char **argv, char **envp)
{int status;qemu_init(argc, argv, envp);status = qemu_main_loop();qemu_cleanup();return status;
}#ifndef CONFIG_COCOA
int main(int argc, char **argv)
{return qemu_main(argc, argv, NULL);
}
#endif

主函数所在的位置是在softmmu目录下,那么理论上应该从上述关键字搜索结果中找到同目录下的那个module_call_init(MODULE_INIT_QOM),它最有可能是我们要找的。在softmmu目录下的runstate.c中确实有一处调用,代码如下:

void qemu_init_subsystems(void)
{Error *err = NULL;os_set_line_buffering();module_call_init(MODULE_INIT_TRACE);qemu_init_cpu_list();qemu_init_cpu_loop();qemu_mutex_lock_iothread();atexit(qemu_run_exit_notifiers);module_call_init(MODULE_INIT_QOM);module_call_init(MODULE_INIT_MIGRATION);runstate_init();precopy_infrastructure_init();postcopy_infrastructure_init();monitor_init_globals();if (qcrypto_init(&err) < 0) {error_reportf_err(err, "cannot initialize crypto: ");exit(1);}os_setup_early_signal_handling();bdrv_init_with_whitelist();socket_init();
}

是在qemu_init_subsystems函数中调用了module_call_init(MODULE_INIT_QOM);。而qemu_init_subsystems函数又是在qemu_init函数中被调用的,代码片段如下(softmmu/vl.c中):

void qemu_init(int argc, char **argv, char **envp)
{QemuOpts *opts;QemuOpts *icount_opts = NULL, *accel_opts = NULL;QemuOptsList *olist;int optind;const char *optarg;MachineClass *machine_class;bool userconfig = true;FILE *vmstate_dump_file = NULL;qemu_add_opts(&qemu_drive_opts);qemu_add_drive_opts(&qemu_legacy_drive_opts);qemu_add_drive_opts(&qemu_common_drive_opts);qemu_add_drive_opts(&qemu_drive_opts);qemu_add_drive_opts(&bdrv_runtime_opts);……qemu_init_subsystems();……}

这就很清楚了,函数调用链为:main() -> qemu_main() -> qemu_init() -> qemu_init_subsystems() -> module_call_init(MODULE_INIT_QOM)。

弄清楚这一点之后,回到主题。为便于理解,再贴一下module_call_init函数代码(util/module.c中):

void module_call_init(module_init_type type)
{ModuleTypeList *l;ModuleEntry *e;if (modules_init_done[type]) {return;}l = find_type(type);QTAILQ_FOREACH(e, l, node) {e->init();}modules_init_done[type] = true;
}

module_call_int函数执行了init_type_list[MODULE_INIT_QOM]链表上每一个ModuleEntry的init函数。

仍然以edu为例,该类型的init函数是pci_edu_register_types(前文中讲到的hw/misc/edu.c中的一句:type_init(pci_edu_register_types)),该函数在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)

pci_edu_register_types函数唯一的工作是构造了一个TypeInfo类型的edu_info,并将其作为参数调用了type_register_static。

更多细节和分析请看下回。

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

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

相关文章

大学生活题解

样例输入&#xff1a; 3 .xA ... Bx.样例输出&#xff1a; 6思路分析&#xff1a; 这道题只需要在正常的广搜模板上多维护一个— —方向&#xff0c;如果当前改变方向&#xff0c;就坐标不变&#xff0c;方向变&#xff0c;步数加一&#xff1b;否则坐标变&#xff0c;方向不…

视频讲解Codeforces Round 887 (Div. 2)(A--C)

文章目录 A. Desorting1、板书2、代码 B. Fibonaccharsis1、板书2、代码 C. Ntarsis Set1、板书2、代码 视频讲解Codeforces Round 887 (Div. 2)&#xff08;A–C&#xff09; A. Desorting 1、板书 2、代码 #include<bits/stdc.h> #define endl \n #define INF 0x3f…

Amazon Linux上使用ec2-user来设置开机自启动的shell脚本

要在Amazon Linux上使用ec2-user来设置开机自启动的shell脚本&#xff0c;可以按照以下步骤操作&#xff1a; 1. 确保您拥有要设置自启动的shell脚本。假设脚本的路径是/home/ec2-user/myscript.sh。 2. 使用以下命令打开/etc/rc.d/rc.local文件&#xff1a; shell sudo nano /…

2023年的深度学习入门指南(20) - LLaMA 2模型解析

2023年的深度学习入门指南(20) - LLaMA 2模型解析 上一节我们把LLaMA 2的生成过程以及封装的过程的代码简单介绍了下。还差LLaMA 2的模型部分没有介绍。这一节我们就来介绍下LLaMA 2的模型部分。 这一部分需要一些深度神经网络的基础知识&#xff0c;不懂的话不用着急&#xf…

notepad++ 正则表达式查找特定字符串

批量文本的处理方法 在报文中有很多指标和值都具有固定的格式&#xff0c;比如是 a"1" 这类格式&#xff0c;那么我们只取前面的指标a&#xff0c;就会比较复杂&#xff0c;而使用正则表达式就会快乐许多&#xff01; 采用以下第二种方法 查找目标 (.?)\" …

Python电商爬虫保姆级入门教程(纯新手向)

图灵Python课堂 长沙图灵教育于2001年开始进入教育行业&#xff0c;立足泛IT类职业教育&#xff0c;以打造高新技术人才为宗旨&#xff0c;专注于提供多层次、个性化的职业技能培训课程&#xff0c;为各行业培养技术开发、应用和管理等岗位的中高端人才&#xff0c;致力于成为…

【无标题】自定义类型:位段,枚举,联合

自定义类型&#xff1a;位段&#xff0c;枚举&#xff0c;联合 1. 位段1.1 什么是位段1.2 位段的内存分配1.3 位段的跨平台问题 2. 枚举2.1 枚举类型的定义2.2 枚举类型的优点2.3 枚举的使用 3. 联合&#xff08;共用体&#xff09;3.1 联合类型的定义3.2联合的特点3.2.1 相关面…

LUMEN技术要点总结

LUMEN总结 主题是动态全局光照和Lumen Lumen更像是一个各种GI算法的集大成者。 1. 如何理解lumen及全局光照的实现机制 渲染方程 至今为止所有的实时光照都是按照Render Equation来进行渲染的&#xff0c;我们做得到只是在无限的逼近它。 我们把只进行一次反弹叫做SingleBou…

CentOS实现html转pdf

CentOS使用实现html转PDF&#xff0c;需安装以下软件&#xff1a; yum install wkhtmltopdf # 转换工具&#xff0c;将HTML文件或网页转换为PDFyum install xorg-x11-server-Xvfb # 虚拟的X服务器&#xff0c;在无图形界面环境下运行图形应用程yum install wqy-zenhei-fonts #…

centos制作openssh 9.3p2 rpm包

标题使用源码制作openssh 9.3p2 的rpm包 准备&#xff1a; 操作系统&#xff1a;CentOS Linux release 7.4.1708 (Core) #测试发现rpm包要在什么系统安装需要就需要在什么系统上制作 工具软件&#xff1a;rpm-build 源码文件&#xff1a;openssh-9.3p2.tar.gz x11-ssh-askpas…

[AT_cf_2015_relay_g]题解

洛谷链接&ATcoder链接 题目翻译&#xff1a; 您将从 n n n 种主菜和 m m m 种副菜中选择菜品来创建一道套餐。您只能选择一种主菜&#xff0c;但可以选择任意数量的副菜。此外&#xff0c;也可以选择不选任何副菜。无论是主菜还是副菜&#xff0c;每种菜品只能选择一道…

【UniApp开发小程序】悬浮按钮+出售闲置商品+商品分类选择【基于若依管理系统开发】

文章目录 界面效果界面实现悬浮按钮实现商品分类选择界面使元素均匀分布 闲置商品描述信息填写界面价格校验 界面效果 【悬浮按钮】 【闲置商品描述信息填写界面】 【商品分类选择界面】 【分类选择完成】 界面实现 悬浮按钮实现 悬浮按钮漂浮于页面之上&#xff0c;等页面…

opencv-20 深入理解HSV 色彩空间(通过指定,标记颜色等来拓展ROI区域)

RGB 色彩空间是一种被广泛接受的色彩空间&#xff0c;但是该色彩空间过于抽象&#xff0c;我们不能够直接通过其值感知具体的色彩。 我们更习惯使用直观的方式来感知颜色&#xff0c;HSV 色彩空间提供了这样 的方式。 通过 HSV色彩空间&#xff0c;我们能够更加方便地通过色调、…

Python补充笔记5-模块化、文件

目录 一、模块 二、模块的导入 三、python中的包​编辑 四、常用的内容模块 五、第三方模块的安装与使用 六、编码格式的介绍 七、文件读写的原理 八、常用的文件打开模式 ​九、文件对象的常用方法 十、with语句​编辑 十一、os模块的常用函数 十二、os.path模块的常用方法​编…

今天学学消息队列RocketMQ:消息类型

RocketMQ支持的消息类型有三种&#xff1a;普通消息、顺序消息、延时消息、事务消息。以下内容的代码部分都是基于rocketmq-spring-boot-starter做的。 普通消息 普通消息是一种无序消息&#xff0c;消息分布在各个MessageQueue当中&#xff0c;以保证效率为第一使命。这种消息…

Staples Drop Ship EDI 需求分析

Staples 是一家美国零售公司&#xff0c;总部位于马萨诸塞州弗拉明汉&#xff0c;主要提供支持工作和学习的产品和服务。该公司于 1986 年在马萨诸塞州布莱顿开设了第一家门店。到 1996 年&#xff0c;该公司已跻身《财富》世界 500 强&#xff0c;后来又收购了办公用品公司 Qu…

【深入了解pytorch】PyTorch卷积神经网络(CNN)简介

【深入了解pytorch】PyTorch卷积神经网络(CNN) PyTorch卷积神经网络(CNN)简介卷积层的原理池化层的原理全连接层的原理使用PyTorch实现CNN模型结论PyTorch卷积神经网络(CNN)简介 卷积神经网络(Convolutional Neural Network,CNN)是一种在计算机视觉任务中广泛应用的深…

MySQL优化(面试)

文章目录 通信优化查询缓存语法解析及查询优化器查询优化器的策略 性能优化建议数据类型优化索引优化 优化关联查询优化limit分页对于varchar end mysql查询过程: 客户端向MySQL服务器发送一条查询请求服务器首先检查查询缓存&#xff0c;如果命中缓存&#xff0c;则立刻返回存…

TCP/IP的分包粘包

TCP/IP的分包粘包 分包粘包介绍导致分包粘包的原因导致TCP粘包的原因&#xff1a;导致TCP分包的原因&#xff1a;避免分包粘包的措施 分包粘包介绍 因为TCP为了减少额外开销&#xff0c;采取的是流式传输&#xff0c;所以接收端在一次接收的时候有可能一次接收多个包。而TCP粘…

面试题-TS(一):TypeScript是什么?它与JavaScript有什么区别?

面试题-TS(一)&#xff1a;TypeScript是什么?它与JavaScript有什么区别? TypeScript是一种编程语言&#xff0c;它是JavaScript的超集。它通过添加静态类型、类、接口和模块等功能来扩展JavaScript。 JavaScript是一种广泛应用于Web开发的脚本语言&#xff0c;它的灵活性和…