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
  • 实例化
  • devic_initfn
  • pc_dimm_realize

Was this helpful?

  1. 设备模型
  2. PCDIMM

PCDIMM实例

实例化

有了类型就可以实例化一个设备了。一台机器默认情况下就又pc-dimm设备,但是我们也可以通过参数人为添加。这样我们可以进一步了解设备注册和生成的步骤。

比如我们可以通过qemu monitor输入一下命令进行内存热插:

object_add memory-backend-ram,id=ram0,size=1G device_add pc-dimm,id=dimm0,memdev=ram0,node0

其中第二行命令就是添加pc-dimm设备的,而第一行命令是表示真实使用的是什么内存。

既然如此在实例化的过程中有一个重要的步骤就是找到第一个object并关联他们。

devic_initfn

因为PCDIMM是一个设备类型,所以实例化PCDIMM之前需要调用这个函数。

其中重要的一个步骤就是设置属性。

do {
    for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
        qdev_property_add_legacy(dev, prop, &error_abort);
        qdev_property_add_static(dev, prop, &error_abort);
    }
    class = object_class_get_parent(class);
} while (class != object_class_by_name(TYPE_DEVICE));

还记得在PCDIMM类型初始化时设置的props么?在这里就用到了。

static Property pc_dimm_properties[] = {
    ...
    DEFINE_PROP_LINK(PC_DIMM_MEMDEV_PROP, PCDIMMDevice, hostmem,
                     TYPE_MEMORY_BACKEND, HostMemoryBackend *),
    DEFINE_PROP_END_OF_LIST(),
};

属性中的这个成员memdev,就是用来关联前后端的。至于具体怎么操作,实在是有点复杂。这里略过。

pc_dimm_realize

那这个具体类型的初始化函数干了什么呢?

仔细一看,这是个空架子。主要就是判断我们的前后端有没有关联好,如果没有则失败。

PreviousPCDIMM类型Next插入系统

Last updated 6 years ago

Was this helpful?