我读了一本书“
Linux Kernel.开发.第三版.”罗伯特爱.
我在本书中读到的关于堆栈大小的内容:
On x86, the stack size is configurable at compile-time and can be
either 4KB or 8KB. Historically, the kernel stack is two pages, which
generally implies that it is 8KB on 32-bit architectures and 16KB on
64-bit architectures—this size is fixed and absolute
我有VM与ubuntu 16.06 64位4.15内核.所以我的堆栈大小应该是16000字节(16KB)
我尝试检查stackoverflow行为.我在堆栈上创建使用超过16000字节的数组.
#include <linux/module.h>
#include <linux/init.h>
int __init overflow_start(void)
{
printk(KERN_INFO "Overflow Test\n");
char array[170000] = {[0 ... 16999] = 'A'};
printk(KERN_ERR "%c\n", array[16999]);
return 0;
}
void __exit overflow_end(void)
{
printk(KERN_ERR "Test success\n");
}
module_init(overflow_start);
module_exit(overflow_end);
MODULE_LICENSE("GPL");
我认为我应该看到堆栈粉碎或类似的内核恐慌,但我只看到正确的输出.为什么不打破堆栈?
最佳答案 你也可以使数组变得不稳定,而GCC也不会优化它.
volatile char array[170000] = {[0 ... 16999] = 'A'};