内核恐慌 - 不同步:请求的 init /init 失败(错误 -2)

内核恐慌 - 不同步:请求的 init /init 失败(错误 -2)

附上更多的启动日志。

HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
iommu: Default domain type: Translated 
iommu: DMA domain TLB invalidation policy: strict mode 
SCSI subsystem initialized
EDAC MC: Ver: 3.0.0
clocksource: Switched to clocksource arch_sys_counter
workingset: timestamp_bits=62 max_order=19 bucket_order=0
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
io scheduler mq-deadline registered
cacheinfo: Unable to detect cache hierarchy for CPU 0
brd: module loaded
VFS: Mounted root (tmpfs filesystem) on device 0:15.
Freeing unused kernel memory: 704K
Run /init as init process
  with arguments:
    /init
  with environment:
    HOME=/
    TERM=linux
Kernel panic - not syncing: Requested init /init failed (error -2).
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.15.0-rc7-00001-g8d7daa446b53-dirty #33
Call trace:
 dump_backtrace+0x0/0x1d0
 show_stack+0x14/0x20
 dump_stack_lvl+0x64/0x7c
 dump_stack+0x14/0x2c
 panic+0x158/0x304
 kernel_init+0xf0/0x150
 ret_from_fork+0x10/0x20
Kernel Offset: disabled
CPU features: 0x00001001,20000802
Memory Limit: none
---[ end Kernel panic - not syncing: Requested init /init failed (error -2). ]---

我正在为实验性 FPGA 平台构建嵌入式 Linux 操作系统。我使用了上游 U-boot(引导加载程序)、linux(内核)和 buildroot(仅用于文件系统)。

我遵循了一些示例,并在我的 Linux 配置中启用了所需的 initrd/initramfs 支持。

CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=10240

我在u-boot中使用bootm命令加载一个FIT映像,该映像包含linux内核、dtb和rootfs.cpio(从buildroot编译)。相关信息在这里:FIT_测试

这些是传递给内核的 bootargs:

console=ttyS0,9600 earlyprintk maxcpus=1 earlycon root=/dev/ram init=/init rw rootfstype=tmpfs debug

笔记:

我尝试了其他一些事情,但导致了同样的错误。

  • 分别传递内核、dtb 和 fs 映像。
  • 尝试了一个基本的 initramfs,只有一个 init 脚本、简单的目录结构和一个单独编译的 busybox,放置在 /bin/busybox 中并带有符号链接。
  • 我没有传递外部 FS,而是传递了 initramfs 源的路径,并使用 CONFIG_INITRAMFS_SOURCE 将其编译到内核中。

我将不胜感激任何有关我可能遗漏的内容的反馈/指示,我已经坚持了一段时间了。

答案1

Linux 启动成功进入命令行。我切换到不同的 gcc arm 编译器工具链。我尝试了 aarch64-linux-gnu- 和 linaro 工具链的版本,但它们不起作用。但使用 aarch64-none-linux-gnu- (10.3 版本)使它可以工作。不知道为什么这会产生影响。使用 Initramfs 确实有助于启动进程。

答案2

虽然我不确定为什么 aarch64-none-linux-gnu- 工具链解决了你的问题,但我能够通过强制 busybox 静态链接来克服这个问题。

相关内容