QEMU虚拟机启动深入剖析:主函数流程与关键技术

需积分: 46 45 下载量 42 浏览量 更新于2024-07-17 3 收藏 1.46MB PPTX 举报
QEMU 是一个开源的、可移植的架构模拟器,它允许在一个平台上运行其他架构的操作系统和应用程序。本文将深入解析 QEMU 启动虚拟机的基本流程,从QEMU的主函数 `qemu-inside-main()` 开始,这个函数在 `binssvl.c` 中定义。 首先,在 `main()` 函数中,QEMU 的初始化过程如下: 1. **模块初始化**: 在 `main()` 中,会执行 `module_call_init()`,这是对QOM (QEMU Object Model)、QAPI (QEMU API) 和 OPTS (选项处理) 的初始化,确保这些核心组件能够正确配置和交互。 2. **选择机器类型**: 接下来,`select_machine` 负责根据用户提供的参数或默认配置,选择合适的虚拟化平台,如KVM或PC架构(如q35)。 3. **配置加速器**: 这一步通常针对特定架构,如KVM可能会配置硬件辅助虚拟化特性,而PC架构如q35则可能涉及PC相关的初始化设置。 4. **机器类初始化**: `machine_class->init(current_machine)` 调用选定机器类(例如PCMachine或KVMMachine)的初始化函数,设置虚拟机的基础架构和设备模型。 5. **内存和设备配置**: 继续进行内存和I/O设备的初始化,包括PCIBus(PCI总线)和IOAPIC(输入输出高级编程接口控制器)等,这些是虚拟机内部通信和硬件模拟的关键部分。 6. **虚拟机启动**: `vm_start` 函数标志着虚拟机的真正启动,此时操作系统内核映像开始加载,后续流程包括引导加载器的加载、启动引导过程等。 7. **主循环**: 最后,进入 `main_loop`,这是一个持续监控和管理虚拟机生命周期的核心循环,负责处理事件和指令,直至虚拟机退出。 在整个过程中,QEMU 利用了QOM的模块化设计,允许用户自定义对象模型,同时KVM作为QEMU的一个特定实现,通过`type_init()`注册了自己的初始化函数`kvm_type_init`。对于特定的硬件抽象层,如q35,其初始化函数`pc_machine_init_v2_8`也在适当的时候被调用。 QEMU的这种模块化结构和自适应性使得它能够支持多种平台和虚拟化技术,并提供了高度灵活性,使开发者可以根据需要扩展和定制虚拟化环境。