QEMU源码全解析34 —— Machine(4)
接前一篇文章:QEMU源码全解析33 —— Machine(3)
本文内容参考:
《趣谈Linux操作系统》 —— 刘超,极客时间
《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社
特此致谢!
上一回围绕DEFINE_I440FX_MACHINE宏进行了详细解析,本回讲一下QEMU初始化中与有machine关的部分。
在QEMU老版本中,主函数main中会调用select_machine函数,新版本中放到了main() -> qemu_main() -> qemu_init() -> qemu_create_machine -> select_machine()。
我们从qemu_create_machine函数开始看起。qemu_create_machine函数在softmmu/vl.c中,代码如下:
static void qemu_create_machine(QDict *qdict)
{MachineClass *machine_class = select_machine(qdict, &error_fatal);object_set_machine_compat_props(machine_class->compat_props);current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));object_property_add_child(object_get_root(), "machine",OBJECT(current_machine));object_property_add_child(container_get(OBJECT(current_machine),"/unattached"),"sysbus", OBJECT(sysbus_get_default()));if (machine_class->minimum_page_bits) {if (!set_preferred_target_page_bits(machine_class->minimum_page_bits)) {/* This would be a board error: specifying a minimum smaller than* a target's compile-time fixed setting.*/g_assert_not_reached();}}cpu_exec_init_all();page_size_init();if (machine_class->hw_version) {qemu_set_hw_version(machine_class->hw_version);}/** Get the default machine options from the machine if it is not already* specified either by the configuration file or by the command line.*/if (machine_class->default_machine_opts) {QDict *default_opts =keyval_parse(machine_class->default_machine_opts, NULL, NULL,&error_abort);qemu_apply_legacy_machine_options(default_opts);object_set_properties_from_keyval(OBJECT(current_machine), default_opts,false, &error_abort);qobject_unref(default_opts);}
}static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
{GlobalProperty *g;g = g_malloc0(sizeof(*g));g->driver = qemu_opt_get(opts, "driver");g->property = qemu_opt_get(opts, "property");g->value = qemu_opt_get(opts, "value");qdev_prop_register_global(g);return 0;
}
其中第1行代码就是select_machine函数,代码片段如下:
MachineClass *machine_class = select_machine(qdict, &error_fatal);
顾名思义,select_machine函数的作用是选择一个MachineClass,其可能由用户指定,如果用户未指定,则采用系统默认。如果是后者,QEMU最新版本号对应的机器类型为默认设置。由于笔者的源码为qemu-7.1.0,因此默认机器类型是pc-i440fx-7.1-machine。
select_machine函数同样在softmmu/vl.c中,代码如下:
static MachineClass *select_machine(QDict *qdict, Error **errp)
{const char *optarg = qdict_get_try_str(qdict, "type");GSList *machines = object_class_get_list(TYPE_MACHINE, false);MachineClass *machine_class;Error *local_err = NULL;if (optarg) {machine_class = find_machine(optarg, machines);qdict_del(qdict, "type");if (!machine_class) {error_setg(&local_err, "unsupported machine type");}} else {machine_class = find_default_machine(machines);if (!machine_class) {error_setg(&local_err, "No machine specified, and there is no default");}}g_slist_free(machines);if (local_err) {error_append_hint(&local_err, "Use -machine help to list supported machines\n");error_propagate(errp, local_err);}return machine_class;
}
如上面所讲,在select_machine函数中,有两种方式可以生成MachineClass:一种方式是调用find_machine函数,通过解析QEMU命令行参数生成MachineClass,即用户指定方式;另一种方式是通过find_default_machine函数找一个默认的MachineClass,即系统默认方式。后文会分别解析这两种方式的两个函数。
在此之前,有一个函数值得先深入研究:object_class_get_list。无论是用户指定还是系统默认方式,都得先调用object_class_get_list函数获得一个MachineClass列表,然后在里边找。代码片段如下:
GSList *machines = object_class_get_list(TYPE_MACHINE, false);
object_class_get_list函数在qom/object.c中,代码如下:
GSList *object_class_get_list(const char *implements_type,bool include_abstract)
{GSList *list = NULL;object_class_foreach(object_class_get_list_tramp,implements_type, include_abstract, &list);return list;
}
object_class_foreach函数在同文件中,代码如下:
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),const char *implements_type, bool include_abstract,void *opaque)
{OCFData data = { fn, implements_type, include_abstract, opaque };enumerating_types = true;g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);enumerating_types = false;
}
从object_class_foreach函数的参数中可以看出,第1个参数是一个函数指针,指向了传入的实参object_class_get_list_tramp。
现在有4个函数需要弄清楚:(1)object_class_get_list_tramp;(2)object_foreach_tramp;(3)type_table_get;(4)g_hash_table_foreach。
对于这4个函数的解析,请看下回。
相关文章:
QEMU源码全解析34 —— Machine(4)
接前一篇文章:QEMU源码全解析33 —— Machine(3) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上一回围绕DEF…...
引用Boost库 CMakeList的写法
引用Boost库 CMakeList的写法 flyfish 环境arm cmake_minimum_required(VERSION 3.5)project(example LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)set(BOOST_PREFIX /media/Boost/build/out/arm64-v8a/) set(BOOST_INCLUDE_DIR "${…...
Kibana 可视化数据分析以及es常用的数据分析函数
一、Kibana 可视化数据分析 1、Discover 的使用及生成报表:https://elasticstack.blog.csdn.net/article/details/131119502 2、Dashboard的使用:https://elasticstack.blog.csdn.net/article/details/131121890 该文档主要介绍Dashboard中的Lens使用…...
golang云原生怎么学?
学习golang云原生有哪些好处,他们的优缺点又有哪些? 一.好处有哪些? 1.高效性能:Golang是一门编译型语言,具有卓越的执行效率和并发处理能力。在云原生环境中,高效的性能对于应对大规模和高负载的分布式系…...
Jenkins+Nginx+vue
安装nodejs 在这里插入图片描述 echo off xcopy C:\ProgramData\Jenkins\.jenkins\workspace\super_manage_vue\dist F:\java\www\super_manage_vue\ /s /e /y echo 复制文件完成 exit安装niginx 配置文件如下 #user nobody; worker_processes 1;#error_log logs/error.lo…...
【vue 监听页面滑动到底部】
监听页面滑动到底部 IntersectionObserverscroll 事件监听器 IntersectionObserver 在 Vue 中监听触底可以通过使用IntersectionObserver实现。IntersectionObserver是一个可以异步观察目标元素与其祖先或视窗交叉状态的API。当目标元素进入或退出视口时,会触发Int…...
(一)创建型设计模式:2、单例模式(C++实现实例 线程安全)
目录 1、单例模式(Singleton Pattern)的含义 2、单例模式的优缺点 (1)优点: (2)缺点: 3、C实现单例模式的示例(简单) 4、C实现单例模式的示例ÿ…...
《练习100》86~90
题目86 # 生成一个包含20个随机整数(100以内)的列表,对其中偶数索引(下标)的数据进行降序排列,奇数索引的元素不变 import random list1 [random.randint(0,100) for _ in range(20)] list2 list1[::2] …...
C++——命名空间、输入、输出
在我们接触C之前,C语言中有时候会有使用全局变量,全局变量在使用过程中可能会发生冲突,这个冲突有时会是我们与库之间的冲突,有时又会是我们自己定义的之间的冲突,那么这时候命名空间的出现将很好的解决这个问题&#…...
解锁滴滴ES的性能潜力:JDK 17和ZGC的升级之路
前文介绍了滴滴自研的ES强一致性多活是如何实现的,其中也提到为了提升查询性能和解决查询毛刺问题,滴滴ES原地升级JDK17和ZGC,在这个过程中我们遇到了哪些问题,怎样解决的,以及最终上线效果如何,这篇文章就…...
Permutation and Primes 2023牛客暑期多校训练营8 J
登录—专业IT笔试面试备考平台_牛客网 题目大意:给出一个数n,要求构造一个n的排列,满足相邻两个数的差或和是一个奇质数 2<n<1e5 思路:要满足相邻数的差或和是奇质数的话只有三种情况,要么当前数a[i]a[i-1]pr…...
centos如何配置IP地址?
CentOS如何查看和临时配置IP地址 CentOS系统中,可以通过使用ifconfig命令来查看当前本机的IP地址信息。输入ifconfig即可显示当前网络接口的IP地址、网络掩码和网关信息。如果需要设置临时IP地址,可以使用ifconfig命令后接网卡名称和需要设置的IP地址、网…...
git clone 报错Filename too long
1.使用git clone代码,爆出Filename too long错误 2.原因分析 因为我很少看git clone日志,所以从未想过是clone异常,而且也看到代码clone下来了,所以我就显然以为代码clone成功,但是使用idea打开代码后发现大量代码无法…...
【雕爷学编程】Arduino动手做(184)---快餐盒盖,极低成本搭建机器人实验平台3
吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成本的简易机器人呢?也许只需要二十元左右 知识点:轮子(wheel) 中国词语。是用不同材料制成的圆形滚动物体。简…...
redis String类型命令
Redis的String类型是一种简单的键值对数据结构,常用的String类型命令有: SET key value:设置指定key的值为value。GET key:获取指定key的值。DEL key:删除指定key及其对应的值。INCR key:将指定key的值加1…...
Blazor 简单组件(0):简单介绍
文章目录 前言说明环境安装 前言 Blazor 这个技术还是比较新,相关的UI组件还在完善,我这里提供一下我个人的组件开发。 说明 本UI组件是基于BootstrapBlazor(以下简称BB)开发。 BootstrapBlazor 文档 环境安装 C#小轮子:Visual Studio自…...
在vue3+vite项目中使用jsx语法
如果我掏出下图,阁下除了私信我加入学习群,还能如何应对? 正文开始 前言一、下载资源二、利用vite工具引入babel插件总结 前言 最近在为部署人员开发辅助部署的工具,技术栈是vue3viteelectron,在使用jsx语法时&#x…...
HCIA 路由器工作原理 及其 静态路由配置
目录 1、路由器工作原理 2、获取未知网段的方法: 3、静态路由 1)写法: 2)扩展配置 a、环回接口 配置命令: 环回接口的作用: b、手工汇总 手工汇总作用: c、路由黑洞 d、缺省路由 配置…...
【Git】—— git的配置
目录 (一)忽略特殊⽂件 (二)给命令配置别名 (一)忽略特殊⽂件 在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,⽐如保存了数据库密码的配置⽂件,那怎么让Git知道呢…...
[git] git基础知识
git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目 git易于学习,性能极快 什么是版本控制? 版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况,可以记录文件修改历史…...
quot;突破Windows限制:OpenClaw对接CSDNBot全攻略quot;
在Windows环境下使用OpenClaw对接CSDN Bot时,PowerShell执行策略限制是部署过程中的常见障碍。要有效绕过此限制,需要根据不同的使用场景和权限级别,采取针对性的解决方案。 一、PowerShell执行策略限制的本质与影响 PowerShell执行策略&am…...
Arm Neoverse CMN-700缓存一致性架构与性能优化实践
1. Arm Neoverse CMN-700缓存一致性架构解析在当今多核处理器设计中,缓存一致性管理是确保系统正确性和性能的关键。Arm Neoverse CMN-700采用的Coherent Mesh Network架构通过创新的Snoop Filter(SF)和System Level Cache(SLC)机制,为数据中心和云计算场…...
揭秘智能音乐解锁神器:QMCDecode让QQ音乐加密格式自由播放
揭秘智能音乐解锁神器:QMCDecode让QQ音乐加密格式自由播放 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…...
RWKV-7 (1.5B World)轻量级优势落地:为IoT设备与嵌入式AI提供可能
RWKV-7 (1.5B World)轻量级优势落地:为IoT设备与嵌入式AI提供可能 1. 项目概述 RWKV-7 (1.5B World)是一款专为资源受限环境设计的轻量级大语言模型。相比传统大模型动辄数十GB的显存需求,1.5B参数的紧凑设计使其能够在入门级GPU甚至部分高性能嵌入式设…...
【花雕学编程】Arduino BLDC 之毫米波雷达+光流复合导引机器人
基于 Arduino 平台结合 BLDC(无刷直流电机)的毫米波雷达 光流复合导引机器人,代表了移动机器人感知技术从“单一维度”向“多模态融合”的跨越。该系统巧妙地利用了毫米波雷达的“穿透性”与“测速能力”,以及光流传感器的“高精…...
百川2-13B-4bits量化模型效果:中文学术论文摘要生成,含研究方法/结论/创新点三段式
百川2-13B-4bits量化模型效果:中文学术论文摘要生成,含研究方法/结论/创新点三段式 1. 引言 写学术论文最头疼的是什么?很多人会说,是摘要。 一篇好的摘要,要在几百字里说清楚研究背景、方法、结果、创新点…...
【亲测免费】Phi-3.5-Mini-Instruct本地对话工具:5分钟开箱即用,小白零基础上手
【亲测免费】Phi-3.5-Mini-Instruct本地对话工具:5分钟开箱即用,小白零基础上手 1. 工具简介 Phi-3.5-Mini-Instruct是微软推出的轻量级大模型,专为本地对话场景优化。这个镜像工具将复杂的模型部署过程简化为"一键启动"…...
如何在雀魂对局中获得AI实时分析:Akagi麻将辅助工具完整指南
如何在雀魂对局中获得AI实时分析:Akagi麻将辅助工具完整指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City,…...
从U盘到CAN:汽车ECU升级的“幕后英雄”与安全门道(以AUTOSAR为例)
从U盘到CAN:汽车ECU升级的“幕后英雄”与安全门道(以AUTOSAR为例) 当一辆智能汽车在4S店完成ECU软件升级时,很少有人会注意到诊断仪与车载CAN总线之间那些加密的数据包。这种看似简单的刷写操作背后,实则隐藏着汽车电子…...
KMS_VL_ALL_AIO:3分钟永久激活Windows和Office的终极解决方案
KMS_VL_ALL_AIO:3分钟永久激活Windows和Office的终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经因为Windows系统频繁弹出激活提示而烦恼?或者Off…...
