Linux kernel /init之后exitcode=0x00000004的内核死机

Linux kernel /init之后exitcode=0x00000004的内核死机,linux-kernel,arm,embedded-linux,panic,Linux Kernel,Arm,Embedded Linux,Panic,我有一个嵌入式ARM系统,处理器为AT91SAM9G45。我尝试用initramfs为这个系统构建linux内核。内核版本是4.14.79 在设备上加载内核和initramfs映像后,我有以下几点: 内核肯定会找到initramfs映像,将其解压缩并将其设置到内存中 内核定义样式在initramfs映像中查找所有文件,我在添加到linux内核源代码中的调试消息中看到了它 解压缩initramfs映像后,内核尝试启动/init进程/init进程启动并立即返回0(0表示无错误),然后立即抛出内核死机

我有一个嵌入式ARM系统,处理器为AT91SAM9G45。我尝试用initramfs为这个系统构建linux内核。内核版本是4.14.79

在设备上加载内核和initramfs映像后,我有以下几点:

  • 内核肯定会找到initramfs映像,将其解压缩并将其设置到内存中

  • 内核定义样式在initramfs映像中查找所有文件,我在添加到linux内核源代码中的调试消息中看到了它

  • 解压缩initramfs映像后,内核尝试启动/init进程/init进程启动并立即返回0(0表示无错误),然后立即抛出内核死机消息:

  • 释放未使用的内核内存:384K

    此体系结构没有内核内存保护

    在/init之前运行_init_进程

    在/init之后运行_init_进程,结果=0

    内核死机-不同步:试图杀死init! exitcode=0x00000004

    “run_init_process_BEFORE/init”和“run_init_process/init,result=0”是我添加到linux源代码中的调试消息

    Initramfs映像是使用busybox构建的

    我尝试启动的初始脚本或可执行文件没有区别。结果是一样的。若/init脚本试图回显某条消息并休眠几秒钟,内核不会显示该消息,也不会等待,并立即抛出紧急消息

    所以我静态编译了这个简单的程序并尝试启动它:

    #include <stdio.h>
    
    int main(int argc, char *argv)
    {
      printf("Hello world!\n");
      sleep(999999999);
    }
    
    #包括
    int main(int argc,char*argv)
    {
    printf(“你好,世界!\n”);
    睡眠(999999999);
    }
    
    同样的结果,没有“Hello world!”也没有睡眠:

    释放未使用的内核内存:384K

    此体系结构没有内核内存保护

    在/hello之前运行\u init\u进程

    在/hello之后运行\u init\u进程,结果=0

    内核死机-不同步:试图杀死init! exitcode=0x00000004

    如果我用x86_64 gcc编译器编译这个程序,结果是-8:

    同样的结果,没有“Hello world!”和睡眠:

    释放未使用的内核内存:384K

    此体系结构没有内核内存保护

    在/hello之前运行\u init\u进程

    在/hello之后运行\u init\u进程,结果=-8

    内核死机-不同步:试图杀死init! exitcode=0x00000004

    这意味着linux内核定义了文件在当前平台上是否可执行

    若我编译hello.c程序时并没有静态链接,结果是-2(之后是内核死机消息)。如果我将.so文件放在/lib文件夹的initramfs映像中,结果是0,之后是内核死机消息。若我放置使用x86_64编译器编译的.so文件,结果是-13,之后是内核死机消息


    那么这条消息的原因是什么?我找不到它。

    exitcode是您将从wait()获得的。挖掘WEXITSTATUS和WTERMSIG定义,这意味着程序从信号4以状态0退出。 4是SIGILL-非法指令

    所以init程序出了问题-它被破坏了,或者是因为处理器类型错误,或者类似的事情


    它试图执行导致处理器调用“非法指令”异常的代码。内核尽职尽责地看到了这一点,并用SIGILL杀死了有问题的程序。然后它注意到原来是
    init
    ,因为现在没有任何东西可以运行,所以很恐慌。

    您使用了正确的交叉编译器吗

    在我的例子中,我遵循下面的链接,通过QEMU引导ARM Linux,当我使用ARM Linux gnueabihf-(即硬浮点)gcc编译器时,我得到了与退出代码0x00000004相同的错误


    当我使用arm linux gnueabi-重新编译所有内容时,内核成功启动。请检查这是否解决了您的问题。

    评论不用于进一步讨论;此对话已被取消。在构建(使用yocto zeus)linux stable+busybox并禁用thumb指令集后,我遇到了相同的错误(
    CONFIG\u ARM\u thumb未设置
    ,且
    CONFIG\u ARM\u THUMBEE未设置
    )。我正在使用Yocto
    DEFAULTTUNE=“cortexa8hf neon”
    为TI AM335x构建。当我恢复支持thumb指令的早期defconfig时,内核恐慌停止了。@Robert Calhoun:设置
    CONFIG\u ARM\u thumb
    对我来说已经足够了。看起来,或
    init
    本身或某种连接到它的东西被编译为一种应用程序。谢谢你的提醒!