我已经为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分配。 –