2014-05-21 164 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支持运行但当然也有可能是某些情况下,您的设置触发了罕见的错误,但我不认为这是你的情况。

检查内核日志以了解您可以了解的问题。