其root指向根MemoryRegion, 对于全局变量address_space_memory而言,其root指向系统全局的system_memory,address_space_io的root则指向system_io.由于根MR可能有自己的若干个subregion,因此每个AddressSpace一般包含一系列MemoryRegion,形成树状结构。 struct AddressSpace { /* All fields are private. */ struct rcu_head...
Object parent_obj;boolram;//标记是否为ram类型的MRboolreadonly;//For RAM regions,标记是否为ROM类型的MRRAMBlock *ram_block;//实际申请的物理内存块信息,不为null则关联一段实际内存constMemoryRegionOps *ops;//是否为MMIO类型的MRMemoryRegion *container;//MemoryRegion所属的父容器,当前MR为subregionInt12...
3. 别名MemoryRegion:这种MemoryRegion中不分配物理内存,代表了实体MemoryRegion的一个部分,通过alias域指向实体MemoryRegion,alias_offset代表了该别名MemoryRegion所代表内存起始GPA相对于实体MemoryRegion所代表内存起始GPA的偏移量,通常用来计算别名MemoryRegion对应的物理内存的HVA值:HVA = 起始HVA + alias_offset。如图中...
dev) { dev = ppce500_init_mpic_qemu(pms, irqs); } s = SYS_BUS_DEVICE(dev); memory_region_add_subregion(ccsr, MPC8544_MPIC_REGS_OFFSET, s->mmio[0].memory); return dev; } 后续就是调用ppce500_init_mpic_qemu,而sysbus_realize_and_unref 之前也说过,会调用到具体的device.c的...
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...
(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 ...
memory_region_add_subregion(&s->mem, s->opregbase+s->portscbase, &s->mem_ports); } 在usb_ehci_init函数中又注册了对opreg区域读写的操作函数, staticconstMemoryRegionOpsehci_mmio_opreg_ops= { .read=ehci_opreg_read, .write=ehci_opreg_write, ...
在这一步中还会将创建一个isa_bios作为BIOS MemoryRegion的别名,并且放到最靠近1MB的128KB处。memory_region_add_subregion将bios这个MemoryRegion作为子Region添加到了rom_memory上面。回溯调用栈,可以发现,rom_memory实际上就是pci_memory。 现在已经分配了一个BIOS MemoryRegion,并且设置了其基地址和大小,也将BIOS的...
memory_region_add_subregion(system_memory, 0x100000000ULL, ram_above_4g); e820_add_entry(0x100000000ULL, above_4g_mem_size, E820_RAM); } ... } legacy devices的地址一般是固定的,在设备初始化的时候就可以通过memory_region_add_subregion加入到地址空间的确切位置。
MemoryRegion *system_memory =get_system_memory(); MemoryRegion *system_io =get_system_io();inti; PCIBus *pci_bus; ISABus *isa_bus; PCII440FXState *i440fx_state;intpiix3_devfn =-1; qemu_irq *i8259; qemu_irq smi_irq; GSIState *gsi_state; ...