【QEMU系统分析之实例篇(七)】

2024-05-01 15:44
文章标签 实例 qemu 系统分析

本文主要是介绍【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系统分析之实例篇(七)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/952055

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解