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)

おすすめ記事