Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
699 views
in Technique[技术] by (71.8m points)

linux - gem5 syscall emulation arm C hello world fails with "fatal: syscall gettid (#224) unimplemented"

I am having the following error in gem5. This happens in ARM only. With X86 I see some syscalls being ignored but none causing a fatal error.

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

I found this answer in gem5's FAQ. But now it shows this error:

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

I am compiling in Ubuntu 18.04 using this:

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

Has anyone found a way to compile a simple hello world, targeting ARM, that doesn't use syscalls not supported by gem5? There are pre-compiled examples so there must be a way.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

update: x86, arm and aarch64 C hello world is working on Ubuntu 18.04 pre-packaged toolchain, see: How to compile and run an executable in gem5 syscall emulation mode with se.py?

"FATAL: kernel too old" has been previously asked at: How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?

As explained in that page, that message comes from a glibc sanity check, and ct-ng is the sanest approach to overcome it.

As for the unimplemented syscalls, I don't know why x86 ignores them and arm blows up, but it should be easy to grep that up in the source if you give the x86 syscall ignored message.

But the blow up behavior does seem sensible: how can you expect your program to work properly when it tries to run an unimplemented syscall?

Most syscalls are unimplemented in both archs as can be seen at:

So, I only see two sensible solutions:

  • implement the syscall, which is easy for most of them, and send gem5 a patch
    • have a look if other archs implement it by grepping, sometimes another arch has already implemented it and you just need to write things up
    • you could also try to ignore the syscall, TODO: is there a good way in ARM? But you have to be pretty sure that it won't matter.
  • give up on syscall emulation and just use full system which is saner: When to use full system FS vs syscall emulation SE with userland programs in gem5?

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...