memory_region_init_alias(ram_below_4g, NULL,"ram-below-4g", ram,0, pcms->below_4g_mem_size);//初始化别名MR ram_below_4g,将其alias指向ram,alias_offset为0memory_region_add_subregion(system_memory,0, ram_below_4g);//将别名MR
system_memory =g_malloc(sizeof(*system_memory)); memory_region_init(system_memory,"system", INT64_MAX); set_system_memory_map(system_memory); system_io = g_malloc(sizeof(*system_io)); memory_region_init(system_io,"io", 65536); set_system_io_map(system_io); memory_listener_register...
MMIO类型的内存使用memory_region_init_io()来初始化,其中MemoryRegionOps包含了这些回调函数。 container可以简单地包含其他的memory region,用来表达一些组合关系。container使用memory_region_init()来初始化。 alias可以用来防止一个原始的region被添加到不同的parent region中。比如一块外设的内存会被不同的cpu访问,...
别名MemoryRegion: 通过 memory_region_init_alias 初始化,没有自己的内存,表示实体 MemoryRegion(如 pc.ram) 的一部分,通过 alias 成员指向实体 MemoryRegion,alias_offset 代表了该别名MemoryRegion所代表内存起始GPA相对于实体 MemoryRegion 所代表内存起始GPA的偏移量。如 ram_below_4g 、ram_above_4g 等。 代码...
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; ...
qemu 使用MemoryRegion组织虚拟机的物理内存空间,MemoryRegion表示一段逻辑内存区域,它的类型如下: RAM:普通内存,qemu通过向主机申请虚拟内存来实现。 MMIO:MMIO内存在读写时会调用初始化mr时指定的回调函数,回调函数由MemoryRegionOps指定,在memory_region_init_io时指定 ...
pci_memory = g_new(MemoryRegion, 1); memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); rom_memory = pci_memory; } else { pci_memory = NULL; rom_memory = system_memory; } // 这里注意,在主板使能 pci 的情况下,rom_memory 其实就是 pci_memorypc_memory_init(pcms, system_mem...
memory_region_init_alias(ram_below_4g, NULL,"ram-below-4g", ram, 0, below_4g_mem_size); //ram-below-4g到4G之间的地址主要是留给PCI设备的mmio地址使用 memory_region_add_subregion(system_memory, 0, ram_below_4g); e820_add_entry(0, below_4g_mem_size, E820_RAM); ...
MemoryRegion有多种类型,可以表示一段ram,rom,MMIO,alias,alias表示一个MemoryRegion的一部分区域,MemoryRegion也可以表示一个container,这就表示它只是其他若干个MemoryRegion的容器。在MemoryRegion中,'ram_block'表示的是分配的实际内存。struct RAMBlock { struct rcu_head rcu; struct MemoryRegion *mr; uint8_t...
“memory banks used when the guest address space is smaller than the amount of RAM addressed”,说是alias类型MemoryRegion适用于这种场景,大概意思就是qemu给guest提供的物理内存超过了guest的address space,这时就得用alias类型的MemoryRegion了,那这儿的memory banks是什么意思,物理内存条有rank/bank,这儿的bank...