오늘은 initramfs가 있는 이미지에서 별도의 커널과 rootfs가 있는 이미지로 변경했습니다. 이러한 이미지는 Linux 2.6.39에서 실행되는 임베디드 시스템(ARM9 SAM9G25)용입니다. 부팅하는 동안 initramfs에는 나타나지 않는 다음 경고가 표시됩니다.
WARNING: at kernel/irq/handle.c:130 handle_irq_event_percpu+0x70/0x198()
irq 12 handler atmci_interrupt+0x0/0x6b0 enabled interrupts
Modules linked in:
Backtrace:
[<c0024918>] (dump_backtrace+0x0/0x10c) from [<c01f5664>] (dump_stack+0x18/0x1c)
r6:c005d558 r5:00000009 r4:c028fea8 r3:c02956bc
[<c01f564c>] (dump_stack+0x0/0x1c) from [<c0030f74>] (warn_slowpath_common+0x54/0x6c)
[<c0030f20>] (warn_slowpath_common+0x0/0x6c) from [<c0031030>] (warn_slowpath_fmt+0x38/0x40)
r8:00000000 r7:00000000 r6:0000000c r5:00000001 r4:c7969f60
r3:00000009
[<c0030ff8>] (warn_slowpath_fmt+0x0/0x40) from [<c005d558>] (handle_irq_event_percpu+0x70/0x198)
r3:0000000c r2:c025b447
[<c005d4e8>] (handle_irq_event_percpu+0x0/0x198) from [<c005d6b0>] (handle_irq_event+0x30/0x40)
[<c005d680>] (handle_irq_event+0x0/0x40) from [<c005f274>] (handle_level_irq+0xbc/0xe4)
r4:c02976a8 r3:00020000
[<c005f1b8>] (handle_level_irq+0x0/0xe4) from [<c0021078>] (asm_do_IRQ+0x78/0xa8)
r4:0000000c r3:c005f1b8
[<c0021000>] (asm_do_IRQ+0x0/0xa8) from [<c0021a74>] (__irq_svc+0x34/0x60)
Exception stack(0xc028ff48 to 0xc028ff90)
ff40: 00000000 0005317f 0005217f 60000013 c028e000 c02ab1a4
ff60: c03b9480 c0291f0c 20000000 41069265 2001c2a8 c028ff9c 600000d3 c028ff90
ff80: c0022748 c0022754 60000013 ffffffff
r5:fefff000 r4:ffffffff
[<c0022714>] (default_idle+0x0/0x44) from [<c0022908>] (cpu_idle+0x70/0xc8)
[<c0022898>] (cpu_idle+0x0/0xc8) from [<c01f37f4>] (rest_init+0x60/0x78) r5:c001d5c4 r4:c0290094
[<c01f3794>] (rest_init+0x0/0x78) from [<c00088c0> (start_kernel+0x23c/0x284)
[<c0008684>] (start_kernel+0x0/0x284) from [<20008038>] (0x20008038)
---[ end trace 45f8d0076fc9ced3 ]---
시스템이 여기서 충돌하지 않고 평소처럼 부팅되어 결국 작동한다고 말해야 합니다(결국 배포판인 Busybox를 사용하게 되었습니다).
내가 뭘 한거지:각각 약 1GB의 FAT32 파티션 2개가 있는 SD 카드를 만들었습니다. 첫 번째는 부트로더와 커널이고, 두 번째는 Buildroot 2013.11의 도움으로 생성된 rootfs.tar를 추출한 곳입니다.
Linux 명령줄은 다음과 같습니다.
console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw
(이것이 여기에 속하는지 확실하지 않지만 처음에는 mmcblk를 초기화할 수 없었기 때문에 rootfs를 전혀 시작할 수도 없었습니다. 이제는 rootwait
잘 작동합니다).
내 질문은: 이 오류가 어디서 발생하는지 아는 사람이 있나요? 이와 관련된 유용한 스레드를 어디에서도 찾을 수 없습니다. 시작하는 동안 시간이 좀 낭비되는 것 같아서 이 오류를 제거하고 싶습니다. 이것이 내 실제 목표입니다. 시작 시간을 최소한으로 유지하는 것입니다.
답변1
이것은 커널 어딘가에 있는 버그입니다. 이는 rootfs/initramfs 변경과 직접적인 관련이 없습니다. 이는 다른 변경 사항(동일한 소스, 동일한 구성, 동일한 컴파일러를 사용하고 있습니까?) 때문일 수도 있고, 근본적인 버그를 드러내는 일부 타이밍 문제와 관련될 수도 있습니다.
이 경고는 다음에서 비롯됩니다.handle_irq_event_percpu
인터럽트 핸들러는 다음 용도로 사용됩니다.아트멜 MMC 컨트롤러. 이 코드에는 버그가 있을 수 있습니다.
추적 이외의 다른 결과를 관찰하지 않더라도 이러한 경고는 데이터 손상이나 최소한 잠금을 초래할 수 있는 심각한 문제를 나타내는 경향이 있습니다. 디버깅은 쉽지 않습니다. 상당히 오래된 커널이라는 점을 감안할 때 잠재적으로 관련된 수정 사항이 있는지 이 드라이버의 최신 버전을 확인하고 가능하면 최신 커널 사용을 고려하십시오.