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
  • 插入系统
  • pc_memory_pre_plug
  • pc_memory_plug

Was this helpful?

  1. 设备模型
  2. PCDIMM

插入系统

插入系统

本来以为设备实例化就算完事了,结果还没完。

这还要从device_set_realized开始看。

device_set_realized()
  if (hotplug_ctrl) {
      hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
  }

  if (dc->realize) {
    dc->realize(dev, &local_err);
  }

  if (hotplug_ctrl) {
    hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
  }

从上面简化的框架来看,除了设备实例化本身,初始化时在实例化前后分别做了一些准备和善后:

  • hotplug_handler_pre_plug -> pc_memory_pre_plug

  • hotplug_handler_plug -> pc_memory_plug

pc_memory_pre_plug

这个函数在实际插入设备前做一些检测工作:

  • 检测系统是否支持热插拔:有没有acpi,是不是enable了

  • 计算出该插入到哪里,是不是有空间可以个插入

计算出合适的位置后,讲这个值保存在PCDIMMDevice.addr字段中。 这个addr就是该内存条在虚拟机中的物理地址。该地址addr的计算在函数memory_device_get_free_addr()中实现。

pc_memory_plug

对于普通的dimm设备,插入工作也分成两个步骤:

  • 添加MemoryRegion -> pc_dimm_plug

  • 添加acpi -> piix4_device_plug_cb

前者将dimm设备的内存注册到系统中,这个通过memory_region_add_subregion来实现。

后者做的工作主要是在真的hotplug的情况下发送一个acpi的事件,这样虚拟机的内核才能触发内存热插的工作。 假如没有理解错,这个acpi事件会通过中断告知虚拟机。

PreviousPCDIMM实例Next创建ACPI表

Last updated 5 years ago

Was this helpful?