【发布时间】:2019-01-22 07:22:17
【问题描述】:
我有一个带有处理器 AT91SAM9G45 的嵌入式 ARM 系统。我尝试为这个系统构建带有 initramfs 的 linux 内核。内核版本为 4.14.79。
在设备上加载内核和 initramfs 映像后,我有以下内容:
内核肯定会找到 initramfs 映像,将其解包并放入内存中。
Kernel definityle 找到 initramfs 映像中的所有文件,我在添加到 linux 内核源代码中的调试消息中看到它。
解压 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,并且在此之后出现内核恐慌消息。
那么这条消息的原因是什么?我查不出来。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: linux-kernel arm embedded-linux panic