眼见为实
纸上得来终觉浅,绝知此事须躬行
讲了这么多概念是时候实际看一看这些数据结构的样子了。这次我们借助程序员的老朋友gdb来帮助我们近距离观察qemu的地址空间。
修改.gdbinit
在qemu源码目录下有一个文件.gdbinit, 这是默认gdb启动时加载的脚本。添加如下内容:
file x86_64-softmmu/qemu-system-x86_64
set args -nographic
source gdb-script
b pc_memory_init
r修改后,在源码目录下直接运行gdb就可以执行这些命令。其含义是:
加载指定可执行文件
设定可执行文件的参数
加载一个脚本gdb-script
设置断点在pc_memory_init
运行
在源码目录下敲入gdb开始我们的探索。
注:请自行编译qemu源码。
查看帮助
脚本中主要的函数有三个,分别带有简单的帮助,可以先看一下。
这三个函数分别用来显示AddressSpace, MemoryRegion和FlatView。
显示AddressSpace
首先来看看当前qemu中AddressSpace的状况。
这个命令可以带两个参数,0或1。
0: 显示地址空间的根MemoryRegion和FlatView
1: 显示地址空间的MemoryRegion树
显示MemoryRegion
接着我们可以查看MemoryRegion的情况。
这个函数可以接受两种参数,变量名或地址。
在这个例子中,我们传入的是上一步地址空间中得到的一个根MemoryRegion的地址。
显示FlatView
看过了MemoryRegion,我们还以看其对应的FlatView。
这个就是刚才那个根MemoryRegion的一维展开了。
怎么样,这样是不是更清楚了?
最近发现在qemu monitor中已经有类似的功能了。直接输入info mtree,就可以获得内存树结构。
Last updated
Was this helpful?