【问题标题】:Running Java programs in gem5(or any language which is not C)在 gem5(或任何非 C 语言)中运行 Java 程序
【发布时间】:2019-10-15 16:44:05
【问题描述】:

这可能是一个愚蠢的问题,但我最近正在学习 gem5,并且我能够使用该软件在系统调用仿真和完整系统仿真中模拟我的 C 程序。但是,每当我尝试在其中模拟任何 Java 程序时,都会收到此错误(系统调用仿真):

gem5 Simulator System.  http://gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 compiled Aug 26 2019 12:58:15
gem5 started Sep  5 2019 14:56:02
gem5 executing on (...), pid 6115
command line: build/X86/gem5.opt configs/learning_gem5/part1/test.py

Global frequency set at 1000000000000 ticks per second
warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
fatal: fatal condition !obj_file occurred: Cannot load object file /home/taoliveira/Downloads/Gem5/gem5/configs/learning_gem5/part1/../../../my-progs/MergeSort/bin/x86/linux/MergeSort.
Memory Usage: 661468 KBytes

在这种情况下,我尝试了一个简单的合并排序 Java 程序。它在 gem5 模拟器之外正常编译和执行。在我的机器所在的 .py 文件中(它是 gem5 教程的 simple.py),二进制文件是指向 .jar 文件的路径。我听说 .jar 在 gem5 中无法正常工作,但我不知道改用什么。 那么,我必须做什么才能在 gem5 模拟器中运行非 C 程序?在这种情况下,我必须做什么才能运行一个 java 程序?

我到处寻找答案,但找不到。任何人都可以帮助我吗?提前致谢。

我使用的是 Ubuntu 18.04 和 Java 1.8.0_201。

编辑:我尝试将我的 Java 代码转换为本机机器代码 (x86) 并使用 GraalVM 完成,然后我将其传递给 runscript,就像我对 C 程序所做的那样。但是,它在加载脚本时向我显示了一个新错误:

loading script...
Fatal error: Failed to create a new Isolate. (code 6)

以前从未见过,谷歌搜索时没有发现任何关于它的信息。

【问题讨论】:

    标签: java gem5


    【解决方案1】:

    您执行 Java 程序的方式与执行 C 程序的方式完全相同:

    • Gem5 不理解 C,所以如果要执行 C 程序,首先需要将其编译为 Gem5 可以理解的语言,或者需要在以 Gem5 可以理解的语言编写的解释器中进行解释。
    • Gem5 不理解 Java,因此如果要执行 Java 程序,首先需要将其编译为 Gem5 可以理解的语言,或者需要在以 Gem5 可以理解的语言编写的解释器中进行解释。

    以下是我能想到的几种可能性:

    • 使用本机代码编译器将 Java 编译为 Alpha、ARM、Sparc 或 x86 本机机器码,
    • 使用以 Alpha、ARM、Sparc 或 x86 本机机器代码编写(或编译为)的 Java 解释器来解释该 Java 代码,
    • 使用 JVM 编译器将 Java 编译为 JVM 字节码,然后使用以 Alpha、ARM、Sparc 或 x86 本机机器码编写(或编译为)的 JVM 来解释该 JVM 字节码,或者
    • 使用 JVM 编译器将 Java 编译为 JVM 字节码,然后使用本机代码编译器将 JVM 字节码编译为 Alpha、ARM、Sparc 或 x86 本机机器码。

    当然,可以链接和/或混合上述任意数量。

    【讨论】:

    • 抱歉我的无知,但是我怎样才能将java程序编译成x86本机机器码呢?在这个话题之前我有点这个想法,但我无法找到任何方法来做到这一点。我读过 gcj 可以做到这一点,但由于它已经过时,我无法安装它。你知道代码块吗?每当我将我的 C 程序编译到其中时,它都会生成一个可以正常工作的二进制文件。 java程序还有这样的工具吗?
    【解决方案2】:

    类似帖子:Is it possible to run java -jar on gem5 simulator with ISA x86?

    一个完整的系统 Ubuntu 映像几乎肯定可以工作(在运行 gem5 之前使用 QEMU 用户模式预安装 Java)。

    X86 系统调用仿真理论上可以正常工作,命令行类似于:

    build/X86/gem5.opt \
      configs/example/se.py \
      --cmd /usr/bin/java \
      --options HelloWorld \
      --param 'system.cpu[0].workload[:].release = "5.2.1"' \
    

    其中/usr/bin/java 是Java 解释器ELF 可执行文件,就像您的C 程序一样,HelloWorld.class 是作为参数传递给java 的已编译Java 类。

    但是,我在 Ubuntu 18.04 和 gem5 61005bb9ef455b2ac851f8a992f2cec5686e520f 上尝试了这个,但失败了:

    /usr/bin/java: 加载共享库时出错: libjli.so: 无法打开共享对象文件: 没有这样的文件或目录

    我不确定为什么会这样,这需要进一步调查。

    类似于 Python:Is it possible to run Python code in Gem5 syscall emulation mode?

    【讨论】:

    • 我不熟悉 QEMU,但在我的情况下,我只需要使用 gem5 来模拟程序,而无需其他任何东西。另外,我怎样才能获得 Java 程序的 ELF 可执行文件?在我的 C 程序中,它只是由 CodeBlocks 自动生成的。
    • @Thiago QEMU 只是为了轻松修改完整的系统磁盘映像。请谷歌如何从命令行编译和运行 C 和 Java 程序。学习如何在 CLI 上做所有事情是除了 IDE 方法之外的基础:-)
    • 嗨,西罗。我用我今天尝试的东西编辑了这篇文章。你能看看吗?你知道它可以是什么吗?
    • @Thiago 你好。您必须确定错误消息是来自 gem5 还是来自您的程序,并进一步挖掘,例如至少一个堆栈跟踪。也就是说,使用 GraalVM 的性能特征可能与实际系统的 Java 实现有很大不同。它适用于您的主机吗?
    • 我在使用 native-image 转换后测试了 java 的可执行文件。它工作正常。显示的错误来自 gem5 的 m5out 目录中正在进行的模拟的输出,文件 system.pc.com_1.device。我不知道它是什么,也不知道如何深入研究这样的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2019-02-16
    相关资源
    最近更新 更多