本文主要是介绍【QEMU系统分析之启动篇(二十)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系列文章目录
第二十章 QEMU系统仿真设置完成后开放轮询的分析
文章目录
- 系列文章目录
- 第二十章 QEMU系统仿真设置完成后开放轮询的分析
- 前言
- 一、QEMU是什么?
- 二、QEMU系统仿真的启动分析
- 1.系统仿真的初始化代码
- 2.主循环数据初始化
- 3. resume_mux_open()
- get_chardevs_root()
- chardev_options_parsed_cb()
- open_muxes()
- 总结
前言
本文以 QEMU 8.2.2 为例,分析其作为系统仿真工具的启动过程,并为读者展示各种 QEMU 系统仿真的启动配置实例。
本文读者需要具备一定的 QEMU 系统仿真使用经验,并对 C 语言编程有一定了解。
一、QEMU是什么?
QEMU 是一个通用且开源的机器模拟器和虚拟机。
其官方主页是:https://www.qemu.org/
二、QEMU系统仿真的启动分析
1.系统仿真的初始化代码
QEMU 作为系统仿真工具,其入口代码在 system/main.c 文件中,初始化函数 qemu_init() 的实现在 system/vl.c 文件中,在完成 QEMU 虚拟机的所有设置后,接下来将开放轮询接口,接收设备处理请求,本篇文章将完成以下代码部分的分析。
2.主循环数据初始化
这部分代码在 system/vl.c 文件中,实现如下:
void qemu_init(int argc, char **argv)
{
...resume_mux_open();
...
}
3. resume_mux_open()
函数 resume_mux_open() 在 /chardev/mux.c 文件中,定义如下:
void resume_mux_open(void)
{muxes_opened = true;object_child_foreach(get_chardevs_root(),chardev_options_parsed_cb, NULL);
}
get_chardevs_root()
函数 get_chardevs_root() 定义如下:
Object *get_chardevs_root(void)
{return container_get(object_get_root(), "/chardevs");
}
chardev_options_parsed_cb()
函数 chardev_options_parsed_cb() 定义如下:
static int chardev_options_parsed_cb(Object *child, void *opaque)
{Chardev *chr = (Chardev *)child;if (!chr->be_open && CHARDEV_IS_MUX(chr)) {open_muxes(chr);}return 0;
}
open_muxes()
函数 open_muxes() 在 /chardev/char-mux.c 文件中,定义如下:
/*** Called after processing of default and command-line-specified* chardevs to deliver CHR_EVENT_OPENED events to any FEs attached* to a mux chardev. This is done here to ensure that* output/prompts/banners are only displayed for the FE that has* focus when initial command-line processing/machine init is* completed.** After this point, any new FE attached to any new or existing* mux will receive CHR_EVENT_OPENED notifications for the BE* immediately.*/
static void open_muxes(Chardev *chr)
{/* send OPENED to all already-attached FEs */mux_chr_send_all_event(chr, CHR_EVENT_OPENED);/** mark mux as OPENED so any new FEs will immediately receive* OPENED event*/chr->be_open = 1;
}
函数 mux_chr_send_all_event() 定义如下:
void mux_chr_send_all_event(Chardev *chr, QEMUChrEvent event)
{MuxChardev *d = MUX_CHARDEV(chr);int i;if (!muxes_opened) {return;}/* Send the event to all registered listeners */for (i = 0; i < d->mux_cnt; i++) {mux_chr_send_event(d, i, event);}
}
函数 mux_chr_send_event() 定义如下:
static void mux_chr_send_event(MuxChardev *d, int mux_nr, QEMUChrEvent event)
{CharBackend *be = d->backends[mux_nr];if (be && be->chr_event) {be->chr_event(be->opaque, event);}
}
总结
以上分析了 QEMU 系统仿真在启动过程中,QEMU系统仿真通知字符设备后端驱动开始工作的代码部分。
在完成此动作后,QEMU 程序回到主循环,并开始等待轮询的事件处理。
这篇关于【QEMU系统分析之启动篇(二十)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!