3

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

4

1 回答 1

4

最小的工作 Ubuntu 设置

首先要注意一件事:动态链接的可执行文件首先运行动态加载程序,这意味着除了静态 ELF 的主要内容之外还有更多的启动指令。因此,如果您有一个小的用户空间测试,并且这个时间差恰好发生在“5 秒到 50 秒”的障碍上,那么当您使用该测试用例迭代模拟器/测试用例补丁时,它可能会破坏您的生产力。例如,我观察到一个 C++ hello world 调试版本,其中 DerivO3CPU 在 6 秒内运行一个静态可执行文件,在 150 秒内运行一个动态可执行文件!

从 gem5 8162e0da0285d346046151b2a45ceeb1baf63b8f 2018 年 10 月开始,适用于所有 x86、arm 和 aarch64 的 C hello world 仅适用于 Ubuntu 16.04 和 18.04。x86 以前可以正常工作,但该提交最终确定了一些必要的 arm 更改,以使 glibc int 代码在正常工作之前main运行。

鉴于 gem5 版本和其中一个 Ubuntu 版本,您可以运行以下 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

-static在 ARM 上是必需的,如:如何在 gem5 中运行动态链接的可执行系统调用仿真模式 se.py?尽管不再需要它,但它仍然需要更少的 CLI 选项并且更易于使用。

Ubuntu 交叉编译器安装也提到:How to compile and run an executable in gem5 syscall emulation mode with se.py?

还有一些 gem5 in-tree 用户示例,其中一些具有适当的交叉编译支持,位于tests/test-progs.

如果有人在较新的 gem5 修订版或 Ubuntu 版本中发现这样的最小 C 程序在前面提到的拱门之一中无法正确执行的设置,请向邮件列表发送一封详细描述您的系统设置的电子邮件并抄送我。

缺少系统调用

当然,当您尝试运行更复杂的用户态程序时,您将不可避免地遇到未实现的系统调用,因为其中有很多。

请不要将它们报告为错误,除非它们出现在最小 C 示例的 glibc 设置代码中,因为我们已经在源代码本身上有一个缺失系统调用的列表。

相反,不要被推迟,并尝试一个补丁!

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

此外,或者,您可以将系统调用标记为忽略ignoreFunc,如果您认为跳过它们不会显着影响执行,请参见:https ://github.com/gem5/gem5/blob/8162e0da0285d346046151b2a45ceeb1baf63b8f/src/arch/arm/ linux/process.cc#L161

只有到那时,如果您尝试了一个补丁,但失败了,请开始 ping 邮件列表中的人,并寻求有关如何使您的补丁工作的指导。

有关的:

多线程

TODO 这是一个已知的主要痛点。我不知道状态是什么,但我听说它很不稳定。

使 ARM 工作的最新修复

随着事情不可避免地再次发生故障,您也许可以从我们所做的以下修复中获得一些灵感,并可能自己修补问题:

crosstool-NG

使用 crosstool-NG 来启用 ulibc 而不是 glibc 有时可以作为 glibc 初始化代码的解决方法,因为 ulibc 比 glibc 更小,练习更少的代码。这并不理想,但如果你真的无法修补 gem5,它可能会起作用。描述于:在系统调用仿真 SE 模式下运行 gem5 时如何解决“致命:内核太旧”?

如果您还需要从头开始生成完整的系统映像,另一种可能性是使用 Buildroot 构建的交叉编译器,请参阅此示例

还有一些树内脚本可以跨编译器构建:util/build_cross_gcc但我只会使用 crosstool-NG,它会排除对其他项目的交叉编译器的维护。

于 2018-10-31T13:53:01.030 回答