【问题标题】:gem5 syscall emulation arm C hello world fails with "fatal: syscall gettid (#224) unimplemented"gem5 系统调用仿真 arm C hello world 失败并显示“致命:系统调用 gettid (#224) 未实现”
【发布时间】:2018-12-17 18:23:12
【问题描述】:

我在 gem5 中遇到以下错误。这仅在 ARM 中发生。在 X86 中,我看到一些系统调用被忽略,但没有一个会导致致命错误。

tomas@ubuntu:~/gem5$ ./build/ARM/gem5.opt configs/example/arm/starter_se.py ../tests_gem5/hello
gem5 Simulator System.  http://gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 compiled Jul  9 2018 17:09:01
gem5 started Jul  9 2018 18:07:37
gem5 executing on ubuntu, pid 5064
command line: ./build/ARM/gem5.opt configs/example/arm/starter_se.py ../tests_gem5/hello

info: 1. command and arguments: ['../tests_gem5/hello']
Global frequency set at 1000000000000 ticks per second
warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (1024 Mbytes)
warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (1024 Mbytes)
0: system.remote_gdb: listening for remote gdb on port 7000
info: Entering event queue @ 0.  Starting simulation...
fatal: syscall openat (#322) unimplemented.
Memory Usage: 2246296 KBytes

我在 gem5 的常见问题解答中找到了 this 答案。但是现在它显示了这个错误:

warn: ignoring syscall openat(...)
FATAL: kernel too old
warn: ignoring syscall rt_sigprocmask(...)
      (further warnings will be suppressed)
fatal: syscall gettid (#224) unimplemented.

我正在使用这个在 Ubuntu 18.04 中编译:

arm-linux-gnueabi-gcc hello.c -o hello -static -DUNIX

有没有人找到一种方法来编译一个简单的 hello world,针对 ARM,不使用 gem5 不支持的系统调用?有预编译的例子,所以一定有办法。

【问题讨论】:

标签: linux arm cross-compiling system-calls gem5


【解决方案1】:

更新:x86、arm 和 aarch64 C hello world 正在开发 Ubuntu 18.04 预打包工具链,请参阅:How to compile and run an executable in gem5 syscall emulation mode with se.py?

“致命:内核太旧”之前已在以下位置提问:How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?

如该页面所述,该消息来自 glibc 健全性检查,ct-ng 是克服它的最明智的方法。

至于未实现的系统调用,我不知道为什么 x86 会忽略它们并导致 arm 崩溃,但是如果您给出 x86 系统调用被忽略的消息,应该很容易在源代码中找到它。

但是这种爆炸行为似乎是明智的:当您的程序尝试运行未实现的系统调用时,您怎么能期望它正常工作?

大多数系统调用在两个架构中都未实现,如下所示:

所以,我只看到两个明智的解决方案:

  • 实现系统调用,这对他们中的大多数人来说很容易,并发送 gem5 补丁
    • 看看其他 Arch 是否通过 grepping 实现了它,有时另一个 Arch 已经实现了,你只需要写出来
    • 您也可以尝试忽略系统调用,TODO:ARM 中有什么好的方法吗?但您必须非常确定这不会有什么影响。
  • 放弃系统调用仿真,只使用更健全的完整系统:When to use full system FS vs syscall emulation SE with userland programs in gem5?

【讨论】:

  • 感谢您的回答,我想我需要去 FS,因为我没有足够的经验(也没有时间)来实现系统调用。
  • 后续问题,为什么像int main() {int a=2,b=1; int c=a+b; return c} 这样的简单程序需要系统调用?我试过这样的程序,甚至没有 printf,但它仍然无法请求 openat 系统调用。
  • 我无法评论你的其他帖子,所以我会在这里发表评论,你是否能够使用ct-ng成功编译为arm?如果是这样,你能分享一下你是怎么做到的吗?我遇到了一些麻烦:tomas@ubuntu:~/crosstool-ng-1.23.0$ ./ct-ng aarch64-unknown-linux-uclib make: *** No rule to make target 'aarch64-unknown-linux-uclib'. Stop.
  • @tgonzaleza 1) 你很好地提出了一个关于系统调用的单独问题:stackoverflow.com/questions/51270445/… 我没有比那里提供的更好的答案。 2)ct-ng:这是一个错字,最后缺少c。固定的。您可以列出现有配置:./ct-ng list-samples。 3) 如果你正在做一些真正最小的东西并且真的不需要 Linux,另请参阅stackoverflow.com/questions/43682311/… 中提到的 ctng newlib 裸机设置
【解决方案2】:

uclibc 是为 gem5 编译的答案。它没有使用 glibc 使用的一堆系统调用,并且 gem5 没有实现。所以使用 crosstool-ng 和 arm-unknown-linux-uclibcgnueabi 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多