커널 패닉 - 동기화되지 않음: 요청된 초기화/초기화 실패(오류 -2)

커널 패닉 - 동기화되지 않음: 요청된 초기화/초기화 실패(오류 -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 명령을 사용하여 Linux 커널, dtb 및 rootfs.cpio(buildroot에서 컴파일됨)가 포함된 FIT 이미지를 로드합니다. 관련 정보는 여기에 있습니다:FIT_TEST

커널에 전달된 bootargs는 다음과 같습니다.

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

노트:

몇 가지 다른 방법을 시도했지만 동일한 오류가 발생했습니다.

  • 커널, dtb 및 fs 이미지를 별도로 전달합니다.
  • init 스크립트, 간단한 디렉토리 구조 및 /bin/busybox에 있는 별도로 컴파일된 busybox를 사용하여 기본 initramfs를 시도했습니다.
  • 외부 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-toolchain이 왜 문제를 해결했는지는 모르겠지만 busybox를 정적으로 링크하도록 하여 문제를 극복할 수 있었습니다.

관련 정보