内核模块中的Stackoverflow

我读了一本书“
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'};
点赞