系列文章目录
第九章 QEMU系统仿真的机器创建分析实例
文章目录
前言
本文以 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 系统启动过程的程序代码有所了解,相关内容可以参考《QEMU系统分析之启动篇》系列文章。
..\qemu\8.2.2-qkd\qemu-system-x86_64.exe -cpu "Penryn" -M "q35,accel=whpx" -m "6G" -nodefaults
2.完成默认设备的设置工作
这部分代码在 system/vl.c 文件中,实现如下:
int qemu_init(int argc, char **argv)
{
...
suspend_mux_open();
qemu_disable_default_devices();
qemu_setup_display();
qemu_create_default_devices();
...
}
suspend_mux_open()
从函数 qemu_create_machine() 返回后,首先关闭分发器,代码如下:
/*
* Set to false by suspend_mux_open. Open events are delayed until
* resume_mux_open. Usually suspend_mux_open is called before
* command line processing and resume_mux_open afterwards.
*/
static bool muxes_opened = true;
...
void suspend_mux_open(void)
{
muxes_opened = false;
}
此操作比较简单,置标志位让分发器暂停工作。
qemu_disable_default_devices()
我们在调用函数 qemu_disable_default_devices() 观察 default_list[] 的内容变化,修改后跟踪代码如下:
int qemu_init(int argc, char **argv)
{
...
huedbg_flag = 1;
HUEDBG("\n");
huedbg_dump_default_driver_list(1);
qemu_disable_default_devices();
huedbg_dump_default_driver_list(0);
HUEDBG("\n");
huedbg_flag = 0;
...
}
调试输出如下:
[16156]../system/vl.c/qemu_init(3775):
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(41):len=[20]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[0].driver=[xen-console] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[1].driver=[isa-serial] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[2].driver=[isa-parallel] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[3].driver=[isa-fdc] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[4].driver=[floppy] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[5].driver=[ide-cd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[6].driver=[ide-hd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[7].driver=[scsi-cd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[8].driver=[scsi-hd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[9].driver=[VGA] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[10].driver=[isa-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[11].driver=[cirrus-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[12].driver=[isa-cirrus-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[13].driver=[vmware-svga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[14].driver=[qxl-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[15].driver=[virtio-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[16].driver=[ati-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[17].driver=[vhost-user-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[18].driver=[virtio-vga-gl] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[19].driver=[virtio-vga-rutabaga] .flag=[0]
[16156]../qom/object.c/type_table_lookup(103):lookup type(machine) in hash table
[16156]../qom/object.c/type_get_parent(194):parent_type(object)
[16156]../qom/object.c/type_get_parent(196):no parent_type
[16156]../qom/object.c/type_get_parent(194):parent_type(generic-pc-machine)
[16156]../qom/object.c/type_get_parent(194):parent_type(x86-machine)
[16156]../qom/object.c/type_get_parent(194):parent_type(machine)
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(41):len=[20]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[0].driver=[xen-console] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[1].driver=[isa-serial] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[2].driver=[isa-parallel] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[3].driver=[isa-fdc] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[4].driver=[floppy] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[5].driver=[ide-cd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[6].driver=[ide-hd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[7].driver=[scsi-cd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[8].driver=[scsi-hd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[9].driver=[VGA] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[10].driver=[isa-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[11].driver=[cirrus-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[12].driver=[isa-cirrus-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[13].driver=[vmware-svga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[14].driver=[qxl-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[15].driver=[virtio-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[16].driver=[ati-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[17].driver=[vhost-user-vga] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[18].driver=[virtio-vga-gl] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[19].driver=[virtio-vga-rutabaga] .flag=[0]
[16156]../system/vl.c/qemu_init(3779):
可以看到,
运行函数 qemu_disable_default_devices() 前
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[0].driver=[xen-console] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[1].driver=[isa-serial] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[2].driver=[isa-parallel] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[3].driver=[isa-fdc] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[4].driver=[floppy] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[5].driver=[ide-cd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[6].driver=[ide-hd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[7].driver=[scsi-cd] .flag=[1]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[8].driver=[scsi-hd] .flag=[1]
运行函数后,
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[0].driver=[xen-console] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[1].driver=[isa-serial] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[2].driver=[isa-parallel] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[3].driver=[isa-fdc] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[4].driver=[floppy] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[5].driver=[ide-cd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[6].driver=[ide-hd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[7].driver=[scsi-cd] .flag=[0]
[16156]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-default_driver_list.c/huedbg_dump_default_driver_list(43):default_list[8].driver=[scsi-hd] .flag=[0]
总结
以上分析了系统初始化过程中关闭默认驱动的操作状态变化。