Linux 커널을 업그레이드한 후 /sbin/init가 중단됩니다.

Linux 커널을 업그레이드한 후 /sbin/init가 중단됩니다.

ARM SOC(AT91SAM9G25)를 사용하는 플랫폼에서 커널을 3.2에서 4.4로 업그레이드하고 있습니다. 이것은 sysv 시스템입니다. 3.2 이전에는 잘 작동했지만 4.4 커널을 부팅할 때 /sbin/init를 실행한 후 중단됩니다. U-Boot bootargs에 "init=/bin/sh"를 지정하면 쉘이 성공적으로 실행됩니다(쉘 프롬프트가 나타납니다). 거기에서 모든 것이 정상적으로 보였습니다. /proc를 마운트하고, rootfs가 마운트되었는지 확인하고, NIC 인터페이스를 불러오는 등의 작업을 수행할 수 있습니다.

다양한 ARM SOC(AT91SAM9G45)를 실행하는 다양한 플랫폼에서 이 업그레이드를 성공적으로 수행했습니다. 이것이 작동하는 다른 플랫폼과 중단되는 플랫폼 간의 커널 구성을 비교했습니다. 유일한 차이점은 다양한 SOC와 관련된 차이점입니다. 커널 구성 차이점은 다음과 같습니다.

300,301c300,301
< CONFIG_PLATFORM_SLK1=y
< # CONFIG_PLATFORM_SLK2 is not set
---
> # CONFIG_PLATFORM_SLK1 is not set
> CONFIG_PLATFORM_SLK2=y
421c421
< CONFIG_ARM_APPENDED_DTB_FILE="arch/arm/boot/dts/slk1.dtb"
---
> CONFIG_ARM_APPENDED_DTB_FILE="arch/arm/boot/dts/slk2.dtb"
1061c1061
< # CONFIG_MTD_M25P80 is not set
---
> CONFIG_MTD_M25P80=y
1311,1314c1311
< CONFIG_NET_VENDOR_MICREL=y
< # CONFIG_KS8842 is not set
< # CONFIG_KS8851 is not set
< # CONFIG_KS8851_MLL is not set
---
> # CONFIG_NET_VENDOR_MICREL is not set
2414c2411,2450
< # CONFIG_USB_GADGET is not set
---
> CONFIG_USB_GADGET=y
> # CONFIG_USB_GADGET_DEBUG is not set
> # CONFIG_USB_GADGET_DEBUG_FILES is not set
> # CONFIG_USB_GADGET_DEBUG_FS is not set
> CONFIG_USB_GADGET_VBUS_DRAW=2
> CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
> 
> #
> # USB Peripheral Controller
> #
> # CONFIG_USB_AT91 is not set
> CONFIG_USB_ATMEL_USBA=y
> # CONFIG_USB_FUSB300 is not set
> # CONFIG_USB_FOTG210_UDC is not set
> # CONFIG_USB_GR_UDC is not set
> # CONFIG_USB_R8A66597 is not set
> # CONFIG_USB_PXA27X is not set
> # CONFIG_USB_MV_UDC is not set
> # CONFIG_USB_MV_U3D is not set
> # CONFIG_USB_M66592 is not set
> # CONFIG_USB_BDC_UDC is not set
> # CONFIG_USB_NET2272 is not set
> # CONFIG_USB_GADGET_XILINX is not set
> # CONFIG_USB_DUMMY_HCD is not set
> # CONFIG_USB_CONFIGFS is not set
> # CONFIG_USB_ZERO is not set
> # CONFIG_USB_AUDIO is not set
> # CONFIG_USB_ETH is not set
> # CONFIG_USB_G_NCM is not set
> # CONFIG_USB_GADGETFS is not set
> # CONFIG_USB_FUNCTIONFS is not set
> # CONFIG_USB_MASS_STORAGE is not set
> # CONFIG_USB_G_SERIAL is not set
> # CONFIG_USB_MIDI_GADGET is not set
> # CONFIG_USB_G_PRINTER is not set
> # CONFIG_USB_CDC_COMPOSITE is not set
> # CONFIG_USB_G_ACM_MS is not set
> # CONFIG_USB_G_MULTI is not set
> # CONFIG_USB_G_HID is not set
> # CONFIG_USB_G_DBGP is not set
2584,2585c2620,2621
< # CONFIG_RTC_DRV_AT91RM9200 is not set
< CONFIG_RTC_DRV_AT91SAM9=y
---
> CONFIG_RTC_DRV_AT91RM9200=y
> # CONFIG_RTC_DRV_AT91SAM9 is not set
2599c2635
< # CONFIG_AT_HDMAC is not set
---
> CONFIG_AT_HDMAC=y
3058c3094
< CONFIG_DEBUG_UART_PHYS=0xffffee00
---
> CONFIG_DEBUG_UART_PHYS=0xfffff200

셸로 부팅하면(init=/bin/sh 사용) "/sbin/init -i"를 실행할 수 있으며 시스템은 정상적으로 부팅됩니다(init의 PID는 1이 아닙니다). 그러나 "exec /sbin/init" 또는 "exec /sbin/init -i"가 중단됩니다.

init가 멈추는 위치를 찾는 방법에 대한 아이디어가 있습니까?

답변1

커널이 멈추는 원인을 찾은 것 같습니다. atmel_serial 드라이버는 init가 콘솔 장치(/dev/console)를 닫을 때 UART 송신기를 비활성화합니다. 그런 다음 커널의 다음 printk가 중단되어 THR이 비어 있을 때까지 기다리느라 바쁩니다. 이 버그는 업스트림 4.4-at91 브랜치(https://github.com/linux4sam/linux-at91/commit/0a1757cfa5ba3b46f6ee7a74ddb7a5c0bd5d7c2f)

관련 정보