gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:28:19 27 4
gpt4 key购买 nike

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

最佳答案

最小的 Ubuntu 设置
首先要注意一件事:动态链接的可执行文件首先运行动态加载程序,这意味着除了静态 ELF 的 pre main 内容之外,还有更多的启动指令。因此,如果您有一个小的用户空间测试,并且这个时间差恰好发生在“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 代码 run before 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 上需要,如以下所述: How to run a dynamically linked executable syscall emulation mode se.py in gem5?尽管不再需要它,但它仍然需要更少的 CLI 选项并且更易于使用。
Ubuntu 交叉编译器安装也提到: How to compile and run an executable in gem5 syscall emulation mode with se.py?
tests/test-progs 下还有一些 gem5 树内用户示例,其中一些具有适当的交叉编译支持。 .
如果有人在较新的 gem5 修订版或 Ubuntu 版本中发现这样的最小 C 程序无法在前面提到的拱门之一中正确执行的设置,请发送一封电子邮件,详细描述您的系统设置到邮件列表并抄送我。
缺少系统调用
当然,当您尝试运行更复杂的用户态程序时,您将不可避免地遇到未实现的系统调用,因为其中有很多。
请不要将这些报告为错误,除非它们出现在最小 C 示例的 glibc 设置代码中,因为我们已经在源代码本身上有一个缺失的系统调用列表。
相反,不要被推迟,并尝试一个补丁!
许多系统调用实现起来很简单,例如参见 8162e0da0285d346046151b2a45ceeb1baf63b8f .
此外,或者,您可以使用 ignoreFunc 将系统调用标记为忽略。 ,如果您认为跳过它们不会显着影响执行,请参见例如: https://github.com/gem5/gem5/blob/8162e0da0285d346046151b2a45ceeb1baf63b8f/src/arch/arm/linux/process.cc#L161
只有这样,如果您尝试过补丁,但失败了,请开始在邮件列表中 ping 人并寻求有关如何使补丁工作的指导。
有关的:
  • gem5 syscall emulation OpenBLAS cblas_dgemm fails with "fatal: syscall mbind (#237) unimplemented"
  • gem5 syscall emulation arm C hello world fails with "fatal: syscall gettid (#224) unimplemented"

  • 多线程
    TODO 这是一个已知的主要痛点。我不知道状态是什么,但我听说它是​​片状的。
    使 ARM 正常工作的最新修复
    随着事情不可避免地再次出现问题,您可以从我们所做的以下修复中获得一些灵感,并可能自己修补问题:
  • FATAL: kernel too old :How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?修正者:260b0fc5381a47c681e7ead8e4f13aad45069665
  • openat未实现。 Ubuntu 18.04上的glibc ARM启动代码开始使用它,打破了hello world。修正者:8162e0da0285d346046151b2a45ceeb1baf63b8f
  • panic: Attempted to execute unimplemented instruction 'mrs' .修正者:6efe7e1abf9d289859eb23b52b3a319f15f2736a .通过手动解码,执行的指令是mrs x0, midr_el1 .

  • crosstool-NG
    使用 crosstool-NG 启用 ulibc 而不是 glibc 有时可以作为 glibc init 代码的解决方法,因为 ulibc 比 glibc 更小,练习更少的代码。这并不理想,但如果您真的无法修补 gem5,它可能会起作用。描述于: How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?
    如果您还需要从头开始生成完整的系统镜像,另一种可能性是使用 Buildroot 构建的交叉编译器, see this example .
    还有一些树内脚本可以在以下编译器中构建: util/build_cross_gcc 但我只会使用 crosstool-NG,它将交叉编译器的维护与其他项目排除在外。

    关于gem5 - 如何使用 se.py 在 gem5 系统调用仿真模式下编译和运行可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53085048/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com