【问题标题】:Kernel panic with exitcode=0x00000004 after /init/init 后退出代码 = 0x00000004 的内核恐慌
【发布时间】:2019-01-22 07:22:17
【问题描述】:

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

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

  1. 内核肯定会找到 initramfs 映像,将其解包并放入内存中。

  2. Kernel definityle 找到 initramfs 映像中的所有文件,我在添加到 linux 内核源代码中的调试消息中看到它。

  3. 解压 initramfs 映像内核后尝试启动 /init 进程。 /init 进程启动并立即返回 0(0 表示没有错误),然后立即抛出内核恐慌消息:

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

此架构没有内核内存保护。

在 /init 之前运行_init_process

在 /init 之后运行_init_process,结果 = 0

内核恐慌 - 不同步:试图杀死 init! 退出代码=0x00000004

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

Initramfs 镜像是使用busybox构建的。

没有区别,我尝试启动的初始脚本或可执行文件是什么。结果是一样的。如果 /init 脚本尝试回显某些消息并休眠几秒钟,内核不会显示消息并且不会等待,并且会立即抛出 panic 消息。

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

#include <stdio.h>

int main(int argc, char *argv)
{
  printf("Hello world!\n");
  sleep(999999999);
}

同样的结果,没有“Hello world!”并且没有睡觉:

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

此架构没有内核内存保护。

在 /hello 之前运行_init_process

run_init_process 在 /hello 之后,结果 = 0

内核恐慌 - 不同步:试图杀死 init! 退出代码=0x00000004

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

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

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

此架构没有内核内存保护。

在 /hello 之前运行_init_process

在 /hello 之后运行_init_process,结果 = -8

内核恐慌 - 不同步:试图杀死 init! 退出代码=0x00000004

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

如果我在没有静态链接的情况下编译 hello.c 程序,结果是 -2(以及之后的内核恐慌消息)。如果我将 .so 文件放入 /lib 文件夹的 initramfs 映像中,则结果为 0,并且在此之后出现内核恐慌消息。如果我将使用 x86_64 编译器编译的 .so 文件放入,结果为 -13,并且在此之后出现内核恐慌消息。

那么这条消息的原因是什么?我查不出来。

【问题讨论】:

标签: linux-kernel arm embedded-linux panic


【解决方案1】:

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

所以 init 程序出了点问题 - 它已损坏,或者处理器类型错误,或类似情况。

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

【讨论】:

    【解决方案2】:

    您是否使用了正确的交叉编译器?

    在我的例子中,我按照下面的链接通过 QEMU 启动 ARM Linux,当我使用 arm-linux-gnueabihf-(即,硬-float) gcc 编译器。

    https://www.zachpfeffer.com/single-post/Build-the-Linux-kernel-and-Busybox-and-run-on-QEMU

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

    【讨论】:

    • 在构建(使用 yocto-zeus)linux-stable + busybox 并禁用 thumb 指令集(CONFIG_ARM_THUMB is not setCONFIG_ARM_THUMBEE is not set)后,我遇到了同样的错误。我正在使用 Yocto DEFAULTTUNE="cortexa8hf-neon" 为 TI AM335x 构建。当我恢复支持拇指指令的早期 defconfig 时,内核崩溃停止了。
    • @Robert Calhoun:设置CONFIG_ARM_THUMB 对我来说已经足够了。似乎 init 本身或与之相关的某种东西被编译为 THUMB 类型的应用程序。 THX 提及!
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 2013-12-12
    • 1970-01-01
    • 2010-12-16
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多