使用Java进行Qemu用户仿真

pra*_*kar 12 java kvm qemu

我正在使用QEMU模拟器来跟踪用户程序的执行.我们添加了一个辅助函数,它打印所有执行指令的IP.我们已经测试了这个工具的工作原理,用于两个素数程序的变体 - 一个用C语言,另一个用Java语言.我们为每个程序尝试了4个不同的输入参数,期望在每种​​情况下执行不同数量的指令.素数程序的C版遵循预期的线性趋势,即线数随着输入的增加而增加.但是,Java程序每次都提供完全相同数量的指令.

我觉得Java执行跟踪只捕获JVM代码而不是正在运行的实际代码.

JVM修改的代码在QEMU上运行在哪里?QEMU是否有任何特殊方式捕获自修改代码的执行?

rue*_*ste 2

Hotspot JVM(您可能正在使用的那个)有两种执行 java 代码的模式:解释模式和编译模式。当您启动一个程序时,它将首先以解释模式运行。如果 JVM 认为某个代码块执行得足够频繁,它将对其进行编译并使用编译后的代码。

所以你应该看到执行指令数量的线性趋势,但是只要 JVM 以解释模式运行,你就只能看到来自解释器的指令,因为没有与 java 代码相对应的字节码。

您知道 x86 CPU 的性能计数器吗?它们可用于测量指令数量,而无需使用任何虚拟机。https://perf.wiki.kernel.org/index.php/Main_Page