本文主要是介绍【QEMU系统分析之实例篇(七)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系列文章目录
第七章 QEMU系统仿真的机器创建分析实例
文章目录
- 系列文章目录
- 第七章 QEMU系统仿真的机器创建分析实例
- 前言
- 一、QEMU是什么?
- 二、QEMU系统仿真的机器创建分析实例
- 1.系统仿真的命令行参数
- 2.目标机器创建过程
- 3.cpu_exec_init_all()
- io_mem_init()
- memory_map_init()
- 总结
前言
本文以 QEMU 8.2.2 为例,分析其作为系统仿真工具的工作过程,并为读者展示各种 QEMU 系统仿真的启动配置实例。
本文读者需要具备一定的 QEMU 系统仿真使用经验,并对 C 语言编程有一定了解。
一、QEMU是什么?
QEMU 是一个通用且开源的机器模拟器和虚拟机。
其官方主页是:https://www.qemu.org/
二、QEMU系统仿真的机器创建分析实例
1.系统仿真的命令行参数
QEMU 作为系统仿真工具,其入口代码在 system/main.c 文件中,初始化函数 qemu_init() 的实现在 system/vl.c 文件中。
本文将分析以下命令创建目标系统机器的运行过程,读者需要对 QEMU 系统启动过程的程序代码有所了解,相关内容可以参考《QEMU系统分析之启动篇》系列文章。
..\qemu\8.2.2-qkd\qemu-system-x86_64.exe -cpu "Penryn" -M "q35,accel=whpx" -m "6G" -nodefaults
2.目标机器创建过程
这部分代码在 system/vl.c 文件中,实现如下:
int qemu_init(int argc, char **argv)
{
...qemu_create_machine(machine_opts_dict);
...
}
进入 qemu_create_machine() 获取到目标机器类型后,对目标机器属性做相关设置,代码如下:
static void qemu_create_machine(QDict *qdict)
{
...object_set_machine_compat_props(machine_class->compat_props);current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));object_property_add_child(object_get_root(), "machine",OBJECT(current_machine));object_property_add_child(container_get(OBJECT(current_machine),"/unattached"),"sysbus", OBJECT(sysbus_get_default()));
...
}
接下来进入运行环境的初始化,主要是内存及 I/O 存储空间的设定,对应函数为 cpu_exec_init_all(),代码如下:
static void qemu_create_machine(QDict *qdict)
{
...if (machine_class->minimum_page_bits) {if (!set_preferred_target_page_bits(machine_class->minimum_page_bits)) {/* This would be a board error: specifying a minimum smaller than* a target's compile-time fixed setting.*/g_assert_not_reached();}}cpu_exec_init_all();
...
}
本文将跟踪调试函数 cpu_exec_init_all()。
3.cpu_exec_init_all()
函数 cpu_exec_init_all() 在 /system/physmem.c 文件中,定义如下:
void cpu_exec_init_all(void)
{HUEDBG("enter!\n");qemu_mutex_init(&ram_list.mutex);/* The data structures we set up here depend on knowing the page size,* so no more changes can be made after this point.* In an ideal world, nothing we did before we had finished the* machine setup would care about the target page size, and we could* do this much later, rather than requiring board models to state* up front what their requirements are.*/finalize_target_page_bits();io_mem_init();memory_map_init();qemu_mutex_init(&map_client_list_lock);HUEDBG("return!\n");
}
首先,初始化互斥信号量 ram_list.mutex,然后调用函数 finalize_target_page_bits() 确定目标机器的页位数,该操作在 ARM 和 MIPS 平台下有操作,在 x86 平台下无处理。
接着调用函数 io_mem_init() 完成 I/O 存储器的初始化,此函数生成一个全系统统一的访问存储区域。
再调用函数 memory_map_init() 对系统内存地址空间和 I/O 地址空间做映射,为后续设备访问做准备。
最后对互斥信号量 map_client_list_lock 初始化,完成执行的地址空间初始化操作。
io_mem_init()
函数 io_mem_init() 在 /system/physmem.c 文件中,定义如下:
static void io_mem_init(void)
{HUEDBG("enter!\n");memory_region_init_io(&io_mem_unassigned, NULL, &unassigned_mem_ops, NULL,NULL, UINT64_MAX);HUEDBG("exit!\n");
#ifdef HUEDBG_ENABLEhuedbg_dump_MemoryRegion(&io_mem_unassigned, 1);
#endif
}
此处我们已经添加调试信息,该函数初始化 io_mem_unassigned 存储区域,并设定该存储区域大小为 UINT64_MAX。通过调试函数 huedbg_dump_MemoryRegion(&io_mem_unassigned, 1) 我们把初始化后的 io_mem_unassigned 呈现出来。
函数 huedbg_dump_MemoryRegion() 定义如下:
void huedbg_dump_MemoryRegion(MemoryRegion *mr, int deep)
{
#if 0
// from include/exec/memory.h
/** MemoryRegion:** A struct representing a memory region.*/
struct MemoryRegion {Object parent_obj;/* private: *//* The following fields should fit in a cache line */bool romd_mode;bool ram;bool subpage;bool readonly; /* For RAM regions */bool nonvolatile;bool rom_device;bool flush_coalesced_mmio;bool unmergeable;uint8_t dirty_log_mask;bool is_iommu;RAMBlock *ram_block;Object *owner;/* owner as TYPE_DEVICE. Used for re-entrancy checks in MR access hotpath */DeviceState *dev;const MemoryRegionOps *ops;void *opaque;MemoryRegion *container;int mapped_via_alias; /* Mapped via an alias, container might be NULL */Int128 size;hwaddr addr;void (*destructor)(MemoryRegion *mr);uint64_t align;bool terminates;bool ram_device;bool enabled;bool warning_printed; /* For reservations */uint8_t vga_logging_count;MemoryRegion *alias;hwaddr alias_offset;int32_t priority;QTAILQ_HEAD(, MemoryRegion) subregions;QTAILQ_ENTRY(MemoryRegion) subregions_link;QTAILQ_HEAD(, CoalescedMemoryRange) coalesced;const char *name;unsigned ioeventfd_nb;MemoryRegionIoeventfd *ioeventfds;RamDiscardManager *rdm; /* Only for RAM *//* For devices designed to perform re-entrant IO into their own IO MRs */bool disable_reentrancy_guard;
};
#endifHUEDBG("romd_mode=[%u]\n", mr->romd_mode);HUEDBG("ram=[%u]\n", mr->ram);HUEDBG("subpage=[%u]\n", mr->subpage);HUEDBG("readonly=[%u]\n", mr->readonly);HUEDBG("nonvolatile=[%u]\n", mr->nonvolatile);HUEDBG("rom_device=[%u]\n", mr->rom_device);HUEDBG("flush_coalesced_mmio=[%u]\n", mr->flush_coalesced_mmio);HUEDBG("unmergeable=[%u]\n", mr->unmergeable);HUEDBG("dirty_log_mask=[%u]\n", mr->dirty_log_mask);HUEDBG("is_iommu=[%u]\n", mr->is_iommu);HUEDBG("ram_block=[%p]\n", mr->ram_block);HUEDBG("owner=[%p]\n", mr->owner);HUEDBG("dev=[%p]\n", mr->dev);HUEDBG("ops=[%p]\n", mr->ops);HUEDBG("opaque=[%p]\n", mr->opaque);HUEDBG("container=[%p]\n", mr->container);HUEDBG("mapped_via_alias=[%d]\n", mr->mapped_via_alias);//HUEDBG("size=[%016llx%016llx]\n", int128_gethi(mr->size), int128_getlo(mr->size));HUEDBG("size=[%016llx]\n", int128_getlo(mr->size));HUEDBG("addr=[%016llx]\n", mr->addr);HUEDBG("destructor=[%p]\n", mr->destructor);HUEDBG("align=[%016llx]\n", mr->align);HUEDBG("terminates=[%u]\n", mr->terminates);HUEDBG("ram_device=[%u]\n", mr->ram_device);HUEDBG("enabled=[%u]\n", mr->enabled);HUEDBG("vga_logging_count=[%u]\n", mr->vga_logging_count);HUEDBG("alias=[%p]\n", mr->alias);HUEDBG("alias_offset=[%llu]\n", mr->alias_offset);HUEDBG("priority=[%d]\n", mr->priority);//HUEDBG("subregions=[%p]\n", mr->subregions);//HUEDBG("subregions_link=[%p]\n", mr->subregions_link);//HUEDBG("coalesced=[%p]\n", mr->coalesced);HUEDBG("name=[%s]\n", mr->name);HUEDBG("ioeventfd_nb=[%u]\n", mr->ioeventfd_nb);HUEDBG("ioeventfds=[%p]\n", mr->ioeventfds);HUEDBG("rdm=[%p]\n", mr->rdm);HUEDBG("disable_reentrancy_guard=[%u]\n", mr->disable_reentrancy_guard);
}
调试输出的结果如下:
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(70):romd_mode=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(71):ram=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(72):subpage=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(73):readonly=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(74):nonvolatile=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(75):rom_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(76):flush_coalesced_mmio=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(77):unmergeable=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(78):dirty_log_mask=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(79):is_iommu=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(80):ram_block=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(81):owner=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(82):dev=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(83):ops=[00007ff736704ec0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(84):opaque=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(85):container=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(86):mapped_via_alias=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000010000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(89):destructor=[00007ff7358f2220]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(90):align=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(91):terminates=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(92):ram_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(93):enabled=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(94):vga_logging_count=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(95):alias=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(96):alias_offset=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(97):priority=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(98):subregions=[00007ff736849858]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(99):subregions_link=[00007ff736849868]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(100):coalesced=[00007ff736849878]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(101):name=[(null)]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(102):ioeventfd_nb=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(103):ioeventfds=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(104):rdm=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(105):disable_reentrancy_guard=[0]
对完成初始化的存储区域,我们关注到:
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000010000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
该存储区域地址从
地址 0x00000000000000000000000000000000 开始,
大小 0x00000000000000010000000000000000
接下来调用函数 memory_map_init() 完成存储空间的映射。
memory_map_init()
函数 memory_map_init() 在 /system/physmem.c 文件中,定义如下:
static void memory_map_init(void)
{HUEDBG("enter!\n");system_memory = g_malloc(sizeof(*system_memory));memory_region_init(system_memory, NULL, "system", UINT64_MAX);address_space_init(&address_space_memory, system_memory, "memory");
#ifdef HUEDBG_ENABLEhuedbg_dump_AddressSpace(&address_space_memory, 2);
#endifsystem_io = g_malloc(sizeof(*system_io));memory_region_init_io(system_io, NULL, &unassigned_io_ops, NULL, "io",65536);address_space_init(&address_space_io, system_io, "I/O");
#ifdef HUEDBG_ENABLEhuedbg_dump_AddressSpace(&address_space_io, 2);
#endifHUEDBG("exit!\n");
}
从代码中可知,系统存储区域 system_memory 的大小设置为 UINT64_MAX,而系统 I/O 区域 system_io 的大小设置为 65536。
跟踪调试信息如下:
[43960]../system/memory.c/address_space_init(3142):name=[memory] as=0x00007ff736849620
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(164):rcu=[00007ff736849620]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(165):name=[memory]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(166):root=[000001be4f78bcb0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(70):romd_mode=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(71):ram=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(72):subpage=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(73):readonly=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(74):nonvolatile=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(75):rom_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(76):flush_coalesced_mmio=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(77):unmergeable=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(78):dirty_log_mask=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(79):is_iommu=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(80):ram_block=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(81):owner=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(82):dev=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(83):ops=[00007ff736704ec0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(84):opaque=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(85):container=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(86):mapped_via_alias=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000010000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(89):destructor=[00007ff7358f2220]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(90):align=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(91):terminates=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(92):ram_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(93):enabled=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(94):vga_logging_count=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(95):alias=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(96):alias_offset=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(97):priority=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(98):subregions=[000001be4f78bd68]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(99):subregions_link=[000001be4f78bd78]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(100):coalesced=[000001be4f78bd88]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(101):name=[system]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(102):ioeventfd_nb=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(103):ioeventfds=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(104):rdm=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(105):disable_reentrancy_guard=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(171):current_map=[000001be4f75f730]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(126):rcu=[000001be4f75f730]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(127):ref=[3]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(128):ranges=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(132):nr=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(133):nr_allocated=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(134):dispatch=[000001be4f76d180]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(135):root=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(176):ioeventfd_nb=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(177):ioeventfd_notifiers=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(178):ioeventfds=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(179):listeners=[00007ff736849658]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(180):address_spaces_link=[00007ff736849668]...[43960]../system/memory.c/address_space_init(3142):name=[I/O] as=0x00007ff736849680
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(164):rcu=[00007ff736849680]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(165):name=[I/O]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(166):root=[000001be4f78c1e0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(70):romd_mode=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(71):ram=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(72):subpage=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(73):readonly=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(74):nonvolatile=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(75):rom_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(76):flush_coalesced_mmio=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(77):unmergeable=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(78):dirty_log_mask=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(79):is_iommu=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(80):ram_block=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(81):owner=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(82):dev=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(83):ops=[00007ff736703200]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(84):opaque=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(85):container=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(86):mapped_via_alias=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000000000000000010000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(89):destructor=[00007ff7358f2220]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(90):align=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(91):terminates=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(92):ram_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(93):enabled=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(94):vga_logging_count=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(95):alias=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(96):alias_offset=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(97):priority=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(98):subregions=[000001be4f78c298]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(99):subregions_link=[000001be4f78c2a8]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(100):coalesced=[000001be4f78c2b8]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(101):name=[io]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(102):ioeventfd_nb=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(103):ioeventfds=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(104):rdm=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(105):disable_reentrancy_guard=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(171):current_map=[000001be4f75f8b0]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(126):rcu=[000001be4f75f8b0]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(127):ref=[2]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(128):ranges=[000001be4f78c300]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(36):mr=[000001be4f78c1e0]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(40):offset_in_region=[0000000000000000]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(49):addr.start=[0000000000000000]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(50):addr.size =[0000000000010000]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(52):dirty_log_mask=[00]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(53):romd_mode=[1]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(54):readonly=[0]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(55):nonvolatile=[0]
[43960]D:/msys64/home/yuhui/gitee/mingw-qemu/util/huedbg_inline-flat_range.c/huedbg_dump_FlatRange(56):unmergeable=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(132):nr=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(133):nr_allocated=[10]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(134):dispatch=[000001be4f76d720]
[43960]../util/huedbg-memory.c/huedbg_dump_FlatView(135):root=[000001be4f78c1e0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(70):romd_mode=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(71):ram=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(72):subpage=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(73):readonly=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(74):nonvolatile=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(75):rom_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(76):flush_coalesced_mmio=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(77):unmergeable=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(78):dirty_log_mask=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(79):is_iommu=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(80):ram_block=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(81):owner=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(82):dev=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(83):ops=[00007ff736703200]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(84):opaque=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(85):container=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(86):mapped_via_alias=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000000000000000010000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(89):destructor=[00007ff7358f2220]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(90):align=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(91):terminates=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(92):ram_device=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(93):enabled=[1]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(94):vga_logging_count=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(95):alias=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(96):alias_offset=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(97):priority=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(98):subregions=[000001be4f78c298]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(99):subregions_link=[000001be4f78c2a8]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(100):coalesced=[000001be4f78c2b8]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(101):name=[io]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(102):ioeventfd_nb=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(103):ioeventfds=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(104):rdm=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(105):disable_reentrancy_guard=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(176):ioeventfd_nb=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(177):ioeventfd_notifiers=[0]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(178):ioeventfds=[0000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(179):listeners=[00007ff7368496b8]
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(180):address_spaces_link=[00007ff7368496c8]
其中,system_memory 需要关注的信息如下:
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(165):name=[memory]
...
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000010000000000000000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
system_io 需要关注的信息如下:
[43960]../util/huedbg-memory.c/huedbg_dump_AddressSpace(165):name=[I/O]
...
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(87):size=[00000000000000000000000000010000]
[43960]../util/huedbg-memory.c/huedbg_dump_MemoryRegion(88):addr=[00000000000000000000000000000000]
至此,系统存储空间和 I/O 空间就建立好了。
总结
以上分析了系统执行地址空间的创建过程,为后续载入 BIOS 并启动机器做准备。
这篇关于【QEMU系统分析之实例篇(七)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!