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
  • 继承关系
  • 初始化

Was this helpful?

  1. Machine

PCMachine

相对MachineType, PCMachine就要复杂得多了。

还是按照之前的顺序,先来看继承关系。

继承关系

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


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


   TYPE_PC_MACHINE
   +-------------------------------+
   |abstract                       | = true
   |class_size                     | = sizeof(PCMachineClass)
   |class_init                     | = pc_machine_class_init
   |class_base_init                | = NULL
   |                               |
   |instance_size                  | = sizeof(PCMachineState)
   |instance_init                  | = pc_machine_initfn
   |instance_finalize              | = NULL
   +-------------------------------+


   pc_i440x_4.0-machine
   +-------------------------------+
   |abstract                       | = true
   |class_init                     | = pc_machine_v4_0_class_init
   |                               |       -> pc_i440fx_4_0_machine_options
   |                               |
   |instance_size                  | = sizeof(PCMachineState)
   |instance_init                  | = pc_machine_initfn
   |instance_finalize              | = NULL
   |                               |
   |init                           | = pc_init_v4_0
   |                               |       -> pc_init1
   +-------------------------------+

所以我们看到PCMachine只是一个抽象父类,这正的虚拟机是它的子类。

而这些子类都由一个宏来定义

#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
    { \
        MachineClass *mc = MACHINE_CLASS(oc); \
        optsfn(mc); \
        mc->init = initfn; \
    } \
    static const TypeInfo pc_machine_type_##suffix = { \
        .name       = namestr TYPE_MACHINE_SUFFIX, \
        .parent     = TYPE_PC_MACHINE, \
        .class_init = pc_machine_##suffix##_class_init, \
    }; \
    static void pc_machine_init_##suffix(void) \
    { \
        type_register(&pc_machine_type_##suffix); \
    } \
    type_init(pc_machine_init_##suffix)

其中重要的就是将mc->init赋值。也就是在machine_run_board_init()函数中调用的部分。

初始化

初始化的工作很大一部分由mc->init函数完成,对于piix机器,这个工作就交给了pc_init1函数。

具体的我就不展开了,留到需要的时候再做讲解。

PreviousMachineTypeNextCPU

Last updated 6 years ago

Was this helpful?