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

系列文章目录

第十三章 QEMU系统仿真的机器创建分析实例


文章目录

  • 系列文章目录
    • 第十三章 QEMU系统仿真的机器创建分析实例
  • 前言
  • 一、QEMU是什么?
  • 二、QEMU系统仿真的机器创建分析实例
    • 1.系统仿真的命令行参数
    • 2.完成早期后端驱动的设置工作
      • qemu_create_early_backends()
        • qemu_console_early_init();
        • object_option_foreach_add(object_create_early)
        • 初始化字符设备
        • configure_blockdev(&bdo_queue, machine_class, snapshot)
        • audio_init_audiodevs()
        • audio_create_default_audiodevs()
    • 3.调试输出
  • 总结


前言

本文以 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,smm=off" -m "6G" -display "sdl" -audio "sdl,model=hda" -vga "std" -L "data"

2.完成早期后端驱动的设置工作

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

int qemu_init(int argc, char **argv)
{
...qemu_create_early_backends();
...
}

前文分析了创建显示输出和默认设备的过程,本文将继续逐步跟踪创建早期后端驱动的过程,看看系统需要提前创建哪些后端驱动。


qemu_create_early_backends()

函数 qemu_create_early_backends() 代码如下:

static void qemu_create_early_backends(void)
{MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
#if defined(CONFIG_SDL)const bool use_sdl = (dpy.type == DISPLAY_TYPE_SDL);
#elseconst bool use_sdl = false;
#endif
#if defined(CONFIG_GTK)const bool use_gtk = (dpy.type == DISPLAY_TYPE_GTK);
#elseconst bool use_gtk = false;
#endifif (dpy.has_window_close && !use_gtk && !use_sdl) {error_report("window-close is only valid for GTK and SDL, ""ignoring option");}qemu_console_early_init();if (dpy.has_gl && dpy.gl != DISPLAYGL_MODE_OFF && display_opengl == 0) {
#if defined(CONFIG_OPENGL)error_report("OpenGL is not supported by the display");
#elseerror_report("OpenGL support is disabled");
#endifexit(1);}object_option_foreach_add(object_create_early);/* spice needs the timers to be initialized by this point *//* spice must initialize before audio as it changes the default audiodev *//* spice must initialize before chardevs (for spicevmc and spiceport) */qemu_spice.init();qemu_opts_foreach(qemu_find_opts("chardev"),chardev_init_func, NULL, &error_fatal);#ifdef CONFIG_VIRTFSqemu_opts_foreach(qemu_find_opts("fsdev"),fsdev_init_func, NULL, &error_fatal);
#endif/** Note: we need to create audio and block backends before* setting machine properties, so they can be referred to.*/configure_blockdev(&bdo_queue, machine_class, snapshot);audio_init_audiodevs();if (default_audio) {audio_create_default_audiodevs();}
}

首先我们对控制台进行前期初始化,代码如下:

    qemu_console_early_init();

qemu_console_early_init();

代码如下:

void qemu_console_early_init(void)
{/* set the default vc driver */if (!object_class_by_name(TYPE_CHARDEV_VC)) {type_register(&char_vc_type_info);}
}

如果没有类型为 TYPE_CHARDEV_VC 的类,就注册这个类型。


object_option_foreach_add(object_create_early)

然后对需要提前创建的对象,将其加入对象选项表里。


初始化字符设备

接下来,对 ”chardev“ 设备调用函数 chardev_init_func() 完成字符设备的初始化,代码如下:

void qemu_display_early_init(DisplayOptions *opts)
{
...qemu_opts_foreach(qemu_find_opts("chardev"),chardev_init_func, NULL, &error_fatal);
...
}

configure_blockdev(&bdo_queue, machine_class, snapshot)

audio_init_audiodevs()

audio_create_default_audiodevs()

3.调试输出

首先,添加跟踪调试信息,修改后的代码如下:

