From 579d3c5a5a814c07f8dab8fad42c8a92b3c97de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ysyx=5F22040406-=E5=BC=A0=E7=82=80=E6=9D=B0?= Date: Mon, 26 Sep 2022 22:45:24 +0800 Subject: [PATCH 1/5] add 20220911-qemu-zsbl.md --- articles/20220911-qemu-zsbl.md | 829 +++++++++++++++++++++++++++++++++ 1 file changed, 829 insertions(+) create mode 100644 articles/20220911-qemu-zsbl.md diff --git a/articles/20220911-qemu-zsbl.md b/articles/20220911-qemu-zsbl.md new file mode 100644 index 0000000..51529fe --- /dev/null +++ b/articles/20220911-qemu-zsbl.md @@ -0,0 +1,829 @@ +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1-rc2 - [header]
+> Author: YJMSTR
+> Date: 2022/09/11
+> Revisor: Bin Meng, Falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Environment: Ubuntu22.04 LTS
+> Sponsor: PLCT Lab, ISCAS + +# QEMU 启动方式分析(3): QEMU 代码与 ZSBL 分析 + +使用软件版本如下: + +> QEMU: v7.0.0 + +## 前言 + +在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 'virt' 设备的模拟以及其 ZSBL 阶段的行为。 + +系统模式下 QEMU 程序的入口是 `/path/to/qemu/softmmu/main.c`。该函数如下所示: + +```c +int main(int argc, char **argv, char **envp) +{ + qemu_init(argc, argv, envp); + qemu_main_loop(); + qemu_cleanup(); + + return 0; +} +``` + +我们重点分析其中的 `qemu_init` 函数。 + +## 涉及的数据结构 + +在 `/path/to/qemu/include/qemu/queue.h` 中定义了四种数据结构:单链表,双向链表,简单队列,尾队列。其中: + +- 单链表:相关的宏定义以 `QSLIST` 开头。以指向表头的指针表示。只能正向遍历,移除元素时需要遍历链表,只能在表头之后或是某个已存在的元素之后插入元素。 +- 双向链表:相关的宏定义以 `QLIST` 开头。以指向表头的指针表示。只能正向遍历,移除元素时不需要遍历链表,可以在表头和已存在元素的前面或后面插入元素。 +- 简单队列:相关的宏定义以 `QSIMPLEQ` 开头。简单队列以一对分别指向队首元素与队尾元素的指针表示。元素之间单向连接,只能在队首,队尾或已存在元素之后插入新元素,只支持删除队首元素,只能正向遍历。 +- 尾队列:相关的宏定义以 `QTAILQ` 开头。其同样以一对分别指向队首元素与队尾元素的指针表示。元素之间双向连接,因此可以在不遍历队列的情况下删除队列中的任意元素。可以在队首/队尾/已存在元素的前面或后面插入元素。支持双向遍历。 + +各种宏的详细定义可以参考代码。 + +在进入 `qemu_init` 函数后,QEMU 接着调用了 `qemu_add_opts` 与 `qemu_add_drive_opts` 等函数。它们分别将作为参数传入的 `QemuOptsList` 数据结构加入 `vm_config_groups[]` 中与 `drive_config_groups[]` 中。 + + `QemuOptsList` 类型定义于 `/path/to/qemu/include/qemu/option.h`: + +```c +struct QemuOptsList { + const char *name; + const char *implied_opt_name; + bool merge_lists; /* Merge multiple uses of option into a single list? */ + QTAILQ_HEAD(, QemuOpts) head; + QemuOptDesc desc[]; +}; +``` + +其中 `QTAILQ_HEAD(, QemuOpts) head` 表示其拥有的 `QemuOpts` 尾队列的队头,`QemuOpts` 类型定义于 `/path/to/qemu/include/qemu/option_int.h`: + +```c +struct QemuOpts { + char *id; + QemuOptsList *list; + Location loc; + QTAILQ_HEAD(, QemuOpt) head; + QTAILQ_ENTRY(QemuOpts) next; +}; +``` + +其中 `QTAILQ_HEAD(, QemuOpt) head` 表示其拥有的 `QemuOpt` 类型的尾队列队头,`QTAILQ_ENTRY(QemuOpts) next` 中包含这一 `QemuOpts` 在所属尾队列中指向下一个元素的指针,以及指向前一个元素的该指针的二级指针。 + +`QemuOpt` 类型同样定义于 `/path/to/qemu/include/qemu/option_int.h` 中: + +```c +struct QemuOpt { + char *name; + char *str; + + const QemuOptDesc *desc; + union { + bool boolean; + uint64_t uint; + } value; + + QemuOpts *opts; + QTAILQ_ENTRY(QemuOpt) next; +}; +``` + +其中的 `QemuOpts *opts` 指向其所属的 `QemuOpts` 实例,`QTAILQ_ENTRY(QemuOpt) next` 中包含这一 `QemuOpt` 在所属尾队列中指向下一个元素的指针,以及指向前一个元素的该指针的二级指针。 + +其中 `QemuOptDesc` 类型定义于 `/path/to/qemu/include/qemu/option.h`: + +```c +typedef struct QemuOptDesc { + const char *name; + enum QemuOptType type; + const char *help; + const char *def_value_str; +} QemuOptDesc; +``` + +其包含了用于描述选项的若干信息。 + +由上述分析可知,每个 `QemuOptsList` 其实包含了“尾队列套尾队列”的结构,表示一类选项。这些选项中的每一个用 `QemuOpts` 表示,又包含若干的子选项,用 `QemuOpt` 表示。 + +在将这些 `QemuOptsList` 加入对应的数组之后,`QEMU` 会调用 `module_call_init(MODULE_INIT_OPTS)` 进行参数模块类型链表 `ModuleTypeList` 的初始化。 + +## 参数解析过程 + +解析分为两个阶段,所有可用的参数以 `QEMUOption` 类型存储在 `qemu_options` 数组中,并在第一阶段通过 `lookup_opt()` 函数进行查找,以确定是否是合法参数,并将其后跟随的参数(如果有)存入 `poptarg`。第二阶段同样使用 `lookup_opt()` 函数进行查找,判断模拟的目标是否支持该参数,并根据选项的类型执行不同的分支,具体实现在 `/path/to/qemu/softmmu/vl.c` 中。 + +其中,`-kernel` 参数和 `-bios` 参数对应的分支代码如下: + +```c + case QEMU_OPTION_kernel: + qdict_put_str(machine_opts_dict, "kernel", optarg); + break; +... + case QEMU_OPTION_bios: + qdict_put_str(machine_opts_dict, "firmware", optarg); + break; +``` + +此处并没有执行更进一步的操作,而是将解析出的选项与参数存至 `machine_opts_dict` 中。 + +随后在函数 `qemu_validate_options()` 中,QEMU 检查解析出的 `-kernel`, `-initrd` 和 `-append` 参数及其组合是否合法。可以在其中看见如下代码: + +```c +static void qemu_validate_options(const QDict *machine_opts) +{ + ... + if (kernel_filename == NULL) { + if (kernel_cmdline != NULL) { + error_report("-append only allowed with -kernel option"); + exit(1); + } + + if (initrd_filename != NULL) { + error_report("-initrd only allowed with -kernel option"); + exit(1); + } + } + ... +} +``` + +可以看出,QEMU 的 `-initrd` 和 `-append` 参数仅可在使用了 `-kernel` 参数的情况下使用。 + +## QOM 简介 + +QEMU 中通过 QOM (QEMU Object Model) 实现了面向对象机制。它提供了一个框架用于注册用户可创建的类,并实例化这些类的对象。它提供了以下特性: + +- 一个支持动态地注册“类”的系统 +- “类”的单继承 +- “无状态接口”的多重继承 + +QEMU 中的机器组件 (Machine) 就是通过 QOM 进行抽象的,有关 QEMU QOM 以及 使用 QOM 对机器进行抽象的更详细介绍,可以参考 QEMU 源码, [QEMU 官方文档][5] 和 [QEMU wiki][6] ,此处仅为了方便后续分析进行简要介绍。 + +QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`, `TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 + +QOM 中注册的类在 main 函数执行之前就统一添加到了链表中。以 virt 设备为例,在 `/path/to/qemu/hw/riscv/virt.c` 中,代码的最后通过 `type_init(virt_machine_init_register_types)` 将 virt 设备注册到了系统中。`type_init` 宏定义于 `include/qemu/module.h` 中: + +```c +#define type_init(function) module_init(function, MODULE_INIT_QOM) +``` + +其通过 `module_init` 宏进行操作: + +```c +#ifdef BUILD_DSO +void DSO_STAMP_FUN(void); +/* This is a dummy symbol to identify a loaded DSO as a QEMU module, so we can + * distinguish "version mismatch" from "not a QEMU module", when the stamp + * check fails during module loading */ +void qemu_module_dummy(void); + +#define module_init(function, type) \ +static void __attribute__((constructor)) do_qemu_init_ ## function(void) \ +{ \ + register_dso_module_init(function, type); \ +} +#else +/* This should not be used directly. Use block_init etc. instead. */ +#define module_init(function, type) \ +static void __attribute__((constructor)) do_qemu_init_ ## function(void) \ +{ \ + register_module_init(function, type); \ +} +#endif +``` + +根据是否定义了 `BUILD_DSO` 宏,`module_init` 将有不同的实现。未定义 `BUILD_DSO` 宏的情况下,其将通过 `register_module_init` 注册到系统中。其中加上了 `__attribute__((constructor))` 属性的函数 `do_qemu_init ## function` 将会早于 `main` 函数执行,即 QOM 类型注册是在 `main` 函数之前进行的。 + +`register_module_init` 的实现如下: + +```c +void register_module_init(void (*fn)(void), module_init_type type) +{ + ModuleEntry *e; + ModuleTypeList *l; + + e = g_malloc0(sizeof(*e)); + e->init = fn; + e->type = type; + + l = find_type(type); + + QTAILQ_INSERT_TAIL(l, e, node); +} +``` + +其通过 `find_type` 返回了一个链表(其实是”尾队列“),`find_type` 的实现如下: + +```c +static ModuleTypeList *find_type(module_init_type type) +{ + init_lists(); + + return &init_type_list[type]; +} +``` + +其中 `init_lists()` 的实现如下: + +```c +static void init_lists(void) +{ + static int inited; + int i; + + if (inited) { + return; + } + + for (i = 0; i < MODULE_INIT_MAX; i++) { + QTAILQ_INIT(&init_type_list[i]); + } + + QTAILQ_INIT(&dso_init_list); + + inited = 1; +} +``` + +它会判断数组 `init_type_list` 中的尾队列是否进行过初始化,若没有,就进行初始化。随后 `find_type` 函数会返回参数的类型所对应的尾队列,`register_module_init` 会将新的类添加到该尾队列中,并设置对应的初始化函数与类型以完成注册。 + +Machine 类型传入 `type_init` 的初始化函数是 `machine_register_types`: + +```c +static void machine_register_types(void) +{ + type_register_static(&machine_info); +} +``` + +其中 `type_register_static` 于 `/path/to/qemu/qom/object.c` 中定义: + +```c +TypeImpl *type_register(const TypeInfo *info) +{ + assert(info->parent); + return type_register_internal(info); +} + +TypeImpl *type_register_static(const TypeInfo *info) +{ + return type_register(info); +} +``` + +其最终调用了 `type_register_internal` 进行注册,相关函数如下: + +```c +static void type_table_add(TypeImpl *ti) +{ + assert(!enumerating_types); + g_hash_table_insert(type_table_get(), (void *)ti->name, ti); +} + +static TypeImpl *type_table_lookup(const char *name) +{ + return g_hash_table_lookup(type_table_get(), name); +} + +static TypeImpl *type_new(const TypeInfo *info) +{ + TypeImpl *ti = g_malloc0(sizeof(*ti)); + int i; + + g_assert(info->name != NULL); + + if (type_table_lookup(info->name) != NULL) { + fprintf(stderr, "Registering `%s' which already exists\n", info->name); + abort(); + } + + ti->name = g_strdup(info->name); + ti->parent = g_strdup(info->parent); + + ti->class_size = info->class_size; + ti->instance_size = info->instance_size; + ti->instance_align = info->instance_align; + + ti->class_init = info->class_init; + ti->class_base_init = info->class_base_init; + ti->class_data = info->class_data; + + ti->instance_init = info->instance_init; + ti->instance_post_init = info->instance_post_init; + ti->instance_finalize = info->instance_finalize; + + ti->abstract = info->abstract; + + for (i = 0; info->interfaces && info->interfaces[i].type; i++) { + ti->interfaces[i].typename = g_strdup(info->interfaces[i].type); + } + ti->num_interfaces = i; + + return ti; +} + +static TypeImpl *type_register_internal(const TypeInfo *info) +{ + TypeImpl *ti; + ti = type_new(info); + + type_table_add(ti); + return ti; +} +``` + +`type_register_internal` 将传入的 `TypeInfo` 类型参数转换为 `TypeImpl` 类型,插入哈希表中并返回转换后的结果,即完成了类的注册。 + +Machine 类的信息位于 `/path/to/qemu/hw/core/machine.c` 的 `static const TypeInfo machine_info` 中: + +```c +static const TypeInfo machine_info = { + .name = TYPE_MACHINE, + .parent = TYPE_OBJECT, + .abstract = true, + .class_size = sizeof(MachineClass), + .class_init = machine_class_init, + .class_base_init = machine_class_base_init, + .instance_size = sizeof(MachineState), + .instance_init = machine_initfn, + .instance_finalize = machine_finalize, +}; +``` + +QOM 通过 `/path/to/qemu/include/hw/boards.h` 中的 `OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)` 宏完成机器类定义的大部分工作,但机器类的虚方法需要再通过定义一个 `struct MachineClass` 来给出。对象结构体是同一个文件中的 `struct MachineState`。在 `MachineClass` 中定义了若干虚方法对 `MachineState` 进行操作: + +```c +struct MachineClass { + ... + void (*init)(MachineState *state); + void (*reset)(MachineState *state); + void (*wakeup)(MachineState *state); + int (*kvm_type)(MachineState *machine, const char *arg); + ... +}; +``` + +在知道具体的机器类型后,QEMU 将会创建新的继承自 `MachineClass` 的类并给出这些虚方法的具体实现。 + +## 创建 virt 机器 + +在解析完选项与参数并进行一些其它设置后,由于我们指定了 `-M virt`,QEMU 会在随后调用的 `qemu_create_machine(machine_opts_dict)` 函数中进行 virt 机器的创建。 + +其首先调用 `select_machine` 根据支持模拟的机器列表进行判断,若支持,则从中选出给定参数对应的机器类并提供相应的属性信息,其中的参数 `MachineClass` 即为 QEMU QOM 中定义的 Machine 类,`select_machine` 选出的是其各种具体的机器类型对应的派生类,`MachineClass` 是它们共同的基类。随后执行了如下语句: + +```c +GSList *machines = object_class_get_list(TYPE_MACHINE, false); +``` + +得到一个机器类型的链表,随后将通过 `find_machine` 从中找出我们指定的机器。 + +`object_class_get_list` 的定义如下: + +```c +GSList *object_class_get_list(const char *implements_type, + bool include_abstract) +{ + GSList *list = NULL; + + object_class_foreach(object_class_get_list_tramp, + implements_type, include_abstract, &list); + return list; +} +``` + +`object_class_foreach` 定义如下: + +```c +void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), + const char *implements_type, bool include_abstract, + void *opaque) +{ + OCFData data = { fn, implements_type, include_abstract, opaque }; + + enumerating_types = true; + g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data); + enumerating_types = false; +} +``` + +`object_class_foreach_tramp` 定义如下: + +```c +static void object_class_foreach_tramp(gpointer key, gpointer value, + gpointer opaque) +{ + OCFData *data = opaque; + TypeImpl *type = value; + ObjectClass *k; + + type_initialize(type); + k = type->class; + + if (!data->include_abstract && type->abstract) { + return; + } + + if (data->implements_type && + !object_class_dynamic_cast(k, data->implements_type)) { + return; + } + + data->fn(k, data->opaque); +} +``` + +`object_class_get_list` 会调用 `object_class_foreach`,而该函数会对哈希表 `type_table` 中的每个元素调用 `object_class_foreach_tramp`,`object_class_foreach_tramp` 中又调用了 `type_initialize` 进行类型的初始化,`type_initialize` 中会判断 `TypeImpl` 参数是否有类的初始化函数,若有则会进行调用。 + +因此,在调用 `select_machine` 时 QEMU 就已经完成了 virt 机器对应类的初始化工作。virt 对应的机器类型的初始化函数是位于 `/path/to/qemu/hw/riscv/virt.c` 中的 `virt_machine_class_init((ObjectClass *oc, void *data))`,在后文中将会对其进行具体分析。 + +接下来的 `object_set_machine_compat_props()` 设置 virt 机器的全局属性,随后通过调用 `set_memory_options(machine_class)` 设置内存大小,若在 QEMU 启动参数中没有指定内存大小,则该函数会根据 `machine_class` 中的信息将其设置为 virt 平台的默认大小。 + +随后,QEMU 根据选择出的机器类型创建一个该类的实例 `current_machine`: + +```c +current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class))); +``` + +其中 `current_machine` 是一个指向 MachineState 的指针,声明于 `/path/to/qemu/hw/core/machine.c` 中。此时的 `current_machine` 即代表了 virt 机器,对 virt 的各类初始化操作即对 `current_machine` 进行操作。 + +QEMU 在进行一些其它初始化操作后退出 `qemu_create_machine()` 函数,并接着调用了 `qemu_apply_legacy_machine_options(machine_opts_dict)`, `qemu_apply_machine_options(machine_opts_dict)` 等函数,按照之前解析出的设备相关参数 `machine_opts_dict` 进行配置。 + +随后有如下代码: + +```c +if (!preconfig_requested) { + qmp_x_exit_preconfig(&error_fatal); +} +``` + +函数 `qmp_x_exit_preconfig()` 中进行了如下操作: + +```c +void qmp_x_exit_preconfig(Error **errp) +{ + if (phase_check(PHASE_MACHINE_INITIALIZED)) { + error_setg(errp, "The command is permitted only before machine initialization"); + return; + } + + qemu_init_board(); + qemu_create_cli_devices(); + qemu_machine_creation_done(); + ... +} +``` + +此处的“qmp”指 [QEMU Machine Protocol][7],是一种基于 JSON 的协议,它允许应用程序控制 QEMU 实例。当启用了 `--preconfig` 参数后,QEMU 将会在完成创建初始虚拟机之前暂停,进入“preconfig”状态并允许通过 QMP 进行一些配置。`if (!preconfig_requested)` 判断是否要求进入“preconfig”状态,若没有,则会直接调用 `qmp_x_exit_preconfig()` 函数退出“preconfig”态并完成初始虚拟机的创建。 + +其中 `qemu_init_board()` 函数中调用了 `machine_run_board_init()` 进行机器(主板)的一些初始化操作。 + +在 `machine_run_board_init()` 中,首先通过 `MACHINE_GET_CLASS` 宏得到传入的 MachineState 对象对应的派生类,此处即 virt 对应的机器类: + +```c +MachineClass *machine_class = MACHINE_GET_CLASS(machine); +``` + +在完成一些初始化操作后,又调用了 `machine_class->init(machine)`,来调用该机器类型的初始化方法对实例 machine 进行初始化。借助 gdb 等工具可知此处实际调用了 `/path/to/qemu/hw/riscv/virt.c` 中的 `virt_machine_init(MachineState *machine)`,来对 virt 设备进行初始化。 + +## virt 代码与 ZSBL 分析 + +QEMU 模拟 RISC-V“virt”机器相关的代码位于 `/path/to/qemu/hw/riscv` 目录下的 `virt.c` 与 `virt.h` 中。ZSBL 指 Zero Stage Bootloader,在这一阶段 virt 机器从 ROM 中取指,进行初始化并跳转到 FSBL 或是 Runtime,接下来我们将对这一过程进行分析。 + +在 `virt.c` 中,给出了 virt 平台的地址分布如下: + +```c +static const MemMapEntry virt_memmap[] = { + [VIRT_DEBUG] = { 0x0, 0x100 }, + [VIRT_MROM] = { 0x1000, 0xf000 }, + [VIRT_TEST] = { 0x100000, 0x1000 }, + [VIRT_RTC] = { 0x101000, 0x1000 }, + [VIRT_CLINT] = { 0x2000000, 0x10000 }, + [VIRT_ACLINT_SSWI] = { 0x2F00000, 0x4000 }, + [VIRT_PCIE_PIO] = { 0x3000000, 0x10000 }, + [VIRT_PLIC] = { 0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2) }, + [VIRT_APLIC_M] = { 0xc000000, APLIC_SIZE(VIRT_CPUS_MAX) }, + [VIRT_APLIC_S] = { 0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) }, + [VIRT_UART0] = { 0x10000000, 0x100 }, + [VIRT_VIRTIO] = { 0x10001000, 0x1000 }, + [VIRT_FW_CFG] = { 0x10100000, 0x18 }, + [VIRT_FLASH] = { 0x20000000, 0x4000000 }, + [VIRT_IMSIC_M] = { 0x24000000, VIRT_IMSIC_MAX_SIZE }, + [VIRT_IMSIC_S] = { 0x28000000, VIRT_IMSIC_MAX_SIZE }, + [VIRT_PCIE_ECAM] = { 0x30000000, 0x10000000 }, + [VIRT_PCIE_MMIO] = { 0x40000000, 0x40000000 }, + [VIRT_DRAM] = { 0x80000000, 0x0 }, +}; +``` + +可以观察到内存 `VIRT_DRAM` 是从 0x80000000 开始的,大小没有在此处指定,而是根据用户指定的参数进行设置。若用户未指定该参数,则会将其设置为默认值。 + +`virt_machine` 类的 `TypeInfo` 如下: + +```c +static const TypeInfo virt_machine_typeinfo = { + .name = MACHINE_TYPE_NAME("virt"), + .parent = TYPE_MACHINE, + .class_init = virt_machine_class_init, + .instance_init = virt_machine_instance_init, + .instance_size = sizeof(RISCVVirtState), +}; +``` + +其中指定了父类类型 TYPE_MACHINE,类初始化函数 `virt_machine_class_init`,并在之后通过 `type_init(virt_machine_init_register_types)` 注册了该类。`type_init` 宏已在前文进行分析,由于指定了 `.class_init` 为 `virt_machine_class_init`,因此在 `type_initialize` 时将会调用该函数进行 virt 对应的机器类的初始化。 + +在 `virt_machine_class_init` 中,为 virt 类的对象指定了初始化函数 `virt_machine_init`,它首先进行处理器等模拟硬件的相关初始化,以及设备树的创建。 + +首先是对 sockets 数量进行判断,判断其是否不超过支持的最大 socket 数。随后进行各 socket 及中断控制器的初始化,并设置支持的最大内存大小。 + +接下来的代码首先进行了 ROM 的初始化: + +```c + /* boot rom */ + memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom", + memmap[VIRT_MROM].size, &error_fatal); + memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base, + mask_rom); +``` + +随后进行的是 `-bios` 参数指定的二进制文件的加载: + +```c + /* + * Only direct boot kernel is currently supported for KVM VM, + * so the "-bios" parameter is ignored and treated like "-bios none" + * when KVM is enabled. + */ + if (kvm_enabled()) { + g_free(machine->firmware); + machine->firmware = g_strdup("none"); + } + + if (riscv_is_32bit(&s->soc[0])) { + firmware_end_addr = riscv_find_and_load_firmware(machine, + RISCV32_BIOS_BIN, start_addr, NULL); + } else { + firmware_end_addr = riscv_find_and_load_firmware(machine, + RISCV64_BIOS_BIN, start_addr, NULL); + } +``` + +在注释中提到,由于 KVM 目前仅支持直接引导内核,因此开启 KVM 时,`-bios` 参数一律视为 `-bios none`。 + +接下来判断机器的位数并通过 `riscv_find_and_load_firmware()` 函数加载 `-bios` 参数指定的固件。该函数定义于 `/path/to/qemu/hw/riscv/boot.c` 中: + +```c +target_ulong riscv_find_and_load_firmware(MachineState *machine, + const char *default_machine_firmware, + hwaddr firmware_load_addr, + symbol_fn_t sym_cb) +{ + char *firmware_filename = NULL; + target_ulong firmware_end_addr = firmware_load_addr; + + if ((!machine->firmware) || (!strcmp(machine->firmware, "default"))) { + /* + * The user didn't specify -bios, or has specified "-bios default". + * That means we are going to load the OpenSBI binary included in + * the QEMU source. + */ + firmware_filename = riscv_find_firmware(default_machine_firmware); + } else if (strcmp(machine->firmware, "none")) { + firmware_filename = riscv_find_firmware(machine->firmware); + } + + if (firmware_filename) { + /* If not "none" load the firmware */ + firmware_end_addr = riscv_load_firmware(firmware_filename, + firmware_load_addr, sym_cb); + g_free(firmware_filename); + } + + return firmware_end_addr; +} + +``` + +其中第一个 if 对用户未指定 `-bios` 参数及用户指定了 `-bios default` 参数的情况进行处理,该情况下 QEMU 将会加载自带的 OpenSBI 二进制文件,并通过 `riscv_find_firmware` 函数直接查找用户输入的文件名。32 位和 64 位的默认文件分别是 `opensbi-riscv32-generic-fw_dynamic.bin` 与 `opensbi-riscv64-generic-fw_dynamic.bin`, + +第二个 if 中处理了用户通过 `-bios` 参数指定文件的情况。其通过 `riscv_find_firmware` 函数直接查找用户输入的文件名。 + +最后一个 if 根据之前解析出的文件名通过 `riscv_load_firmware` 进行固件的加载,该函数支持加载 ELF 格式文件和普通二进制文件。 + +随后回到 `virt.c` 中,若用户指定了 `-kernel` 参数,接下来的代码将进行对应的加载: + +```c + if (machine->kernel_filename) { + kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0], + firmware_end_addr); + + kernel_entry = riscv_load_kernel(machine->kernel_filename, + kernel_start_addr, NULL); + + if (machine->initrd_filename) { + hwaddr start; + hwaddr end = riscv_load_initrd(machine->initrd_filename, + machine->ram_size, kernel_entry, + &start); + qemu_fdt_setprop_cell(machine->fdt, "/chosen", + "linux,initrd-start", start); + qemu_fdt_setprop_cell(machine->fdt, "/chosen", "linux,initrd-end", + end); + } + } else { + /* + * If dynamic firmware is used, it doesn't know where is the next mode + * if kernel argument is not set. + */ + kernel_entry = 0; + } +``` + +首先根据之前计算出的固件在内存中的结束地址 `firmware_end_addr` 与机器的位数对 kernel 的起始地址 `kernel_start_addr` 进行计算,根据机器位数的不同,内存的对齐方式也不同。32 位和 64 位机器分别按 4 MiB 和 2 MiB 进行对齐。 + +随后通过 `riscv_load_kernel` 函数加载内核并计算内核入口。该函数中除了用到了 `riscv_load_firmware` 加载 ELF 格式与普通二进制格式的两个函数外,还有 `load_uimage_as` 函数进行 uImage 格式文件的加载。 + +接下来的 if 判断用户是否通过 `-initrd` 参数指定了初始 RAM 磁盘文件,并进行加载及相关设置。 + +若用户没有指定 `-kernel` 参数,或是使用了 dynamic 类型的固件,则此处将不会设置内核入口。 + +接下来这段代码检测是否存在 PFLASH 设备,如果存在,就将起始地址从默认值 DRAM 起始位置 `memmap[VIRT_DRAM].base` 改成 FLASH 的起始地址 `virt_memmap[VIRT_FLASH].base`: + +```c + if (drive_get(IF_PFLASH, 0, 0)) { + /* + * Pflash was supplied, let's overwrite the address we jump to after + * reset to the base of the flash. + */ + start_addr = virt_memmap[VIRT_FLASH].base; + } +``` + +随后进行 fw_cfg 的初始化与 fdt 在 dram 中加载地址的计算: + +```c + /* + * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the device + * tree cannot be altered and we get FDT_ERR_NOSPACE. + */ + s->fw_cfg = create_fw_cfg(machine); + rom_set_fw(s->fw_cfg); + + /* Compute the fdt load address in dram */ + fdt_load_addr = riscv_load_fdt(memmap[VIRT_DRAM].base, + machine->ram_size, machine->fdt); +``` + +fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据的一种接口,此处配置了 virt 对象的该接口。 + +函数 `riscv_load_fdt` 中,将 fdt 地址设置为了内存结束地址与 3 GB 中的较小值减去 fdt 的大小后按 16 MiB 对齐向下取整: + +```c + temp = MIN(dram_end, 3072 * MiB); + fdt_addr = QEMU_ALIGN_DOWN(temp - fdtsize, 16 * MiB); +``` + +随后会通过 `rom_add_blob_fixed_as` 宏调用 `rom_add_blob` 函数,拷贝 fdt 到 ROM 的 fdt_addr 处: + +```c + rom_add_blob_fixed_as("fdt", fdt, fdtsize, fdt_addr, + &address_space_memory); +``` + +接下来的代码加载复位向量(reset vector)进 ROM: + +```c + /* load the reset vector */ + riscv_setup_rom_reset_vec(machine, &s->soc[0], start_addr, + virt_memmap[VIRT_MROM].base, + virt_memmap[VIRT_MROM].size, kernel_entry, + fdt_load_addr, machine->fdt); + +``` + +`riscv_setup_rom_reset_vec` 中复位向量如下所示: + +```c + /* reset vector */ + uint32_t reset_vec[10] = { + 0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */ + 0x02828613, /* addi a2, t0, %pcrel_lo(1b) */ + 0xf1402573, /* csrr a0, mhartid */ + 0, + 0, + 0x00028067, /* jr t0 */ + start_addr, /* start: .dword */ + start_addr_hi32, + fdt_load_addr, /* fdt_laddr: .dword */ + 0x00000000, + /* fw_dyn: */ + }; + if (riscv_is_32bit(harts)) { + reset_vec[3] = 0x0202a583; /* lw a1, 32(t0) */ + reset_vec[4] = 0x0182a283; /* lw t0, 24(t0) */ + } else { + reset_vec[3] = 0x0202b583; /* ld a1, 32(t0) */ + reset_vec[4] = 0x0182b283; /* ld t0, 24(t0) */ + } +``` + +其随后也通过 `rom_add_blob_fixed_as` 将复位向量拷贝至 ROM 中,复位向量中的代码被拷贝进了 ROM 的起始位置。virt 机器启动后最先执行的指令就是 ROM 起始位置处的这些指令。 + +复位向量中的指令将 fw_dyn 的地址存入 a2,fw_dyn 具体是什么将在后文进行分析。 + +运行当前代码的硬件线程的 id (mhartid) 被存入 a0。随后,分别将 `start_addr` 和 `fdt_load_addr` 的值读入 a1 和 t0 中,最后跳转到 t0 指向的位置,即 `start_addr` 指向的位置。在之前分析过的代码中: + +```c + if (riscv_is_32bit(&s->soc[0])) { + firmware_end_addr = riscv_find_and_load_firmware(machine, + RISCV32_BIOS_BIN, start_addr, NULL); + } else { + firmware_end_addr = riscv_find_and_load_firmware(machine, + RISCV64_BIOS_BIN, start_addr, NULL); + } +``` + +已经将固件加载到了 virt 机器的 DRAM 的基地址。若没有添加 PFLASH,virt 机器此时将会跳转到 firmware 所处位置。 + +随后调用了 `riscv_rom_copy_firmware_info` 函数: + +```c + riscv_rom_copy_firmware_info(machine, rom_base, rom_size, sizeof(reset_vec), + kernel_entry); +``` + +从函数的注释中我们可以得知,存放在复位向量的汇编代码中存放进 a2 的是 dynamic 类型固件信息的地址。其中,结构体 `fw_dynamic_info` 的定义如下,其位于 `/path/to/qemu/include/hw/riscv/boot_opensbi.h` 中: + +```c +/** Representation dynamic info passed by previous booting stage */ +struct fw_dynamic_info { + /** Info magic */ + target_long magic; + /** Info version */ + target_long version; + /** Next booting stage address */ + target_long next_addr; + /** Next booting stage mode */ + target_long next_mode; + /** Options for OpenSBI library */ + target_long options; + /** + * Preferred boot HART id + * + * It is possible that the previous booting stage uses same link + * address as the FW_DYNAMIC firmware. In this case, the relocation + * lottery mechanism can potentially overwrite the previous booting + * stage while other HARTs are still running in the previous booting + * stage leading to boot-time crash. To avoid this boot-time crash, + * the previous booting stage can specify last HART that will jump + * to the FW_DYNAMIC firmware as the preferred boot HART. + * + * To avoid specifying a preferred boot HART, the previous booting + * stage can set it to -1UL which will force the FW_DYNAMIC firmware + * to use the relocation lottery mechanism. + */ + target_long boot_hart; +}; + +``` + +根据注释可知,这个结构体的作用是存储上一个引导阶段传入的信息,准备将其传递给 OpenSBI。要传递的信息包括魔数、版本信息、下一阶段的地址、下一阶段的模式、OpenSBI 库的选项和指定引导过程优先使用硬件线程的 id。 + +回到 `riscv_rom_copy_firmware_info`,它在完成 `struct fw_dynamic_info` 的初始化后,将会判断 ROM 剩余空间的大小,并将这个结构体拷贝进 ROM 中: + + ```c + if (dinfo_len > (rom_size - reset_vec_size)) + { + error_report("not enough space to store dynamic firmware info"); + exit(1); + } + + rom_add_blob_fixed_as("mrom.finfo", &dinfo, dinfo_len, + rom_base + reset_vec_size, + &address_space_memory); + ``` + +## 小结 + +本文简要介绍了 QEMU 中常用的数据结构、参数的解析过程、QOM,以及 RISC-V virt 设备的初始化,并对 virt 设备 ZSBL 阶段的行为进行了分析。在后续篇章中我们将进一步介绍 OpenSBI 引入 fw_dynamic 这类 firmware 并取代 fw_jump 与 fw_payload 成为 QEMU 推荐的默认选择的原因,并分析 SBI 规范的 HSM 扩展在 RISC-V 启动路径上的实现。 + +## 参考资料 + +1. [gdb 文档][1] +2. [QEMU 启动方式分析(1):QEMU 及 RISC-V 启动流程简介][3] +3. [QEMU 启动方式分析(2): QEMU 'virt' 平台下通过 OpenSBI + U-Boot 引导 RISCV64 Linux Kernel][2] +4. [QEMU 文档][4] +5. [QEMU QOM 文档][5] +6. [QEMU wiki][6] +7. [QEMU QMP][7] +8. [QEMU 源码分析-QOM][8] +9. [QEMU virt 分析][9] +10. 《QEMU/KVM 源码解析与应用》,李强 + +[1]: https://sourceware.org/gdb/documentation/ +[2]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220823-boot-riscv-linux-kernel-with-uboot-on-qemu-virt-machine.md +[3]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220816-introduction-to-qemu-and-riscv-upstream-boot-flow.md +[4]: https://qemu.readthedocs.io/en/latest/index.html +[5]: https://qemu.readthedocs.io/en/latest/devel/qom.html +[6]: https://wiki.qemu.org/Features/QOM/Machine +[7]: https://qemu.readthedocs.io/en/latest/system/managed-startup.html +[8]: http://lifeislife.cn/2022/03/09/QEMU源码分析-QOM/ +[9]: https://juejin.cn/post/6891922292075397127 -- Gitee From d405a3c386eb3f47ecd021be5a538b6d63a44f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ysyx=5F22040406-=E5=BC=A0=E7=82=80=E6=9D=B0?= Date: Thu, 29 Sep 2022 02:23:25 +0800 Subject: [PATCH 2/5] add article 20220911-qemu-riscv-zsbl.md without tinycorrect --- ...mu-zsbl.md => 20220911-qemu-riscv-zsbl.md} | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) rename articles/{20220911-qemu-zsbl.md => 20220911-qemu-riscv-zsbl.md} (92%) diff --git a/articles/20220911-qemu-zsbl.md b/articles/20220911-qemu-riscv-zsbl.md similarity index 92% rename from articles/20220911-qemu-zsbl.md rename to articles/20220911-qemu-riscv-zsbl.md index 51529fe..e9beb79 100644 --- a/articles/20220911-qemu-zsbl.md +++ b/articles/20220911-qemu-riscv-zsbl.md @@ -6,7 +6,7 @@ > Environment: Ubuntu22.04 LTS
> Sponsor: PLCT Lab, ISCAS -# QEMU 启动方式分析(3): QEMU 代码与 ZSBL 分析 +# QEMU 启动方式分析(3): QEMU 代码与 RISCV 'virt' 平台 ZSBL 分析 使用软件版本如下: @@ -14,9 +14,9 @@ ## 前言 -在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 'virt' 设备的模拟以及其 ZSBL 阶段的行为。 +在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 RISC-V 'virt' 设备的模拟以及其 Zeroth Stage Boot Loader (ZSBL) 阶段的行为。 -系统模式下 QEMU 程序的入口是 `/path/to/qemu/softmmu/main.c`。该函数如下所示: +系统模式下 QEMU 程序的入口是 `softmmu/main.c`。该函数如下所示: ```c int main(int argc, char **argv, char **envp) @@ -33,7 +33,7 @@ int main(int argc, char **argv, char **envp) ## 涉及的数据结构 -在 `/path/to/qemu/include/qemu/queue.h` 中定义了四种数据结构:单链表,双向链表,简单队列,尾队列。其中: +在 `include/qemu/queue.h` 中定义了四种数据结构:单链表,双向链表,简单队列,尾队列。其中: - 单链表:相关的宏定义以 `QSLIST` 开头。以指向表头的指针表示。只能正向遍历,移除元素时需要遍历链表,只能在表头之后或是某个已存在的元素之后插入元素。 - 双向链表:相关的宏定义以 `QLIST` 开头。以指向表头的指针表示。只能正向遍历,移除元素时不需要遍历链表,可以在表头和已存在元素的前面或后面插入元素。 @@ -44,7 +44,7 @@ int main(int argc, char **argv, char **envp) 在进入 `qemu_init` 函数后,QEMU 接着调用了 `qemu_add_opts` 与 `qemu_add_drive_opts` 等函数。它们分别将作为参数传入的 `QemuOptsList` 数据结构加入 `vm_config_groups[]` 中与 `drive_config_groups[]` 中。 - `QemuOptsList` 类型定义于 `/path/to/qemu/include/qemu/option.h`: + `QemuOptsList` 类型定义于 `include/qemu/option.h`: ```c struct QemuOptsList { @@ -56,7 +56,7 @@ struct QemuOptsList { }; ``` -其中 `QTAILQ_HEAD(, QemuOpts) head` 表示其拥有的 `QemuOpts` 尾队列的队头,`QemuOpts` 类型定义于 `/path/to/qemu/include/qemu/option_int.h`: +其中 `QTAILQ_HEAD(, QemuOpts) head` 表示其拥有的 `QemuOpts` 尾队列的队头,`QemuOpts` 类型定义于 `include/qemu/option_int.h`: ```c struct QemuOpts { @@ -70,7 +70,7 @@ struct QemuOpts { 其中 `QTAILQ_HEAD(, QemuOpt) head` 表示其拥有的 `QemuOpt` 类型的尾队列队头,`QTAILQ_ENTRY(QemuOpts) next` 中包含这一 `QemuOpts` 在所属尾队列中指向下一个元素的指针,以及指向前一个元素的该指针的二级指针。 -`QemuOpt` 类型同样定义于 `/path/to/qemu/include/qemu/option_int.h` 中: +`QemuOpt` 类型同样定义于 `include/qemu/option_int.h` 中: ```c struct QemuOpt { @@ -90,7 +90,7 @@ struct QemuOpt { 其中的 `QemuOpts *opts` 指向其所属的 `QemuOpts` 实例,`QTAILQ_ENTRY(QemuOpt) next` 中包含这一 `QemuOpt` 在所属尾队列中指向下一个元素的指针,以及指向前一个元素的该指针的二级指针。 -其中 `QemuOptDesc` 类型定义于 `/path/to/qemu/include/qemu/option.h`: +其中 `QemuOptDesc` 类型定义于 `include/qemu/option.h`: ```c typedef struct QemuOptDesc { @@ -109,7 +109,7 @@ typedef struct QemuOptDesc { ## 参数解析过程 -解析分为两个阶段,所有可用的参数以 `QEMUOption` 类型存储在 `qemu_options` 数组中,并在第一阶段通过 `lookup_opt()` 函数进行查找,以确定是否是合法参数,并将其后跟随的参数(如果有)存入 `poptarg`。第二阶段同样使用 `lookup_opt()` 函数进行查找,判断模拟的目标是否支持该参数,并根据选项的类型执行不同的分支,具体实现在 `/path/to/qemu/softmmu/vl.c` 中。 +解析分为两个阶段,所有可用的参数以 `QEMUOption` 类型存储在 `qemu_options` 数组中,并在第一阶段通过 `lookup_opt()` 函数进行查找,以确定是否是合法参数,并将其后跟随的参数(如果有)存入 `poptarg`。第二阶段同样使用 `lookup_opt()` 函数进行查找,判断模拟的目标是否支持该参数,并根据选项的类型执行不同的分支,具体实现在 `softmmu/vl.c` 中。 其中,`-kernel` 参数和 `-bios` 参数对应的分支代码如下: @@ -160,7 +160,7 @@ QEMU 中的机器组件 (Machine) 就是通过 QOM 进行抽象的,有关 QEMU QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`, `TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 -QOM 中注册的类在 main 函数执行之前就统一添加到了链表中。以 virt 设备为例,在 `/path/to/qemu/hw/riscv/virt.c` 中,代码的最后通过 `type_init(virt_machine_init_register_types)` 将 virt 设备注册到了系统中。`type_init` 宏定义于 `include/qemu/module.h` 中: +QOM 中注册的类在 main 函数执行之前就统一添加到了链表中。以 virt 设备为例,在 `hw/riscv/virt.c` 中,代码的最后通过 `type_init(virt_machine_init_register_types)` 将 virt 设备注册到了系统中。`type_init` 宏定义于 `include/qemu/module.h` 中: ```c #define type_init(function) module_init(function, MODULE_INIT_QOM) @@ -255,7 +255,7 @@ static void machine_register_types(void) } ``` -其中 `type_register_static` 于 `/path/to/qemu/qom/object.c` 中定义: +其中 `type_register_static` 于 `qom/object.c` 中定义: ```c TypeImpl *type_register(const TypeInfo *info) @@ -333,7 +333,7 @@ static TypeImpl *type_register_internal(const TypeInfo *info) `type_register_internal` 将传入的 `TypeInfo` 类型参数转换为 `TypeImpl` 类型,插入哈希表中并返回转换后的结果,即完成了类的注册。 -Machine 类的信息位于 `/path/to/qemu/hw/core/machine.c` 的 `static const TypeInfo machine_info` 中: +Machine 类的信息位于 `hw/core/machine.c` 的 `static const TypeInfo machine_info` 中: ```c static const TypeInfo machine_info = { @@ -349,7 +349,7 @@ static const TypeInfo machine_info = { }; ``` -QOM 通过 `/path/to/qemu/include/hw/boards.h` 中的 `OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)` 宏完成机器类定义的大部分工作,但机器类的虚方法需要再通过定义一个 `struct MachineClass` 来给出。对象结构体是同一个文件中的 `struct MachineState`。在 `MachineClass` 中定义了若干虚方法对 `MachineState` 进行操作: +QOM 通过 `include/hw/boards.h` 中的 `OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)` 宏完成机器类定义的大部分工作,但机器类的虚方法需要再通过定义一个 `struct MachineClass` 来给出。对象结构体是同一个文件中的 `struct MachineState`。在 `MachineClass` 中定义了若干虚方法对 `MachineState` 进行操作: ```c struct MachineClass { @@ -433,7 +433,7 @@ static void object_class_foreach_tramp(gpointer key, gpointer value, `object_class_get_list` 会调用 `object_class_foreach`,而该函数会对哈希表 `type_table` 中的每个元素调用 `object_class_foreach_tramp`,`object_class_foreach_tramp` 中又调用了 `type_initialize` 进行类型的初始化,`type_initialize` 中会判断 `TypeImpl` 参数是否有类的初始化函数,若有则会进行调用。 -因此,在调用 `select_machine` 时 QEMU 就已经完成了 virt 机器对应类的初始化工作。virt 对应的机器类型的初始化函数是位于 `/path/to/qemu/hw/riscv/virt.c` 中的 `virt_machine_class_init((ObjectClass *oc, void *data))`,在后文中将会对其进行具体分析。 +因此,在调用 `select_machine` 时 QEMU 就已经完成了 virt 机器对应类的初始化工作。virt 对应的机器类型的初始化函数是位于 `hw/riscv/virt.c` 中的 `virt_machine_class_init((ObjectClass *oc, void *data))`,在后文中将会对其进行具体分析。 接下来的 `object_set_machine_compat_props()` 设置 virt 机器的全局属性,随后通过调用 `set_memory_options(machine_class)` 设置内存大小,若在 QEMU 启动参数中没有指定内存大小,则该函数会根据 `machine_class` 中的信息将其设置为 virt 平台的默认大小。 @@ -443,7 +443,7 @@ static void object_class_foreach_tramp(gpointer key, gpointer value, current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class))); ``` -其中 `current_machine` 是一个指向 MachineState 的指针,声明于 `/path/to/qemu/hw/core/machine.c` 中。此时的 `current_machine` 即代表了 virt 机器,对 virt 的各类初始化操作即对 `current_machine` 进行操作。 +其中 `current_machine` 是一个指向 MachineState 的指针,声明于 `hw/core/machine.c` 中。此时的 `current_machine` 即代表了 virt 机器,对 virt 的各类初始化操作即对 `current_machine` 进行操作。 QEMU 在进行一些其它初始化操作后退出 `qemu_create_machine()` 函数,并接着调用了 `qemu_apply_legacy_machine_options(machine_opts_dict)`, `qemu_apply_machine_options(machine_opts_dict)` 等函数,按照之前解析出的设备相关参数 `machine_opts_dict` 进行配置。 @@ -482,11 +482,11 @@ void qmp_x_exit_preconfig(Error **errp) MachineClass *machine_class = MACHINE_GET_CLASS(machine); ``` -在完成一些初始化操作后,又调用了 `machine_class->init(machine)`,来调用该机器类型的初始化方法对实例 machine 进行初始化。借助 gdb 等工具可知此处实际调用了 `/path/to/qemu/hw/riscv/virt.c` 中的 `virt_machine_init(MachineState *machine)`,来对 virt 设备进行初始化。 +在完成一些初始化操作后,又调用了 `machine_class->init(machine)`,来调用该机器类型的初始化方法对实例 machine 进行初始化。借助 gdb 等工具可知此处实际调用了 `hw/riscv/virt.c` 中的 `virt_machine_init(MachineState *machine)`,来对 virt 设备进行初始化。 ## virt 代码与 ZSBL 分析 -QEMU 模拟 RISC-V“virt”机器相关的代码位于 `/path/to/qemu/hw/riscv` 目录下的 `virt.c` 与 `virt.h` 中。ZSBL 指 Zero Stage Bootloader,在这一阶段 virt 机器从 ROM 中取指,进行初始化并跳转到 FSBL 或是 Runtime,接下来我们将对这一过程进行分析。 +QEMU 模拟 RISC-V 'virt' 机器相关的代码位于 `hw/riscv` 目录下的 `virt.c` 与 `virt.h` 中。ZSBL 指 Zero Stage Bootloader,在这一阶段 virt 机器从 ROM 中取指,进行初始化并跳转到 FSBL 或是 Runtime,接下来我们将对这一过程进行分析。 在 `virt.c` 中,给出了 virt 平台的地址分布如下: @@ -568,7 +568,7 @@ static const TypeInfo virt_machine_typeinfo = { 在注释中提到,由于 KVM 目前仅支持直接引导内核,因此开启 KVM 时,`-bios` 参数一律视为 `-bios none`。 -接下来判断机器的位数并通过 `riscv_find_and_load_firmware()` 函数加载 `-bios` 参数指定的固件。该函数定义于 `/path/to/qemu/hw/riscv/boot.c` 中: +接下来判断机器的位数并通过 `riscv_find_and_load_firmware()` 函数加载 `-bios` 参数指定的固件。该函数定义于 `hw/riscv/boot.c` 中: ```c target_ulong riscv_find_and_load_firmware(MachineState *machine, @@ -674,7 +674,7 @@ target_ulong riscv_find_and_load_firmware(MachineState *machine, fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据的一种接口,此处配置了 virt 对象的该接口。 -函数 `riscv_load_fdt` 中,将 fdt 地址设置为了内存结束地址与 3 GB 中的较小值减去 fdt 的大小后按 16 MiB 对齐向下取整: +函数 `riscv_load_fdt` 中,将 fdt 地址设置为了内存结束地址与 3 GiB 中的较小值减去 fdt 的大小后按 16 MiB 对齐向下取整: ```c temp = MIN(dram_end, 3072 * MiB); @@ -750,7 +750,7 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 kernel_entry); ``` -从函数的注释中我们可以得知,存放在复位向量的汇编代码中存放进 a2 的是 dynamic 类型固件信息的地址。其中,结构体 `fw_dynamic_info` 的定义如下,其位于 `/path/to/qemu/include/hw/riscv/boot_opensbi.h` 中: +从函数的注释中我们可以得知,存放在复位向量的汇编代码中存放进 a2 的是 dynamic 类型固件信息的地址。其中,结构体 `fw_dynamic_info` 的定义如下,其位于 `include/hw/riscv/boot_opensbi.h` 中: ```c /** Representation dynamic info passed by previous booting stage */ @@ -808,8 +808,8 @@ struct fw_dynamic_info { ## 参考资料 1. [gdb 文档][1] -2. [QEMU 启动方式分析(1):QEMU 及 RISC-V 启动流程简介][3] -3. [QEMU 启动方式分析(2): QEMU 'virt' 平台下通过 OpenSBI + U-Boot 引导 RISCV64 Linux Kernel][2] +2. [QEMU 启动方式分析(1):QEMU 及 RISC-V 启动流程简介][2] +3. [QEMU 启动方式分析(2): QEMU 'virt' 平台下通过 OpenSBI + U-Boot 引导 RISCV64 Linux Kernel][3] 4. [QEMU 文档][4] 5. [QEMU QOM 文档][5] 6. [QEMU wiki][6] @@ -819,8 +819,8 @@ struct fw_dynamic_info { 10. 《QEMU/KVM 源码解析与应用》,李强 [1]: https://sourceware.org/gdb/documentation/ -[2]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220823-boot-riscv-linux-kernel-with-uboot-on-qemu-virt-machine.md -[3]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220816-introduction-to-qemu-and-riscv-upstream-boot-flow.md +[2]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220816-introduction-to-qemu-and-riscv-upstream-boot-flow.md +[3]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220823-boot-riscv-linux-kernel-with-uboot-on-qemu-virt-machine.md [4]: https://qemu.readthedocs.io/en/latest/index.html [5]: https://qemu.readthedocs.io/en/latest/devel/qom.html [6]: https://wiki.qemu.org/Features/QOM/Machine -- Gitee From f6092fdf41e2696a935e6532f7b9e15d781efc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ysyx=5F22040406-=E5=BC=A0=E7=82=80=E6=9D=B0?= Date: Thu, 29 Sep 2022 02:32:44 +0800 Subject: [PATCH 3/5] update 20220911-qemu-riscv-zsbl.md --- articles/20220911-qemu-riscv-zsbl.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/articles/20220911-qemu-riscv-zsbl.md b/articles/20220911-qemu-riscv-zsbl.md index e9beb79..b13c426 100644 --- a/articles/20220911-qemu-riscv-zsbl.md +++ b/articles/20220911-qemu-riscv-zsbl.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1-rc2 - [header]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1-rc3 - [spaces comments epw]
> Author: YJMSTR
> Date: 2022/09/11
> Revisor: Bin Meng, Falcon
@@ -14,7 +14,7 @@ ## 前言 -在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 RISC-V 'virt' 设备的模拟以及其 Zeroth Stage Boot Loader (ZSBL) 阶段的行为。 +在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 RISC-V 'virt' 设备的模拟以及其 Zeroth Stage Boot Loader(ZSBL)阶段的行为。 系统模式下 QEMU 程序的入口是 `softmmu/main.c`。该函数如下所示: @@ -150,13 +150,13 @@ static void qemu_validate_options(const QDict *machine_opts) ## QOM 简介 -QEMU 中通过 QOM (QEMU Object Model) 实现了面向对象机制。它提供了一个框架用于注册用户可创建的类,并实例化这些类的对象。它提供了以下特性: +QEMU 中通过 QOM(QEMU Object Model)实现了面向对象机制。它提供了一个框架用于注册用户可创建的类,并实例化这些类的对象。它提供了以下特性: - 一个支持动态地注册“类”的系统 - “类”的单继承 - “无状态接口”的多重继承 -QEMU 中的机器组件 (Machine) 就是通过 QOM 进行抽象的,有关 QEMU QOM 以及 使用 QOM 对机器进行抽象的更详细介绍,可以参考 QEMU 源码, [QEMU 官方文档][5] 和 [QEMU wiki][6] ,此处仅为了方便后续分析进行简要介绍。 +QEMU 中的机器组件(Machine)就是通过 QOM 进行抽象的,有关 QEMU QOM 以及使用 QOM 对机器进行抽象的更详细介绍,可以参考 QEMU 源码,[QEMU 官方文档][5] 和 [QEMU wiki][6],此处仅为了方便后续分析进行简要介绍。 QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`, `TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 @@ -705,11 +705,11 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 /* reset vector */ uint32_t reset_vec[10] = { 0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */ - 0x02828613, /* addi a2, t0, %pcrel_lo(1b) */ - 0xf1402573, /* csrr a0, mhartid */ + 0x02828613, /* addi a2, t0, %pcrel_lo(1b) */ + 0xf1402573, /* csrr a0, mhartid */ 0, 0, - 0x00028067, /* jr t0 */ + 0x00028067, /* jr t0 */ start_addr, /* start: .dword */ start_addr_hi32, fdt_load_addr, /* fdt_laddr: .dword */ @@ -729,7 +729,7 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 复位向量中的指令将 fw_dyn 的地址存入 a2,fw_dyn 具体是什么将在后文进行分析。 -运行当前代码的硬件线程的 id (mhartid) 被存入 a0。随后,分别将 `start_addr` 和 `fdt_load_addr` 的值读入 a1 和 t0 中,最后跳转到 t0 指向的位置,即 `start_addr` 指向的位置。在之前分析过的代码中: +运行当前代码的硬件线程的 id(mhartid)被存入 a0。随后,分别将 `start_addr` 和 `fdt_load_addr` 的值读入 a1 和 t0 中,最后跳转到 t0 指向的位置,即 `start_addr` 指向的位置。在之前分析过的代码中: ```c if (riscv_is_32bit(&s->soc[0])) { -- Gitee From 2442d1a4ca59acea6071ee4f5348efa51f0e0059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ysyx=5F22040406-=E5=BC=A0=E7=82=80=E6=9D=B0?= Date: Mon, 3 Oct 2022 19:23:55 +0800 Subject: [PATCH 4/5] [v2]update articles/20220911-qemu-riscv-zsbl.md --- articles/20220911-qemu-riscv-zsbl.md | 62 +++++++++++------- .../riscv_emulator/qemu_create_machine.png | Bin 0 -> 54298 bytes articles/images/riscv_emulator/qemu_opt.png | Bin 0 -> 79605 bytes .../riscv_emulator/qemu_type_register.png | Bin 0 -> 72298 bytes 4 files changed, 37 insertions(+), 25 deletions(-) create mode 100644 articles/images/riscv_emulator/qemu_create_machine.png create mode 100644 articles/images/riscv_emulator/qemu_opt.png create mode 100644 articles/images/riscv_emulator/qemu_type_register.png diff --git a/articles/20220911-qemu-riscv-zsbl.md b/articles/20220911-qemu-riscv-zsbl.md index b13c426..d8a5806 100644 --- a/articles/20220911-qemu-riscv-zsbl.md +++ b/articles/20220911-qemu-riscv-zsbl.md @@ -14,7 +14,7 @@ ## 前言 -在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 RISC-V 'virt' 设备的模拟以及其 Zeroth Stage Boot Loader(ZSBL)阶段的行为。 +在本系列 [上一篇文章][2] 中,我们介绍了在 QEMU RISC-V 'virt' 平台下使用 OpenSBI + U-Boot 引导 Linux 内核的流程。本文将根据 QEMU 启动 RISC-V 'virt' 设备的流程,简要介绍 QEMU 的参数解析过程与 QOM 模型,并进一步结合 QEMU 代码分析 QEMU 对 RISC-V 'virt' 设备的模拟以及其 Zeroth Stage Boot Loader(ZSBL)阶段的行为。 系统模式下 QEMU 程序的入口是 `softmmu/main.c`。该函数如下所示: @@ -29,9 +29,15 @@ int main(int argc, char **argv, char **envp) } ``` -我们重点分析其中的 `qemu_init` 函数。 +其中 `qemu_init` 函数负责 QEMU 的初始化,包括参数解析、设备初始化并根据解析的参数进行配置。`qemu_main_loop` 是 QEMU 的主循环,它将循环监听事件并进行处理。`qemu_cleanup` 进行退出时的相关清理,释放占用的资源。 -## 涉及的数据结构 +本文分析的目标 QEMU RISC-V 'virt' 机器的 ZSBL 阶段同样属于 `qemu_init` 函数处理的范围,因此,我们重点关注其中的 `qemu_init` 函数。 + +## 参数解析过程 + +![](images/riscv_emulator/qemu_opt.png) + +### 涉及的数据结构 在 `include/qemu/queue.h` 中定义了四种数据结构:单链表,双向链表,简单队列,尾队列。其中: @@ -107,9 +113,9 @@ typedef struct QemuOptDesc { 在将这些 `QemuOptsList` 加入对应的数组之后,`QEMU` 会调用 `module_call_init(MODULE_INIT_OPTS)` 进行参数模块类型链表 `ModuleTypeList` 的初始化。 -## 参数解析过程 +### 参数解析 -解析分为两个阶段,所有可用的参数以 `QEMUOption` 类型存储在 `qemu_options` 数组中,并在第一阶段通过 `lookup_opt()` 函数进行查找,以确定是否是合法参数,并将其后跟随的参数(如果有)存入 `poptarg`。第二阶段同样使用 `lookup_opt()` 函数进行查找,判断模拟的目标是否支持该参数,并根据选项的类型执行不同的分支,具体实现在 `softmmu/vl.c` 中。 +解析分为两个阶段,所有可用的参数以 `QEMUOption` 类型存储在 `qemu_options` 数组中,这个数组是根据 `qemu-options.hx` 文件进行填充的。在参数解析的第一阶段会通过 `lookup_opt()` 函数在该数组中进行查找,以确定是否是合法参数,并将其后跟随的参数(如果有)存入 `poptarg`。第二阶段同样使用 `lookup_opt()` 函数进行查找,判断模拟的目标是否支持该参数,并根据选项的类型执行不同的分支,具体实现在 `softmmu/vl.c` 中。 其中,`-kernel` 参数和 `-bios` 参数对应的分支代码如下: @@ -131,7 +137,7 @@ typedef struct QemuOptDesc { static void qemu_validate_options(const QDict *machine_opts) { ... - if (kernel_filename == NULL) { + if (kernel_filename == NULL) { if (kernel_cmdline != NULL) { error_report("-append only allowed with -kernel option"); exit(1); @@ -148,7 +154,11 @@ static void qemu_validate_options(const QDict *machine_opts) 可以看出,QEMU 的 `-initrd` 和 `-append` 参数仅可在使用了 `-kernel` 参数的情况下使用。 -## QOM 简介 +## RISC-V 'virt' 初始化 + +### QOM 简介 + +![](images/riscv_emulator/qemu_type_register.png) QEMU 中通过 QOM(QEMU Object Model)实现了面向对象机制。它提供了一个框架用于注册用户可创建的类,并实例化这些类的对象。它提供了以下特性: @@ -158,7 +168,7 @@ QEMU 中通过 QOM(QEMU Object Model)实现了面向对象机制。它提供 QEMU 中的机器组件(Machine)就是通过 QOM 进行抽象的,有关 QEMU QOM 以及使用 QOM 对机器进行抽象的更详细介绍,可以参考 QEMU 源码,[QEMU 官方文档][5] 和 [QEMU wiki][6],此处仅为了方便后续分析进行简要介绍。 -QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`, `TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 +QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`, `TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 QOM 中注册的类在 main 函数执行之前就统一添加到了链表中。以 virt 设备为例,在 `hw/riscv/virt.c` 中,代码的最后通过 `type_init(virt_machine_init_register_types)` 将 virt 设备注册到了系统中。`type_init` 宏定义于 `include/qemu/module.h` 中: @@ -211,7 +221,7 @@ void register_module_init(void (*fn)(void), module_init_type type) } ``` -其通过 `find_type` 返回了一个链表(其实是”尾队列“),`find_type` 的实现如下: +其通过 `find_type` 返回了一个链表(其实是“尾队列”),`find_type` 的实现如下: ```c static ModuleTypeList *find_type(module_init_type type) @@ -353,18 +363,20 @@ QOM 通过 `include/hw/boards.h` 中的 `OBJECT_DECLARE_TYPE(MachineState, Machi ```c struct MachineClass { - ... - void (*init)(MachineState *state); + ... + void (*init)(MachineState *state); void (*reset)(MachineState *state); void (*wakeup)(MachineState *state); int (*kvm_type)(MachineState *machine, const char *arg); - ... + ... }; ``` 在知道具体的机器类型后,QEMU 将会创建新的继承自 `MachineClass` 的类并给出这些虚方法的具体实现。 -## 创建 virt 机器 +### 创建 virt 机器 + +![](images/riscv_emulator/qemu_create_machine.png) 在解析完选项与参数并进行一些其它设置后,由于我们指定了 `-M virt`,QEMU 会在随后调用的 `qemu_create_machine(machine_opts_dict)` 函数中进行 virt 机器的创建。 @@ -537,7 +549,7 @@ static const TypeInfo virt_machine_typeinfo = { 接下来的代码首先进行了 ROM 的初始化: ```c - /* boot rom */ + /* boot rom */ memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom", memmap[VIRT_MROM].size, &error_fatal); memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base, @@ -547,7 +559,7 @@ static const TypeInfo virt_machine_typeinfo = { 随后进行的是 `-bios` 参数指定的二进制文件的加载: ```c - /* + /* * Only direct boot kernel is currently supported for KVM VM, * so the "-bios" parameter is ignored and treated like "-bios none" * when KVM is enabled. @@ -611,7 +623,7 @@ target_ulong riscv_find_and_load_firmware(MachineState *machine, 随后回到 `virt.c` 中,若用户指定了 `-kernel` 参数,接下来的代码将进行对应的加载: ```c - if (machine->kernel_filename) { + if (machine->kernel_filename) { kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0], firmware_end_addr); @@ -648,7 +660,7 @@ target_ulong riscv_find_and_load_firmware(MachineState *machine, 接下来这段代码检测是否存在 PFLASH 设备,如果存在,就将起始地址从默认值 DRAM 起始位置 `memmap[VIRT_DRAM].base` 改成 FLASH 的起始地址 `virt_memmap[VIRT_FLASH].base`: ```c - if (drive_get(IF_PFLASH, 0, 0)) { + if (drive_get(IF_PFLASH, 0, 0)) { /* * Pflash was supplied, let's overwrite the address we jump to after * reset to the base of the flash. @@ -660,7 +672,7 @@ target_ulong riscv_find_and_load_firmware(MachineState *machine, 随后进行 fw_cfg 的初始化与 fdt 在 dram 中加载地址的计算: ```c - /* + /* * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the device * tree cannot be altered and we get FDT_ERR_NOSPACE. */ @@ -677,21 +689,21 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 函数 `riscv_load_fdt` 中,将 fdt 地址设置为了内存结束地址与 3 GiB 中的较小值减去 fdt 的大小后按 16 MiB 对齐向下取整: ```c - temp = MIN(dram_end, 3072 * MiB); + temp = MIN(dram_end, 3072 * MiB); fdt_addr = QEMU_ALIGN_DOWN(temp - fdtsize, 16 * MiB); ``` 随后会通过 `rom_add_blob_fixed_as` 宏调用 `rom_add_blob` 函数,拷贝 fdt 到 ROM 的 fdt_addr 处: ```c - rom_add_blob_fixed_as("fdt", fdt, fdtsize, fdt_addr, + rom_add_blob_fixed_as("fdt", fdt, fdtsize, fdt_addr, &address_space_memory); ``` 接下来的代码加载复位向量(reset vector)进 ROM: ```c - /* load the reset vector */ + /* load the reset vector */ riscv_setup_rom_reset_vec(machine, &s->soc[0], start_addr, virt_memmap[VIRT_MROM].base, virt_memmap[VIRT_MROM].size, kernel_entry, @@ -702,7 +714,7 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 `riscv_setup_rom_reset_vec` 中复位向量如下所示: ```c - /* reset vector */ + /* reset vector */ uint32_t reset_vec[10] = { 0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */ 0x02828613, /* addi a2, t0, %pcrel_lo(1b) */ @@ -732,7 +744,7 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 运行当前代码的硬件线程的 id(mhartid)被存入 a0。随后,分别将 `start_addr` 和 `fdt_load_addr` 的值读入 a1 和 t0 中,最后跳转到 t0 指向的位置,即 `start_addr` 指向的位置。在之前分析过的代码中: ```c - if (riscv_is_32bit(&s->soc[0])) { + if (riscv_is_32bit(&s->soc[0])) { firmware_end_addr = riscv_find_and_load_firmware(machine, RISCV32_BIOS_BIN, start_addr, NULL); } else { @@ -741,12 +753,12 @@ fw_cfg 是指 firmware configuration。这是虚拟机获取 QEMU 提供数据 } ``` -已经将固件加载到了 virt 机器的 DRAM 的基地址。若没有添加 PFLASH,virt 机器此时将会跳转到 firmware 所处位置。 +已经将固件加载到了 virt 机器的 DRAM 的基地址。若没有添加 PFLASH,virt 机器此时将会跳转到 firmware 所处位置。 随后调用了 `riscv_rom_copy_firmware_info` 函数: ```c - riscv_rom_copy_firmware_info(machine, rom_base, rom_size, sizeof(reset_vec), + riscv_rom_copy_firmware_info(machine, rom_base, rom_size, sizeof(reset_vec), kernel_entry); ``` diff --git a/articles/images/riscv_emulator/qemu_create_machine.png b/articles/images/riscv_emulator/qemu_create_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..38724d23c2e072f2d6ef87f6b11b9f849c9f0d0e GIT binary patch literal 54298 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 GAM-y3urO8t literal 0 HcmV?d00001 diff --git a/articles/images/riscv_emulator/qemu_opt.png b/articles/images/riscv_emulator/qemu_opt.png new file mode 100644 index 0000000000000000000000000000000000000000..605fbc80e4b384ecc8f205c890f1a91e691e9475 GIT binary patch literal 79605 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%0DX-8XjKZycAOR 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 z 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 Kb6Mw<&;$Uq|40o0 literal 0 HcmV?d00001 diff --git a/articles/images/riscv_emulator/qemu_type_register.png b/articles/images/riscv_emulator/qemu_type_register.png new file mode 100644 index 0000000000000000000000000000000000000000..97e62873115edf672129c03470cb6c6d9d941165 GIT binary patch literal 72298 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 literal 0 HcmV?d00001 -- Gitee From cdcdcff800e0c181874c3ce50381c763290e0a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ysyx=5F22040406-=E5=BC=A0=E7=82=80=E6=9D=B0?= Date: Mon, 3 Oct 2022 19:26:30 +0800 Subject: [PATCH 5/5] update articles/20220911-qemu-riscv-zsbl.md --- articles/20220911-qemu-riscv-zsbl.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/articles/20220911-qemu-riscv-zsbl.md b/articles/20220911-qemu-riscv-zsbl.md index d8a5806..c9b55a3 100644 --- a/articles/20220911-qemu-riscv-zsbl.md +++ b/articles/20220911-qemu-riscv-zsbl.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1-rc3 - [spaces comments epw]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1-rc3 - [spaces images]
> Author: YJMSTR
> Date: 2022/09/11
> Revisor: Bin Meng, Falcon
@@ -35,7 +35,7 @@ int main(int argc, char **argv, char **envp) ## 参数解析过程 -![](images/riscv_emulator/qemu_opt.png) +![qemu_opt.png](images/riscv_emulator/qemu_opt.png) ### 涉及的数据结构 @@ -158,7 +158,7 @@ static void qemu_validate_options(const QDict *machine_opts) ### QOM 简介 -![](images/riscv_emulator/qemu_type_register.png) +![qemu_type_register.png](images/riscv_emulator/qemu_type_register.png) QEMU 中通过 QOM(QEMU Object Model)实现了面向对象机制。它提供了一个框架用于注册用户可创建的类,并实例化这些类的对象。它提供了以下特性: @@ -168,7 +168,7 @@ QEMU 中通过 QOM(QEMU Object Model)实现了面向对象机制。它提供 QEMU 中的机器组件(Machine)就是通过 QOM 进行抽象的,有关 QEMU QOM 以及使用 QOM 对机器进行抽象的更详细介绍,可以参考 QEMU 源码,[QEMU 官方文档][5] 和 [QEMU wiki][6],此处仅为了方便后续分析进行简要介绍。 -QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`, `TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 +QOM 中定义一个类 `MyType` 一般需要 `TypeInfo`,`MyTypeClass`,`MyTypeState`,`TypeImpl` 等结构,其中 `TypeInfo` 是用户定义类时提供的该类的信息,其会在注册到系统时被转换成 `TypeImpl`,`MyTypeClass` 与 `MyTypeState` 两个结构体分别是类与该类的对象的结构体,前者中提供该类的虚函数列表供子类实现,后者记录了该类的对象的相关信息。 QOM 中注册的类在 main 函数执行之前就统一添加到了链表中。以 virt 设备为例,在 `hw/riscv/virt.c` 中,代码的最后通过 `type_init(virt_machine_init_register_types)` 将 virt 设备注册到了系统中。`type_init` 宏定义于 `include/qemu/module.h` 中: @@ -376,7 +376,7 @@ struct MachineClass { ### 创建 virt 机器 -![](images/riscv_emulator/qemu_create_machine.png) +![qemu_create_machine.png](images/riscv_emulator/qemu_create_machine.png) 在解析完选项与参数并进行一些其它设置后,由于我们指定了 `-M virt`,QEMU 会在随后调用的 `qemu_create_machine(machine_opts_dict)` 函数中进行 virt 机器的创建。 -- Gitee