首页 > 解决方案 > 内核模块中的 Stackoverflow

问题描述

我在看一本书《Linux Kernel. Development. 第三版》。罗伯特·洛夫。

我在本书中读到的关于堆栈大小的内容:

在 x86 上,堆栈大小可在编译时配置,可以是 4KB 或 8KB。从历史上看,内核栈是两页,这通常意味着它在 32 位架构上是 8KB,在 64 位架构上是 16KB——这个大小是固定的和绝对的

我有带有 ubuntu 16.06 64 位 4.15 内核的 VM。所以我的堆栈大小应该是 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");

我认为我应该看到内核恐慌与堆栈粉碎或类似的东西,但我只看到正确的输出。为什么它不破坏堆栈?

标签: carrayslinux-kernelkernelstack-overflow

解决方案


您还可以使数组易失,而 GCC 不会对其进行优化。

volatile char array[170000] = {[0 ... 16999] =  'A'};

推荐阅读