Qemu:跟踪MMU操作

Qemu: trace MMU operation

目前我正在尝试 运行 qemu-system-arm armv7 架构,做一些初始设置分页,然后启用 MMU。

我 运行 qemu 与 gdb 存根,然后用 gdb 连接到它。

我一定是把翻译搞砸了 tables/registers/etc,问题是我在控制寄存器中设置 MMU 启用位的那一刻,gdb 无法再从内存中获取数据:[=20= 之后]ni 执行 mmu 启用指令的命令它不获取下一个命令并且我无法访问内存。

有什么方法可以查看 Qemu 的 MMU 内部发生了什么?从哪里获取翻译表,计算什么等等

或者我应该用额外的调试输出重新编译它吗?

不,如果不自己修改 QEMU 的源代码以添加调试输出,就无法跟踪这一点。这是一个更普遍趋势的具体案例,即 QEMU 的设计和方法在很大程度上是 "run correct code quickly",而不是对可能有问题的客户的行为提供详细的内省。有时,就像在这种情况下,有一个很好的简单位置来添加您自己的调试打印;有时,就像打印来宾进行的所有内存访问的相当普遍的愿望一样,C 代码中没有任何地方可以放置跟踪来捕获所有访问。

No, there's no way to trace this without modifying QEMU's sources yourself

所以我做到了。对于ARM架构,相关代码见target-arm/helper.c - get_phys_addr* 函数。

当我使用 QEMU 调试我与同事构建的操作系统内核中的 VM 问题时,我最终连接 GDB 来调试 QEMU(而不是调试 QEMU 内部的来宾进程)。

您可以在 MMU table walking 函数上放置断点并单步执行它。