我已經爲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殺手殺死任何東西。
經過一番研究,我仍然不明白什麼是堆棧展開支持,但該功能是實驗性的,所以我不希望它是我的系統可用的必需條件。
任何人都可以解釋爲什麼功能系統需要此功能嗎?
有各種功能取決於'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的無辜犧牲品;例如堆棧溢出。信息真的太少了;除非你只想要帶'?'的部分回答?事實上,你使用的編譯器會發揮這一點。 –
最有可能的是,重複的'dmesg'正在引起某種比賽。一個真正的問題正在發生;內核任務SEGV,然後展開將嘗試打印診斷。此時,您正在不斷訪問想要打印此信息的日誌。串行控制檯將是更好的機制。你的SSH依賴於很多功能;網絡堆棧,驅動程序,用戶空間sshd等。串口控制檯將輸出錯誤而不運行常量'dmesg'。 –
即使您有很多*空閒內存*,也可以調用OOM。一個大尺寸的'kmalloc()'可能需要連續的內存。在這種情況下,分配器可能會運行OOM殺手。例如,如果不同的池被耗盡或者驅動程序使用了> 4k分配。 –