如何解决"致命:内核太旧了#34;在syscall仿真SE模式下运行gem5时?

时间:2018-02-24 04:24:53

标签: gem5

Ubuntu 17.10,C程序:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    puts("hello");
    return EXIT_SUCCESS;
}

gem5版本:da79d6c6cde0fbe5473ce868c9be4771160a003b 2017年12月

GCC版本:

$ sudo apt-get install gcc-arm-linux-gnueabi
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0

编译并运行:

./gem5/gem5/build/ARM/gem5.opt ./gem5/gem5/configs/example/se.py -c ./a.out
arm-linux-gnueabi-gcc -static kernel_module/user/hello.c

结果:

gem5 Simulator System.  http://gem5.org             
gem5 is copyrighted software; use the --copyright option for details.                                    

gem5 compiled Feb 23 2018 05:25:49                  
gem5 started Feb 24 2018 04:10:38                   
gem5 executing on ciro-p51, pid 3092                
command line: ./gem5/gem5/build/ARM/gem5.opt ./gem5/gem5/configs/example/se.py -c ./a.out                

Global frequency set at 1000000000000 ticks per second                                                   
warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)          
0: system.remote_gdb.listener: listening for remote gdb #0 on port 7000                                  
**** REAL SIMULATION ****                           
info: Entering event queue @ 0.  Starting simulation...                                                  
FATAL: kernel too old                               
warn: ignoring syscall rt_sigprocmask(...)          
      (further warnings will be suppressed)         
fatal: syscall gettid (#224) unimplemented.         
Memory Usage: 659680 KBytes 

类似于X86。

这已经在邮件列表上反复询问,所以让我们在这里集中讨论并确定最佳解决方案。

https://www.mail-archive.com/gem5-users@gem5.org/msg12385.html提供了一个很好的问题描述:

  

在_start()开始后不久,C库发出uname()   系统调用以验证最小内核版本。   如果你看一下gem5 / src / arch / arm / linux / process.cc http://process.cc,你会的   看到在32位模式下,模拟系统调用返回&#34; 3.0.0&#34;在64,   &#34; 3.7.0 +&#34 ;.   在crosstool-ng中配置工具链时,有一个选项   &#34; CT_LIBC_GLIBC_MIN_KERNEL_VERSION&#34 ;.   如果它比模拟的uname()报告的要大,那么glibc将致命()。

我注意到如果我使用神奇的in-tree blob:

tests/test-progs/hello/bin/arm/linux/hello

那么blob有什么特别的,它是如何生成的?

源代码上允许的源版本

823d9d177fded16af07114d70b5c26caaec6aa00告诉我们假定内核版本定义的x86点为src/arch/x86/linux/process.cc

unameFunc(SyscallDesc *desc, int callnum, Process *process,
    ...
    strcpy(name->release, "3.2.0");

类似的grepping告诉我们,手臂32位于3.0和64位于3.7.0。

crosstool-ng次尝试

一种很有希望的可能性是使用crosstool-ng https://github.com/crosstool-ng/crosstool-ng生成编译器,这样可以更好地控制事物。

截至ab3c204aee88f08481f1f63825d0e94b082ef84e我尝试了以下两种配置:

  • ./ct-ng arm-cortex_a15-linux-gnueabihf
  • ./ct-ng aarch64-unknown-linux-gnu

使用GCC 8.1编译内核4.16,然后静态编译分别在gem5 49f96e7b77925837aa5bc84d4c3453ab5f07408e上失败:

fatal: syscall openat (#322) unimplemented.

panic: Attempted to execute unimplemented instruction 'mrs' (inst 0x4d5380000)

但我真的不了解任何失败:

  • openat是在更老的内核2.6.16中引入的,它看起来并不那么奇特,为什么它还没有被实现呢?

    我们之后可以在消息来源上看到它is implemented for 64 bitis not implemented for 32 bit出于某种原因。

    我还尝试将arm最小内核版本设置为3.2,但不出所料,它没有帮助。

  • 为什么指令mrs无法实施? ARM参考文献称该指令编码以:

    结尾
    1 1 0 1 0 1 0 1 0 0 1 1
    

    是:

    d 5 2
    

    所以它可能与0x4d5380000匹配,但我不确定。

使用不同的crosstool-ng设置也很有趣,特别是目标内核版本,在该版本中默认为最新的v4.16,以查看它是否解决了系统调用问题。

测试于gem5 49f96e7b77925837aa5bc84d4c3453ab5f07408e 2018年5月。

1 个答案:

答案 0 :(得分:1)

更新gem5 2019年5月

在修补补丁https://gem5-review.googlesource.com/c/public/gem5/+/17849之后,现在可以修复&#34;问题只有:

gem5.opt se.py --param 'system.cpu[:].workload[:].release = "4.18.0"'

然后,您应该设置与您的工具链或更新版本匹配的内核版本。

我不知道如何轻松地为Ubuntu prebuild交叉工具链找到最小值,但您可以尝试设置最新的内核版本,或者99.99.99

一个太新的版本可能导致glibc使用gem5中尚未实现的可选新内核功能,但我认为这并不常见。

Ubuntu 18.04 with gem5 Oct 2018

在最近几次gem5更新之后,所有x86,arm,aarch64的C hello世界都与预打包的Ubuntu工具链一起工作。这在How to compile and run an executable in gem5 syscall emulation mode with se.py?

中有详细描述

crosstool-ng x86_64-unknown-linux-gnu

使用gem5 49f96e7b77925837aa5bc84d4c3453ab5f07408e,ct-ng ab3c204aee88f08481f1f63825d0e94b082ef84e。由于某种原因,根据file生成旧Linux内核3.2的可执行文件。

<强> uClibc的

这可能是一个坏主意,但如果我们使用crosstool-ng和uclibc而不是glibc:

./ct-ng aarch64-unknown-linux-uclibc

然后该实现没有内核检查,并且hello world适用于所有arch。

由于某些原因mrs在这种情况下没有使用,因为glibc倾向于在它的主要功能上使用更多功能。然而,在How to compile and run an executable in gem5 syscall emulation mode with se.py?

中提到的稍后提交中解决了该问题

当然,其他未实现的更复杂程序的系统调用肯定会失败。