Arm Qemu:跟踪MMU操作

Arm Qemu:跟踪MMU操作,arm,qemu,emulation,Arm,Qemu,Emulation,目前,我正在尝试运行qemu系统arm,针对armv7体系结构,对分页进行一些初始设置,然后启用MMU 我用gdb存根运行qemu,然后用gdb连接到它 我一定是把翻译表/寄存器等搞砸了,问题是我在控制寄存器中设置MMU启用位的那一刻,gdb就再也无法从内存中获取数据了:在执行MMU启用指令的ni命令之后,它不会获取下一个命令,我也无法访问内存 有没有办法看看Qemu的MMU内部发生了什么?它从何处获取转换表,计算内容等 或者我应该用额外的调试输出重新编译它吗?不,如果不自己修改QEMU的源代码

目前,我正在尝试运行qemu系统arm,针对armv7体系结构,对分页进行一些初始设置,然后启用MMU

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

我一定是把翻译表/寄存器等搞砸了,问题是我在控制寄存器中设置MMU启用位的那一刻,gdb就再也无法从内存中获取数据了:在执行MMU启用指令的ni命令之后,它不会获取下一个命令,我也无法访问内存

有没有办法看看Qemu的MMU内部发生了什么?它从何处获取转换表,计算内容等


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

不,如果不自己修改QEMU的源代码以添加调试输出,就无法跟踪它。这是一个更普遍趋势的具体案例,即QEMU的设计和方法在很大程度上是“快速运行正确的代码”,而不是对可能有问题的客户的行为进行详细的反省。有时,就像在本例中一样,有一个很好的位置可以添加您自己的调试打印;有时,就像打印来宾所做的所有内存访问一样,C代码中没有任何地方可以放置跟踪来捕获所有访问


不,如果不亲自修改QEMU的资料来源,就无法追踪到这一点


所以我做了。对于ARM体系结构,相关代码可以在target ARM/helper.c-get\u phys\u addr*函数中找到。

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


您可以在MMU表遍历函数上放置断点并单步执行。

翻译表地址存储在ttrb0/1寄存器中。armv7参考资料中解释了mmu如何处理这些表manual@AlexHoppus我完全同意,但我想检查一下我的描述符,这就是调试输出有用的地方。无论如何,我已经整理了qemu源代码并添加了我自己的日志。。。