【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]

总结

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

相关推荐
伍哥的传说几秒前
鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)
前端·华为·前端框架·harmonyos·鸿蒙
yugi9878382 分钟前
前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
前端
浪裡遊14 分钟前
Sass详解:功能特性、常用方法与最佳实践
开发语言·前端·javascript·css·vue.js·rust·sass
代码讲故事40 分钟前
多种方法实现golang中实现对http的响应内容生成图片
开发语言·chrome·http·golang·图片·快照·截图
天天爱吃肉82181 小时前
ZigBee通信技术全解析:从协议栈到底层实现,全方位解读物联网核心无线技术
python·嵌入式硬件·物联网·servlet
东风点点吹1 小时前
STM32F103的boot跳转APP不成功问题排除
stm32·单片机·嵌入式硬件
chanalbert1 小时前
CentOS系统新手指导手册
linux·运维·centos
旧曲重听11 小时前
最快实现的前端灰度方案
前端·程序人生·状态模式
默默coding的程序猿1 小时前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
星宸追风1 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu