目前,我正在尝试运行qemu-system-arm for armv7体系结构,为分页做一些初始设置,然后启用MMU。
我使用gdb存根运行qemu并连接到它,然后连接到gdb。
我一定是把转换表/寄存器/等等搞砸了,我在控制寄存器中设置mmu启用位的那一刻,gdb就不能再从内存中提取数据了:在执行ni命令(执行mmu启用指令)之后,它不能获取下一个命令,我也不能访问内存。
有没有办法看看Qemu的MMU内部发生了什么?从哪里得到翻译表,计算什么等。
或者我应该用我的附加调试输出重新编译它吗?
发布于 2015-07-12 22:56:51
不,如果不自己修改QEMU的源代码来添加调试输出,就无法跟踪它。这是一个更普遍趋势的具体案例,即QEMU的设计和方法在很大程度上是“快速运行正确的代码”,而不是对可能有缺陷的客人的行为进行详细的反思。有时,就像在本例中一样,有一个很好的位置可以添加您自己的调试打印;有时,就像打印来宾所做的所有内存访问一样,C代码中没有任何地方可以将跟踪用于捕获所有访问。
发布于 2015-07-13 06:23:33
不,如果不自己修改QEMU的源代码,就无法跟踪这些
所以我就这么做了。对于ARM体系结构,相关代码可以在target-arm/helper.c - get_phys_addr*函数中找到.
发布于 2016-01-22 07:43:18
当我使用QEMU在与同事一起构建的操作系统内核中调试VM问题时,我最终将GDB连接到调试QEMU (而不是调试QEMU中的来宾进程)。
您可以在MMU表上放置断点,然后遍历它。
https://stackoverflow.com/questions/31187709
复制相似问题