gem5 系统调用仿真 arm C hello world 失败 "fatal: syscall gettid (#224) unimplemented"
gem5 syscall emulation arm C hello world fails with "fatal: syscall gettid (#224) unimplemented"
我在 gem5 中遇到以下错误。这只发生在 ARM 中。使用 X86,我看到一些系统调用被忽略,但 none 导致致命错误。
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 不支持的系统调用?有预编译的例子,所以一定有办法。
更新:x86、arm 和 aarch64 C hello world 正在开发 Ubuntu 18.04 预打包工具链,请参阅:How to compile and run an executable in gem5 syscall emulation mode with se.py?
"FATAL: kernel too old" 之前曾在以下位置询问过:How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?
如该页面所述,该消息来自 glibc 健全性检查,ct-ng
是克服它的最明智的方法。
至于未实现的系统调用,我不知道为什么 x86 会忽略它们并且 arm 崩溃了,但是如果你给出 x86 系统调用被忽略的消息,应该很容易在源代码中找到它。
但是爆炸行为看起来确实是明智的:当程序尝试 运行 一个未实现的系统调用时,你怎么能期望它正常工作呢?
大多数系统调用都未在两个体系结构中实现,可以在以下位置看到:
- https://github.com/gem5/gem5/blob/5de8ca95506a5f15bfbfdd2ca9babd282a882d1f/src/arch/arm/linux/process.cc#L123
- https://github.com/gem5/gem5/blob/5de8ca95506a5f15bfbfdd2ca9babd282a882d1f/src/arch/x86/linux/process.cc#L222
所以,我只看到两个合理的解决方案:
- 实施系统调用,这对他们中的大多数人来说都很容易,并向 gem5 发送一个补丁
- 看看其他archs是否通过grepping实现了它,有时另一个archs已经实现了它,你只需要写下来
- 您也可以尝试忽略系统调用,TODO:ARM 中有好的方法吗?但你必须非常确定这无关紧要。
- 放弃系统调用仿真,只使用更健全的完整系统:When to use full system FS vs syscall emulation SE with userland programs in gem5?
uclibc 是为 gem5 编译的答案。它不使用 glibc 使用的一堆系统调用,并且 gem5 没有实现。所以使用 crosstool-ng 和 arm-unknown-linux-uclibcgnueabi 解决了这个问题。
我在 gem5 中遇到以下错误。这只发生在 ARM 中。使用 X86,我看到一些系统调用被忽略,但 none 导致致命错误。
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 不支持的系统调用?有预编译的例子,所以一定有办法。
更新:x86、arm 和 aarch64 C hello world 正在开发 Ubuntu 18.04 预打包工具链,请参阅:How to compile and run an executable in gem5 syscall emulation mode with se.py?
"FATAL: kernel too old" 之前曾在以下位置询问过:How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?
如该页面所述,该消息来自 glibc 健全性检查,ct-ng
是克服它的最明智的方法。
至于未实现的系统调用,我不知道为什么 x86 会忽略它们并且 arm 崩溃了,但是如果你给出 x86 系统调用被忽略的消息,应该很容易在源代码中找到它。
但是爆炸行为看起来确实是明智的:当程序尝试 运行 一个未实现的系统调用时,你怎么能期望它正常工作呢?
大多数系统调用都未在两个体系结构中实现,可以在以下位置看到:
- https://github.com/gem5/gem5/blob/5de8ca95506a5f15bfbfdd2ca9babd282a882d1f/src/arch/arm/linux/process.cc#L123
- https://github.com/gem5/gem5/blob/5de8ca95506a5f15bfbfdd2ca9babd282a882d1f/src/arch/x86/linux/process.cc#L222
所以,我只看到两个合理的解决方案:
- 实施系统调用,这对他们中的大多数人来说都很容易,并向 gem5 发送一个补丁
- 看看其他archs是否通过grepping实现了它,有时另一个archs已经实现了它,你只需要写下来
- 您也可以尝试忽略系统调用,TODO:ARM 中有好的方法吗?但你必须非常确定这无关紧要。
- 放弃系统调用仿真,只使用更健全的完整系统:When to use full system FS vs syscall emulation SE with userland programs in gem5?
uclibc 是为 gem5 编译的答案。它不使用 glibc 使用的一堆系统调用,并且 gem5 没有实现。所以使用 crosstool-ng 和 arm-unknown-linux-uclibcgnueabi 解决了这个问题。