추가 시작 로그가 첨부되어 있습니다.
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를 정적으로 링크하도록 하여 문제를 극복할 수 있었습니다.