【QEMU系统分析之实例篇(九)】

系列文章目录

第九章 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系统分析之启动篇》系列文章。

bash 复制代码
..\qemu\8.2.2-qkd\qemu-system-x86_64.exe -cpu "Penryn" -M  "q35,accel=whpx" -m "6G" -nodefaults

2.完成默认设备的设置工作

这部分代码在 system/vl.c 文件中,实现如下:

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() 返回后,首先关闭分发器,代码如下:

c 复制代码
/*
 * 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[] 的内容变化,修改后跟踪代码如下:

c 复制代码
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;
...
}

调试输出如下:

bash 复制代码
[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() 前

bash 复制代码
[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]

运行函数后,

bash 复制代码
[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]

总结

以上分析了系统初始化过程中关闭默认驱动的操作状态变化。

相关推荐
深度混淆1 分钟前
实用功能,觊觎(Edge)浏览器的内置截(长)图功能
前端·edge
Smartdaili China2 分钟前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
秦老师Q3 分钟前
「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用
前端·chrome·edge
滴水可藏海4 分钟前
Chrome离线安装包下载
前端·chrome
endingCode8 分钟前
45.坑王驾到第九期:Mac安装typescript后tsc命令无效的问题
javascript·macos·typescript
yunfanleo14 分钟前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker
m512714 分钟前
LinuxC语言
java·服务器·前端
嵌入式大圣18 分钟前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
糖豆豆今天也要努力鸭44 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
烦躁的大鼻嘎1 小时前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器