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);//将别名MRram_below_4g添加为system_memory的subregion,设置偏移addr为0e8...
别名MemoryRegion: 通过 memory_region_init_alias 初始化,没有自己的内存,表示实体 MemoryRegion(如 pc.ram) 的一部分,通过 alias 成员指向实体 MemoryRegion,alias_offset 代表了该别名MemoryRegion所代表内存起始GPA相对于实体 MemoryRegion 所代表内存起始GPA的偏移量。如 ram_below_4g 、ram_above_4g 等。 代码...
MMIO类型的内存使用memory_region_init_io()来初始化,其中MemoryRegionOps包含了这些回调函数。 container可以简单地包含其他的memory region,用来表达一些组合关系。container使用memory_region_init()来初始化。 alias可以用来防止一个原始的region被添加到不同的parent region中。比如一块外设的内存会被不同的cpu访问,...
(1)初始化system_memory MR *分配alias MR:ram_below_4g,并调用memory_region_init_alias初始化并分配内存 *分配alias MR:ram_above_4g,并调用memory_region_init_alias初始化并分配内存 *将以上两个MR作为sub MR加入system_memory MR中,memory_region_add_subregion *将新分配的内存region注册到guest的E820表中...
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; ...
从上节的configure_accelerator()函数往下走,会执行cpu_exec_init_all()函数,该函数主要初始化了IO地址空间和系统地址空间。memory_map_init()函数初始化系统地址空间,有一个全局的MemoryRegion指针system_memory指向该区域的MemoryRegion结构。 staticvoidmemory_map_init(void)...
addresspace上是在ram所在的区域,但是实际的hva却指向pci的region, memory_region_init_alias() 初始化 8 保留区域: 主要用于调试,使用 memory_region_init_io() 初始化 3 几个约束和建议 1 别名MemoryRegion没有子Region 2 建议使用一个纯容器作为父MemoryRegion, 一个整个空间的MemoryRegion作为背景MemoryRegion...
MemoryRegion *alias; hwaddr alias_offset; int32_t priority; bool may_overlap; QTAILQ_HEAD(subregions, MemoryRegion) subregions; QTAILQ_ENTRY(MemoryRegion) subregions_link; QTAILQ_HEAD(coalesced_ranges, CoalescedMemoryRange) coalesced; const char *name; //MemoryRegion的名字,调试时使用 ...
内存映射I/O (Memory-mapped I/O —— MMIO)端口映射I/O (port-mapped I/O —— PMIO) 通过Memory 空间访问设备I/O的方式称为memory mapped I/O,即MMIO,这种情况下,CPU直接使用普通访存指令即可访问设备I/O。通过I/O 空间访问设备I/O的方式称为port mapped I/O,即PMIO,这种情况下CPU需要使用专门的I...
MemoryRegion有多种类型,可以表示一段ram,rom,MMIO,alias,alias表示一个MemoryRegion的一部分区域,MemoryRegion也可以表示一个container,这就表示它只是其他若干个MemoryRegion的容器。在MemoryRegion中,'ram_block'表示的是分配的实际内存。struct RAMBlock { struct rcu_head rcu; struct MemoryRegion *mr; uint8_t...