```c
static void qemu_create_early_backends(void)
{...huedbg_flag = 1;HUEDBG("\n");huedbg_dump_device_configs(2);HUEDBG("\n");qemu_create_early_backends();HUEDBG("\n");huedbg_dump_device_configs(2);HUEDBG("\n");huedbg_flag = 0;...
}

运行后,输出信息如下:

[13832]../system/vl.c/qemu_init(3805):
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(134):<<<deep>>>=[2] device_configs=[p(00007ff716d51cc0)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(136):device_configs.tqh_first=[00000183981af480]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(92):<<<deep>>>=[0] conf=[00000183981af480]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(94):type=[1]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(98):cmdline=[vc:80Cx24C]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(99):loc=[p(00000183981af490)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(100):next=[p(00000183981af4a8)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(101):next.tqe_next=[00000183981ae7c0]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(92):<<<deep>>>=[0] conf=[00000183981ae7c0]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(94):type=[2]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(98):cmdline=[vc:80Cx24C]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(99):loc=[p(00000183981ae7d0)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(100):next=[p(00000183981ae7e8)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(101):next.tqe_next=[0000000000000000]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(141):device_configs.tqh_circ.tql_next=[00000183981af480]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(142):device_configs.tqh_circ.tql_prev=[00000183981ae7e8]
[13832]../system/vl.c/qemu_init(3807):
[13832]../ui/console-vc.c/qemu_console_early_init(1085):enter
[13832]../qom/object.c/object_class_by_name(1095):enter
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev-vc) in hash table
[13832]../qom/object.c/object_class_by_name(1099):no type return
[13832]../ui/console-vc.c/qemu_console_early_init(1088):run
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev-vc) in hash table
[13832]../ui/console-vc.c/qemu_console_early_init(1090):run
[13832]../ui/console-vc.c/qemu_console_early_init(1092):exit
[13832]../qom/object.c/object_class_by_name(1095):enter
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev-vc) in hash table
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/type_initialize(337):name=[chardev-vc] new ti->class enter
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../ui/console-vc.c/char_vc_class_init(1065):enter
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../ui/console-vc.c/char_vc_class_init(1073):exit
[13832]../qom/object.c/type_initialize(410):name=[chardev-vc] new class return
[13832]../qom/object.c/object_class_by_name(1105):class(chardev-vc) return
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/object_class_by_name(1095):enter
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev-vc) in hash table
[13832]../qom/object.c/object_class_by_name(1105):class(chardev-vc) return
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev-vc) in hash table
[13832]../qom/object.c/object_new_with_type(789):try type_initialize(chardev-vc)
[13832]../qom/object.c/object_new_with_type(799):obj(chardev-vc) alloc
[13832]../qom/object.c/object_new_with_type(808):try object_initialize_with_type(chardev-vc)
[13832]../qom/object.c/object_initialize_with_type(568):obj with type(chardev-vc) enter
[13832]../qom/object.c/object_initialize_with_type(576):mapping obj(chardev-vc).class with type(chardev-vc).class
[13832]../qom/object.c/object_initialize_with_type(579):try object_class_property_init_all(chardev-vc)
[13832]../qom/object.c/object_class_property_init_all(552):obj(chardev-vc) enter
[13832]../qom/object.c/object_class_property_iter_init(1440):objclass{chardev-vc} enter
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(chardev-vc) has parent(chardev)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(chardev-vc) return
[13832]../qom/object.c/object_class_property_iter_init(1443):objclass{chardev-vc} return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(chardev) has parent(object)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(chardev) return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/object_class_get_parent(1134):objclass(object) has no parent return
[13832]../qom/object.c/object_class_property_init_all(555):prop name=[type] type=[string] desc=[(null)] init=[0000000000000000]
[13832]../qom/object.c/object_class_property_init_all(563):obj(chardev-vc) return
[13832]../qom/object.c/object_initialize_with_type(583):try object_init_with_type(chardev-vc)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[chardev-vc] ti->name=[chardev-vc] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[chardev-vc] ti->name=[chardev] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[chardev-vc] ti->name=[object] enter
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[chardev-vc] ti->name=[object] return
[13832]../qom/object.c/object_init_with_type(423):name=[chardev] ti->instance_init() before
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/object_init_with_type(425):name=[chardev] ti->instance_init() after
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[chardev-vc] ti->name=[chardev] return
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[chardev-vc] ti->name=[chardev-vc] return
[13832]../qom/object.c/object_initialize_with_type(585):try object_post_init_with_type(chardev-vc)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[chardev-vc] ti->name=[chardev-vc] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(chardev)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[chardev-vc] ti->name=[chardev] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[chardev-vc] ti->name=[object] enter
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_initialize_with_type(587):obj(chardev-vc) return
[13832]../qom/object.c/object_new_with_type(812):obj(chardev-vc) return
[13832]../ui/console-vc.c/vc_chr_open(978):enter
[13832]../qom/object.c/type_table_lookup(103):lookup type(chardev-vc) in hash table
[13832]../qom/object.c/type_table_lookup(103):lookup type(qemu-fixed-text-console) in hash table
[13832]../qom/object.c/object_new_with_type(789):try type_initialize(qemu-fixed-text-console)
[13832]../qom/object.c/object_new_with_type(799):obj(qemu-fixed-text-console) alloc
[13832]../qom/object.c/object_new_with_type(808):try object_initialize_with_type(qemu-fixed-text-console)
[13832]../qom/object.c/object_initialize_with_type(568):obj with type(qemu-fixed-text-console) enter
[13832]../qom/object.c/object_initialize_with_type(576):mapping obj(qemu-fixed-text-console).class with type(qemu-fixed-text-console).class
[13832]../qom/object.c/object_initialize_with_type(579):try object_class_property_init_all(qemu-fixed-text-console)
[13832]../qom/object.c/object_class_property_init_all(552):obj(qemu-fixed-text-console) enter
[13832]../qom/object.c/object_class_property_iter_init(1440):objclass{qemu-fixed-text-console} enter
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-text-console)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(qemu-fixed-text-console) has parent(qemu-text-console)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(qemu-fixed-text-console) return
[13832]../qom/object.c/object_class_property_iter_init(1443):objclass{qemu-fixed-text-console} return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-console)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(qemu-text-console) has parent(qemu-console)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(qemu-text-console) return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(qemu-console) has parent(object)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(qemu-console) return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/object_class_get_parent(1134):objclass(object) has no parent return
[13832]../qom/object.c/object_class_property_init_all(555):prop name=[type] type=[string] desc=[(null)] init=[0000000000000000]
[13832]../qom/object.c/object_class_property_init_all(563):obj(qemu-fixed-text-console) return
[13832]../qom/object.c/object_initialize_with_type(583):try object_init_with_type(qemu-fixed-text-console)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-fixed-text-console] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-text-console)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-text-console] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-console)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-console] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[qemu-fixed-text-console] ti->name=[object] enter
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[qemu-fixed-text-console] ti->name=[object] return
[13832]../qom/object.c/object_init_with_type(423):name=[qemu-console] ti->instance_init() before
[13832]../qom/object.c/type_table_lookup(103):lookup type(qemu-console) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-text-console)
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-console)
[13832]../qom/object.c/object_init_with_type(425):name=[qemu-console] ti->instance_init() after
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-console] return
[13832]../qom/object.c/object_init_with_type(423):name=[qemu-text-console] ti->instance_init() before
[13832]../qom/object.c/type_table_lookup(103):lookup type(qemu-text-console) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-text-console)
[13832]../qom/object.c/type_table_lookup(103):lookup type(qemu-console) in hash table
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-text-console)
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-console)
[13832]../qom/object.c/object_init_with_type(425):name=[qemu-text-console] ti->instance_init() after
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-text-console] return
[13832]../qom/object.c/object_init_with_type(423):name=[qemu-fixed-text-console] ti->instance_init() before
[13832]../qom/object.c/object_init_with_type(425):name=[qemu-fixed-text-console] ti->instance_init() after
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-fixed-text-console] return
[13832]../qom/object.c/object_initialize_with_type(585):try object_post_init_with_type(qemu-fixed-text-console)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-fixed-text-console] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-text-console)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-text-console] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(qemu-console)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[qemu-fixed-text-console] ti->name=[qemu-console] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[qemu-fixed-text-console] ti->name=[object] enter
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_initialize_with_type(587):obj(qemu-fixed-text-console) return
[13832]../qom/object.c/object_new_with_type(812):obj(qemu-fixed-text-console) return
[13832]../ui/console-vc.c/vc_chr_open(1026):enter
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(container) has parent(object)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(container) return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/object_class_get_parent(1134):objclass(object) has no parent return
[13832]../qom/object.c/type_table_lookup(103):lookup type(container) in hash table
[13832]../qom/object.c/object_new_with_type(789):try type_initialize(container)
[13832]../qom/object.c/object_new_with_type(799):obj(container) alloc
[13832]../qom/object.c/object_new_with_type(808):try object_initialize_with_type(container)
[13832]../qom/object.c/object_initialize_with_type(568):obj with type(container) enter
[13832]../qom/object.c/object_initialize_with_type(576):mapping obj(container).class with type(container).class
[13832]../qom/object.c/object_initialize_with_type(579):try object_class_property_init_all(container)
[13832]../qom/object.c/object_class_property_init_all(552):obj(container) enter
[13832]../qom/object.c/object_class_property_iter_init(1440):objclass{container} enter
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(container) has parent(object)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(container) return
[13832]../qom/object.c/object_class_property_iter_init(1443):objclass{container} return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/object_class_get_parent(1134):objclass(object) has no parent return
[13832]../qom/object.c/object_class_property_init_all(555):prop name=[type] type=[string] desc=[(null)] init=[0000000000000000]
[13832]../qom/object.c/object_class_property_init_all(563):obj(container) return
[13832]../qom/object.c/object_initialize_with_type(583):try object_init_with_type(container)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[container] ti->name=[container] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_init_with_type(416):obj->class->type->name=[container] ti->name=[object] enter
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[container] ti->name=[object] return
[13832]../qom/object.c/object_init_with_type(427):obj->class->type->name=[container] ti->name=[container] return
[13832]../qom/object.c/object_initialize_with_type(585):try object_post_init_with_type(container)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[container] ti->name=[container] enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_post_init_with_type(433):obj->class->type->name=[container] ti->name=[object] enter
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_post_init_with_type(444):return
[13832]../qom/object.c/object_initialize_with_type(587):obj(container) return
[13832]../qom/object.c/object_new_with_type(812):obj(container) return
[13832]../qom/object.c/object_property_try_add(1309):name=[chardevs] enter!
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(container) has parent(object)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(container) return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/object_class_get_parent(1134):objclass(object) has no parent return
[13832]../qom/object.c/object_property_try_add(1350):name=[chardevs] return-3!
[13832]../qom/object.c/object_property_try_add(1309):name=[compat_monitor0] enter!
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(194):parent_type(object)
[13832]../qom/object.c/object_class_get_parent(1138):objclass(container) has parent(object)
[13832]../qom/object.c/object_class_get_parent(1141):objclass(container) return
[13832]../qom/object.c/object_class_get_parent(1130):enter
[13832]../qom/object.c/type_get_parent(196):no parent_type
[13832]../qom/object.c/object_class_get_parent(1134):objclass(object) has no parent return
[13832]../qom/object.c/object_property_try_add(1350):name=[compat_monitor0] return-3!
[13832]../system/vl.c/qemu_create_early_backends(2027):
[13832]../blockdev.c/drive_new(879):value=[cdrom]
[13832]../blockdev.c/drive_new(1019):
[13832]../blockdev.c/blockdev_init(484):
[13832]../blockdev.c/drive_new(1021):
[13832]../blockdev.c/drive_new(879):value=[(null)]
[13832]../blockdev.c/drive_new(1019):
[13832]../blockdev.c/blockdev_init(484):
[13832]../blockdev.c/drive_new(1021):
[13832]../system/vl.c/qemu_create_early_backends(2029):
[13832]../system/vl.c/qemu_create_early_backends(2031):
[13832]../system/vl.c/qemu_init(3809):
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(134):<<<deep>>>=[2] device_configs=[p(00007ff716d51cc0)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(136):device_configs.tqh_first=[00000183981af480]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(92):<<<deep>>>=[0] conf=[00000183981af480]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(94):type=[1]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(98):cmdline=[vc:80Cx24C]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(99):loc=[p(00000183981af490)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(100):next=[p(00000183981af4a8)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(101):next.tqe_next=[00000183981ae7c0]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(92):<<<deep>>>=[0] conf=[00000183981ae7c0]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(94):type=[2]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(98):cmdline=[vc:80Cx24C]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(99):loc=[p(00000183981ae7d0)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(100):next=[p(00000183981ae7e8)]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_config(101):next.tqe_next=[0000000000000000]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(141):device_configs.tqh_circ.tql_next=[00000183981af480]
[13832]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-device_config.c/huedbg_dump_device_configs(142):device_configs.tqh_circ.tql_prev=[00000183981ae7e8]

总结

以上分析了系统初始化过程中创建早期后端驱动的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找不到msvcp120D.dll无法继续执行代码的7个有效解决方法分享

在探讨msvcp120D.dll之前&#xff0c;首先需要明确的是&#xff0c;这个特定的动态链接库&#xff08;DLL&#xff09;文件属于Microsoft Visual C 2013的调试版本&#xff08;标记为"D"&#xff0c;代表Debug&#xff09;。这意味着它主要用于开发环境中的调试目的&…

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 &#xff08;17.x 版本不支持&#xff09; TypeScript node&#xff08;12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0&#xff09; npm&#xff08;版本请与 node 版本匹配&#xff09; chat-uikit-react 集成 …

Iterable和Iterator,你学会了吗?

在 Java 编程中&#xff0c;Iterable 和 Iterator 是用于实现集合类&#xff08;如列表、集合、映射等&#xff09;迭代访问的重要接口。 它们提供了一种统一的方式来遍历集合中的元素&#xff0c;并在不同的集合类型之间提供了一致的迭代访问方式。 本文将深入探讨 Iterable…

链表(基于C语言单向链表)

链表的实现的思想 链表表示一种是基于链接结构的线性表&#xff0c;链表实现的思想如下&#xff1a; 1、将表中的元素分别储存在一批独立的储存块里面。 2、表结构中的结点都能找到与之相关的下一个结点。 3、在前一个结点里用链表的方式显示的记录与下个结点之间的关联。 链…

STM32标准库编译流程

导入库函数 在ST官方固件库中找到STM32F10x_StdPeriph_Lib_V3.5.0.zip文件&#xff0c;解压&#xff0c;打开Libraries,接着打开STM32F10x_StdPeriph_Driver文件夹&#xff0c;继续点击src&#xff0c;看到库函数源文件&#xff1a; 将其复制到keil建立的工程的文件中&#xf…

SNR: Signal to Noise Ratio

https://www.xx.com/watch?vmyrZ_R6xIZA Fang, Y., Armin, A., Meredith, P. et al. Accurate characterization of next-generation thin-film photodetectors. Nature Photon 13, 1–4 (2019). https://doi.org/10.1038/s41566-018-0288-z Wang, F., Zhang, T., Xie, R. e…

JS实现瀑布流布局

瀑布流布局是一种常见的网页布局方式&#xff0c;可以实现页面内容的动态排列&#xff0c;使页面看起来更加美观。下面是一个简单的JS实现瀑布流布局的示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&quo…

抖音直播植物大战僵尸杂交版v1.2安装包—可用于抖音直播

植物大战僵尸杂交版是由玩家自制的一款改版游戏。在这个版本中&#xff0c;各种类型的植物都被融合成了全新的形态。比如&#xff0c;向日葵和阳光菇可以产出更多的阳光&#xff0c;坚果墙和火炬树桩合体成为能抗能辅的超级植物等等。这些融合植物种类繁多&#xff0c;各具特色…

从不平凡Image文件夹,自定义读取img和label,构造dataset

问题描述 torchvision.datasets.ImageFolder 假定&#xff1a;子文件名子文件夹的图像的标签 但在KDEF文件夹中&#xff0c;子文件夹下有所有的类&#xff0c;不宜用ImageFolder读取path来得到dataset My 实现&#xff1a; # how to build dataset? from torch.utils import …

AI-数学-高中-47导数与几何意义

原作者视频&#xff1a;【导数】【考点精华】7导数与几何意义考点解析&#xff08;基础&#xff09;_哔哩哔哩_bilibili 该点处切点的斜率 该点处导函数的值 示例1&#xff1a; 导数问题解决最常用方法&#xff1a;参数分离&#xff0c;在左边函数有解的值域范围内。 示例2&…

Netty 网络编程深入学习【一】:ByteBuffer 源码解析

ByteBuffer源码阅读 ByteBuffer是一个用于处理字节数据的缓冲区类。它是Java NIO 包的一部分&#xff0c;提供了一种高效的方式来处理原始字节数据。 ByteBuffer 可以用来读取、写入、修改和操作字节数据&#xff0c;它是一种直接操作字节的方式&#xff0c;比起传统的 InputSt…

Channel Session架构简介

"Channel Session架构" 是指在分布式系统、即时通讯、网络编程等领域中&#xff0c;结合了"Channel"&#xff08;通道&#xff09;和"Session"概念的一种设计模式。这种架构强调的是高效、安全地管理客户端与服务器之间的通信会话&#xff0c;尤…

基于Spring Boot的在线BLOG网设计与实现

基于Spring Boot的在线BLOG网设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页管理界面&#xff0c;用户经过登录前台首页查看通…

【UnityRPG游戏制作】Unity_RPG项目_玩家逻辑相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

HSDB使用教程

HSDB&#xff1a;Hostspot Debugger&#xff0c;JVM内置的工具&#xff0c;用于深入分析JVM运行时的内部状态 启动HSDB java -cp D:/tools/jdk-1.8/lib/sa-jdi.jar sun.jvm.hotspot.HSDB 获取进程id jps 连接到指定进程 查找类 通过查询查找对象 输入查询语句 select d from …

100/篇论文修改?提高营收从拒绝客户开始

进入4月份以来新进询盘客户可谓惨淡&#xff0c;为了完成业绩突破我接了一个并不擅长的订单&#xff0c;最终失败赔钱收场&#xff0c;痛定思痛我决定拒掉不可靠的项目&#xff1a; 不熟悉的领域 超出团队承载范围的 低价绝对低价的项目 今天收到客户询盘我非常的开心&#…

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

Linux上OcenBase单机版部署及基本信息查询

OceanBase单机版部署可以通过在线和离线两种方式部署。在线部署可以通过yum源或者apt源部署&#xff0c;直接拉取官方源码即可。实际使用中&#xff0c;大部分环境连不了外网&#xff0c;本文介绍离线方式安装。 下载“OceanBase All in One”离线安装包下载官方地址&#xff1…