QEMU源码全解析7 —— QEMU主函数

88 篇文章 19 订阅
本文从QEMU主函数入手,探讨QEMU的执行流程。在新版QEMU(如7.1.0)中,主函数位于softmmu/main.c,实际工作由qemu_main()完成,该函数包括qemu_init、qemu_event_loop、qemu_cleanup三个关键部分。qemu_init函数中调用module_call_init(MODULE_INIT_OPTS)初始化所有Module,为后续分析打下基础。
摘要由CSDN通过智能技术生成

接前一篇文章: QEMU源码全解析6 —— QEMU参数解析(6)

本文内容参考:

《趣谈 Linux 操作系统》 —— 刘超,极客时间

QEMU /KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

本系列前几篇文章一直在围绕QEMU 参数解析 进行讲解,本篇文章开始我们换一个角度研究,从QEMU主函数作为入口进行深入。

前边文章提到QEMU的主函数是softmmu/vl.c中的qemu_init(),实际上并不是,而是真正有main函数的。老版本的main函数位于softmmu/vl.c中;而在较新的版本(笔者的版本是qemu-7.1.0)中,main函数被单独放到了softmmu/main.c中。代码如下:

  1. int qemu_main(int argc, char **argv, char **envp)
  2. {
  3. int status;
  4. qemu_init(argc, argv, envp);
  5. status = qemu_main_loop();
  6. qemu_cleanup();
  7. return status;
  8. }
  9. #ifndef CONFIG_COCOA
  10. int main(int argc, char **argv)
  11. {
  12. return qemu_main(argc, argv, NULL);
  13. }
  14. #endif

可以看到,main函数中只是简单调用了qemu_main函数,将实际的工作交给了它,即真正的QEMU主函数实际上是qemu_main()。

qemu_main()中一共包括三大函数:qemu_init、qemu_mail_loop、qemu_cleanup。之所以说是大函数,是因为虽然看似简单,但其里边包含的代码和内容多了去了。

接下来看一下qemu_init函数中的一句module_call_init(MODULE_INIT_QDOM)。为了便于理解,把qemu_init函数的代码片段在此贴出:

  1. void qemu_init(int argc, char **argv, char **envp)
  2. {
  3. QemuOpts *opts;
  4. QemuOpts *icount_opts = NULL, *accel_opts = NULL;
  5. QemuOptsList *olist;
  6. int optind;
  7. const char *optarg;
  8. MachineClass *machine_class;
  9. bool userconfig = true;
  10. FILE *vmstate_dump_file = NULL;
  11. qemu_add_opts(&qemu_drive_opts);
  12. qemu_add_drive_opts(&qemu_legacy_drive_opts);
  13. qemu_add_drive_opts(&qemu_common_drive_opts);
  14. qemu_add_drive_opts(&qemu_drive_opts);
  15. qemu_add_drive_opts(&bdrv_runtime_opts);
  16. qemu_add_opts(&qemu_chardev_opts);
  17. qemu_add_opts(&qemu_device_opts);
  18. qemu_add_opts(&qemu_netdev_opts);
  19. qemu_add_opts(&qemu_nic_opts);
  20. qemu_add_opts(&qemu_net_opts);
  21. qemu_add_opts(&qemu_rtc_opts);
  22. qemu_add_opts(&qemu_global_opts);
  23. qemu_add_opts(&qemu_mon_opts);
  24. qemu_add_opts(&qemu_trace_opts);
  25. qemu_plugin_add_opts();
  26. qemu_add_opts(&qemu_option_rom_opts);
  27. qemu_add_opts(&qemu_accel_opts);
  28. qemu_add_opts(&qemu_mem_opts);
  29. qemu_add_opts(&qemu_smp_opts);
  30. qemu_add_opts(&qemu_boot_opts);
  31. qemu_add_opts(&qemu_add_fd_opts);
  32. qemu_add_opts(&qemu_object_opts);
  33. qemu_add_opts(&qemu_tpmdev_opts);
  34. qemu_add_opts(&qemu_overcommit_opts);
  35. qemu_add_opts(&qemu_msg_opts);
  36. qemu_add_opts(&qemu_name_opts);
  37. qemu_add_opts(&qemu_numa_opts);
  38. qemu_add_opts(&qemu_icount_opts);
  39. qemu_add_opts(&qemu_semihosting_config_opts);
  40. qemu_add_opts(&qemu_fw_cfg_opts);
  41. qemu_add_opts(&qemu_action_opts);
  42. module_call_init(MODULE_INIT_OPTS);
  43. ……
  44. }

顾名思义,module_call_init(MODULE_INIT_OPTS)函数的作用是初始化所有的Module,这是非常关键的一步,因此我放在了主函数之后第一个要讲解的位置。不过本回只是起个头,预知此函数详情,请看下回。

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他