/ sbin / init trava após a atualização do kernel do Linux

0

Estou atualizando o kernel em uma plataforma usando um SOC ARM (AT91SAM9G25) de 3.2 para 4.4. Este é um sistema sysv. O 3.2 anterior funciona bem, mas ao inicializar o kernel 4.4, ele trava após o exec de / sbin / init. Eu posso especificar 'init = / bin / sh' nas bootargs do U-Boot e ele executa com sucesso o shell (recebo um prompt do shell). De lá, as coisas parecem corretas; Eu posso montar / proc, verificar se o rootfs está montado, abrir uma interface NIC, etc.

Eu realizei esta atualização com sucesso em uma plataforma diferente executando um SOC de ARM diferente (AT91SAM9G45). Eu comparei as configurações do kernel entre esta outra plataforma que funciona e aquela que trava. As únicas diferenças são aquelas relacionadas aos diferentes SOCs. As diferenças de configuração do kernel seguem:

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

Se eu inicializar em um shell (com init = / bin / sh), posso executar '/ sbin / init -i' e o sistema inicializará normalmente (o init possui um PID diferente de 1). No entanto, 'exec / sbin / init' ou 'exec / sbin / init -i' trava.

Alguma idéia de como descobrir onde o init está suspenso?

    
por Jay 17.07.2017 / 22:04

1 resposta

0

Acho que encontrei a causa desse problema no kernel. O driver atmel_serial está desativando o transmissor UART quando o init fecha o dispositivo do console (/ dev / console). O próximo printk do kernel então trava, ocupado esperando que o THR fique vazio. Este bug foi corrigido na ramificação upstream 4.4-at91 ( link )

    
por 21.07.2017 / 20:13

Tags