understanding_qemu
  • Introduction
  • 设备模型
    • 设备类型注册
    • 设备类型初始化
    • 设备实例化
    • DeviceClass实例化细节
    • 面向对象的设备模型
    • 接口
    • 类型、对象和接口之间的转换
    • PCDIMM
      • PCDIMM类型
      • PCDIMM实例
      • 插入系统
      • 创建ACPI表
      • NVDIMM
  • 地址空间
    • 从初始化开始
    • MemoryRegion
    • AddressSpace Part1
    • FlatView
    • RAMBlock
    • AddressSpace Part2
    • 眼见为实
    • 添加MemoryRegion
  • APIC
    • 纯Qemu模拟
    • Qemu/kernel混合模拟
    • APICV
  • Live Migration
    • 从用法说起
    • 整体架构
    • VMStateDescription
    • 内存热迁移
    • postcopy
  • FW_CFG
    • 规范解读
    • Linux Guest
    • SeaBios
  • Machine
    • MachineType
    • PCMachine
  • CPU
    • TYPE_CPU
    • X86_CPU
  • MemoryBackend
    • MemoryBackend类层次结构
    • MemoryBackend初始化流程
Powered by GitBook
On this page
  • 继承关系
  • 类型选择
  • 创建Machine

Was this helpful?

  1. Machine

MachineType

MachineType是qemu中所有虚拟机类型的父类。虽然这是一个抽象类,但是对这个类的了解也能帮助我们对后续子类的理解有帮助。

继承关系

先来看一下MachineType类本身的继承关系

   TYPE_OBJECT
   +-------------------------------+
   |class_init                     | = object_class_init
   |                               |
   |instance_size                  | = sizeof(Object)
   +-------------------------------+


   TYPE_MACHINE
   +-------------------------------+
   |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
   +-------------------------------+

基本的东西我想大家都一目了然了,值得注意的是MachineType继承于Object,而不是Device。所以之前的realize一套在这里就不适用了。

类型选择

在Qemu中包含着多种MachineType类型,也就是这个类型有多个子类。那在进程启动时就需要选择指定类型,让我们来看一看。

这个过程在main函数中。

  main
    select_machine()
      find_default_machine()
      machine_parse()

这几个函数很简单,我想大家看一眼也就明白了。

创建Machine

刚才说了,MachineType的父类是Object,而不是Device。所以创建时和普通设备有很大的不同。

具体的细节散落在main函数中,而且涉及到了不同MachineType类型的不同处理,这里就不一一展开了。(其实我不懂)

在这里我们指出几个重要的点:

main
  current_machine =
    MACHINE(object_new(object_class_get_name(OBJECT_CLASS(machine_class))));
  machine_run_board_init(current_machine);
    machine_class->init(machine);

第一句是创建出了一个虚拟机 current_machine。 第二句是调用init函数。

PreviousMachineNextPCMachine

Last updated 6 years ago

Was this helpful?