2014-05-21 111 views
2

我已經爲armv6l構建了一個最小的Busybox initramfs系統。內核版本是3.12.20。如果我編譯內核,而不CONFIG_ARM_UNWIND | Enable stack unwinding support (EXPERIMENTAL)然後通過SSH連接到系統並運行此腳本:堆棧展開支持?

#!/bin/sh 

while : 
do 
    dmesg 
done 

消息「殺」很短的時間後,會顯示在屏幕上,並且系統變得不可用。如果我看着控制檯,我看到OOM殺手已經殺死了/ bin/sh。我沒有運行該腳本來觸發此行爲,有時SSH連接將在登錄後立即斷開。

我能夠登錄後,系統,但外殼不適用,因此我不能運行任何命令。但是,運行腳本將始終引發問題。我做了一些測試,發現在OOM殺手殺死外殼之前,幾乎所有的512 MB內存都是免費的,所以沒有理由讓OOM殺手殺死任何東西。

經過一番研究,我仍然不明白什麼是堆棧展開支持,但該功能是實驗性的,所以我不希望它是我的系統可用的必需條件。

任何人都可以解釋爲什麼功能系統需要此功能嗎?

+0

有各種功能取決於'UNWIND'支持。事實上,如果你不選擇'UNWIND',[使用另一種機制](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/ Kconfig.debug#n31)(即,RMK將不得不殺死你;意味着ARM Linux維護者)。如果你沒有編譯,並且* bug *沒有觸發,那麼'UNWIND'可能是*真正bug的無辜犧牲品;例如堆棧溢出。信息真的太少了;除非你只想要帶'?'的部分回答?事實上,你使用的編譯器會發揮這一點。 –

+0

最有可能的是,重複的'dmesg'正在引起某種比賽。一個真正的問題正在發生;內核任務SEGV,然後展開將嘗試打印診斷。此時,您正在不斷訪問想要打印此信息的日誌。串行控制檯將是更好的機制。你的SSH依賴於很多功能;網絡堆棧,驅動程序,用戶空間sshd等。串口控制檯將輸出錯誤而不運行常量'dmesg'。 –

+0

即使您有很多*空閒內存*,也可以調用OOM。一個大尺寸的'kmalloc()'可能需要連續的內存。在這種情況下,分配器可能會運行OOM殺手。例如,如果不同的池被耗盡或者驅動程序使用了> 4k分配。 –

回答

0

這是arch/arm/Kconfig.debug

config ARM_UNWIND 
    bool "Enable stack unwinding support (EXPERIMENTAL)" 
    depends on AEABI && EXPERIMENTAL 
    default y 
    help 
     This option enables stack unwinding support in the kernel 
     using the information automatically generated by the 
     compiler. The resulting kernel image is slightly bigger but 
     the performance is not affected. Currently, this feature 
     only works with EABI compilers. If unsure say Y. 

所以在通常任何ARM核應該能夠不ARM_UNWIND支持運行但當然也有可能是某些情況下,您的設置觸發了罕見的錯誤,但我不認爲這是你的情況。

檢查內核日誌以瞭解您可以瞭解的問題。