在qemu里有几个重要的数据结构来维护虚机的线性地址空间: AddressSpace, MemoryRegion, FlatView, MemoryListener等。 在memory_map_init 中可以看到对两个最重要的address space的初始化: address_space_memory 和 address_space_io staticvoidmemory_map_init(void) { system_memory = g_malloc(sizeof(*system_m...
看一下memory_region_add_eventfd的流程: 内存区域MemoryRegion中的ioeventfds成员按照地址从小到大排序,memory_region_add_eventfd函数会选择合适的位置将ioeventfds插入,并提交更新; 提交更新过程中最终触发回调函数kvm_mem_ioeventfd_add的执行,这个函数指针的初始化是在Qemu进行kvm_init时,针对不同类型的内存区域注册...
memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_ascend_intercept_regs_quirk, &bar0_quirk[0], "vfio-ascend910-bar0-intercept-regs-quirk", ASCEND910_XLOADER_SIZE); memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, bar0_quirk[0].offset, &quirk->mem[0], 1...
在qemu里有几个重要的数据结构来维护虚机的线性地址空间: AddressSpace, MemoryRegion, FlatView, MemoryListener等。 在memory_map_init 中可以看到对两个最重要的address space的初始化: address_space_memory 和 address_space_io staticvoidmemory_map_init(void) { system_memory = g_malloc(sizeof(*system_m...
MemoryRegionIoeventfd*ioeventfds; QLIST_HEAD(, IOMMUNotifier) iommu_notify; IOMMUNotifierFlag iommu_notify_flags; }; MemoryRegion 表示在 Guest memory layout 中的一段内存,可将 MemoryRegion 划分为以下三种类型: 根级MemoryRegion: 直接通过 memory_region_init 初始化,没有自己的内存,用于管理 subregion...
memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_ascend_intercept_regs_quirk, &bar0_quirk[0], "vfio-ascend910-bar0-intercept-regs-quirk", ASCEND910_XLOADER_SIZE); memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, bar0_quirk[0].offset, &quirk->mem[0], 1...
memory_region_init_io(&iomr, owner, ops, priv, name, size); sysbus_init_mmio(sys_bus_device, &iomr); 这样你就有了一个mr对象,Guest的访问由ops的读写函数来响应。 但除了GPIO这种简单设备,几乎没有什么设备只有IO空间的,我们还需要做DMA。如果不使用IOMMU,这也很简单,请求总是通过IO空间进来的,进...
内存区域MemoryRegion中的ioeventfds成员按照地址从小到大排序,memory_region_add_eventfd函数会选择合适的位置将ioeventfds插入,并提交更新; 提交更新过程中最终触发回调函数kvm_mem_ioeventfd_add的执行,这个函数指针的初始化是在Qemu进行kvm_init时,针对不同类型的内存区域注册了对应的memory_listener用于监听变化; ...
倒数第二行memory_region_init_io函数就是初始化内存映射IO,指定了MMIO的操作&hitb_mmio_ops这个的read和write分别指向hitb_mmio_read,hitb_mmio_write 最后pci_register_bar将&pdev->mmio注册到qemu PCI设备的BAR Base Address Registers,BAR记录了设备所需要的地址空间的类型,基址以及其他属性。
staticvoidpc_init1(MachineState *machine,constchar*host_type,constchar*pci_type){ PCMachineState *pcms =PC_MACHINE(machine); PCMachineClass *pcmc =PC_MACHINE_GET_CLASS(pcms); MemoryRegion *system_memory =get_system_memory(); MemoryRegion *system_io =get_system_io();inti; ...