java - 使用 Java 的 Qemu 用户仿真

标签 java qemu kvm

我正在使用 QEMU 模拟器来跟踪用户程序的执行。我们添加了一个辅助函数,可以打印所有已执行指令的 IP。我们已经针对素数程序的两种变体测试了该工具的工作情况——一种使用 C 语言,另一种使用 Java。我们为每个程序尝试了 4 个不同的输入参数,期望在每种​​情况下执行不同数量的指令。 C 版本的素数程序遵循预期的线性趋势,即行数随着输入的增加而增加。然而,Java 程序每次给出完全相同数量的指令。

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

JVM修改后的代码在QEMU上跑到哪里去了? QEMU 有什么特殊的方式来捕获自修改代码的执行吗?

最佳答案

Hotspot JVM(您可能正在使用的那个)有两种执行 java 代码的模式:解释和编译。当你启动一个程序时,它首先会以解释模式运行。如果 JVM 决定一段代码执行得足够频繁,它就会编译它并使用编译后的代码。

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

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

关于java - 使用 Java 的 Qemu 用户仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22506590/

相关文章:

linux - 如何获取文件夹的大小,包括稀疏文件的表观大小? (du太慢了)

java - 循环 while 和 if 语句优先级

java - 使用java在中缀到后缀应用程序中获取错误输出

java - 如何在一个 jar 中导出多个同名文件?

linux - 运行Qemu后只是黑屏

程序集 8086-从堆栈中插入和弹出寄存器不起作用

linux - virt-manager 双显示器鼠标不工作

java - 自定义 Eclipse 编辑器 : auto-complete brackets

assembly - 切换到 32 位保护模式导致 QEMU 循环重启

linux - KVM 进行的系统调用