如何使用se.py在gem5 syscall仿真模式下编译和运行可执行文件?

时间:2018-10-31 13:53:01

标签: gem5

有许多可能的错误和解决方法散布在不同的地方,任何人都可以提供至少一个详细的工作设置,以及准确的gem5和编译器版本,希望能在Ubuntu上使用吗?

1 个答案:

答案 0 :(得分:2)

最小化Ubuntu设置

从gem5 8162e0da0285d346046151b2a45ceeb1baf63b8f开始,到2018年10月,适用于所有x86,arm和aarch64的C hello世界仅适用于Ubuntu 16.04和18.04。 x86以前可以正常工作,但是commit最终完成了一些必要的更改,以使glibc int代码run before main正常工作。

鉴于gem5版本和其中一个Ubuntu版本,您可以运行以下C程序:

main.c

#include <stdio.h>

int main(int argc, char **argv) {
    size_t i;
    for (i = 0; i < (size_t)argc; ++i)
        printf("%s\n", argv[i]);
    return 0;
}

简单地为:

sudo apt-get install gcc
gcc -O0 -ggdb3 -std=c99 -static -o x86.out main.c
build/X86/gem5.opt \
  configs/example/se.py \
  -c x86.out \
  -o 'asdf qwer' \
;

sudo apt-get install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc -O0 -ggdb3 -std=c99 -static -o arm.out main.c
build/ARM/gem5.opt \
  configs/example/se.py \
  -c arm.out \
  -o 'asdf qwer' \
;

sudo apt-get install gcc-aarch64-linux-gnu
aarch64-linux-gnu-gcc -O0 -ggdb3 -std=c99 -static -o aarch64.out main.c
build/ARM/gem5.opt \
    configs/example/se.py \
    -c aarch64.out \
    -o 'asdf qwer' \
;

并在所有情况下都能产生正确的输出:

asdf
qwer
How to run a dynamically linked executable syscall emulation mode se.py in gem5?

所述,

-static在ARM上是必需的

如果有人找到了较新的gem5版本或Ubuntu版本的安装程序,而在上述提到的其中一个拱门中无法正确执行此类最小C程序,请向电子邮件列表和CC发送详细描述您的系统设置的电子邮件我。

缺少系统调用

然后,当然,当您尝试运行更复杂的userland程序时,不可避免地会遇到未实现的syscall,因为其中有很多。

请不要将这些错误报告为错误,除非它们出现在glibc设置代码中(作为最小的C示例),因为我们已经在源代码本身上列出了缺少的系统调用。

相反,不要拖延,而是尝试打补丁!

许多系统调用很容易实现,例如参见8162e0da0285d346046151b2a45ceeb1baf63b8f

然后,如果您尝试了补丁程序但失败了,请开始ping通邮件列表中的人员,并寻求有关如何使补丁程序正常工作的指导。

多线程

这是已知的主要痛点。我不知道状态是什么,但我听说它是​​片状的。

使ARM工作的最新修补程序

随着事情不可避免地再次发生,您可能可以从我们已完成的以下修复中汲取灵感,并可能自己解决问题:

crosstool-NG

使用crosstool-NG而不是glibc来启用ulibc有时可以作为glibc初始化代码的解决方法,因为ulibc比glibc最少,所执行的代码更少。这不是理想的方法,但是如果您真的无法修补gem5,则可能会起作用。描述于:How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?