系列文章目录
第二十一章 QEMU系统仿真的加速器上电后设置分析
文章目录
- 系列文章目录
- 前言
- 一、QEMU是什么?
- 二、QEMU系统仿真的启动分析
-
- 1.系统仿真的初始化代码
- 2.主循环
- 3. qemu_default_main()
- 4. qemu_main_loop()
-
- main_loop_should_exit()
-
- qemu_debug_requested()
- vm_stop()
- qemu_system_suspend()
- qemu_shutdown_requested()
- qemu_kill_report()
- qemu_system_shutdown(request)
- qemu_reset_requested()
- pause_all_vcpus()
- qemu_system_reset(request)
- resume_all_vcpus()
- runstate_check()
- runstate_set()
- qemu_wakeup_requested()
- notifier_list_notify()
- qapi_event_send_wakeup()
- qemu_powerdown_requested()
- qemu_system_powerdown()
- qemu_vmstop_requested()
- main_loop_wait()
- 总结
前言
本文以 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 文件中,实现如下:
int (*qemu_main)(void) = qemu_default_main;
int main(int argc, char **argv)
{
qemu_init(argc, argv);
return qemu_main();
}
3. qemu_default_main()
函数 qemu_default_main() 在 /system/vl.c 文件中,定义如下:
int qemu_default_main(void)
{
int status;
status = qemu_main_loop();
qemu_cleanup(status);
return status;
}
4. qemu_main_loop()
函数 qemu_main_loop() 在 /system/runstate.c 文件中,定义如下:
int qemu_main_loop(void)
{
int status = EXIT_SUCCESS;
while (!main_loop_should_exit(&status)) {
main_loop_wait(false);
}
return status;
}
main_loop_should_exit()
函数 main_loop_should_exit() 在 /system/runstate.c 文件中,定义如下:
static bool main_loop_should_exit(int *status)
{
RunState r;
ShutdownCause request;
if (qemu_debug_requested()) {
vm_stop(RUN_STATE_DEBUG);
}
if (qemu_suspend_requested()) {
qemu_system_suspend();
}
request = qemu_shutdown_requested();
if (