> For the complete documentation index, see [llms.txt](https://richardweiyang-2.gitbook.io/understanding_qemu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://richardweiyang-2.gitbook.io/understanding_qemu/00-mt/01-machine_type.md).

# 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函数。
