对linux堆栈大小测试有奇怪的printk效果

时间:2017-12-09 21:23:26

标签: c linux linux-kernel printk

I am trying to test linux kernel stack size in 64 bit. 

我发现了这种奇怪的行为。 我编写了以下代码来破坏内核,但奇怪的是  只有当printk被取消注释时它才会崩溃, 否则运行正常,没有错误/警告!!。

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>

    static int __init crash_stack_init(void)
    {
        long arr[1024];
        long *a;

        a = &arr[0];

        //printk("%p\n", &arr[0]);

        return 0;
    }

        enter code here

    static void __exit crash_stack_exit(void)
    {
    }

    module_init(crash_stack_init);
    module_exit(crash_stack_exit);


Here is the "make" output without the printk,
  

make -C /lib/modules/4.4.0-53-generic/build   M = / home / naveenvc / work / ker / crash_stack模块       make [1]:输入目录'/usr/src/linux-headers-4.4.0-53-generic'         CC [M] /home/naveenvc/work/ker/crash_stack/crash_stack.o         构建模块,第2阶段。         MODPOST 1个模块         CC /home/naveenvc/work/ker/crash_stack/crash_stack.mod.o         LD [M] /home/naveenvc/work/ker/crash_stack/crash_stack.ko       make [1]:离开目录'/usr/src/linux-headers-4.4.0-53-generic'

And make output with printk,
  

make -C /lib/modules/4.4.0-53-generic/build   M = / home / naveenvc / work / ker / crash_stack modules make [1]:进入   目录'/usr/src/linux-headers-4.4.0-53-generic'CC [M]   /home/naveenvc/work/ker/crash_stack/crash_stack.o   的&GT; /home/naveenvc/work/ker/crash_stack/crash_stack.c:在功能上   “crash_stack_init”:   /home/naveenvc/work/ker/crash_stack/crash_stack.c:14:1:警告:   帧大小为8200字节大于1024字节   [-Wframe-greater-than =]} ^
  构建模块,阶段2. MODPOST 1   模块CC
  /home/naveenvc/work/ker/crash_stack/crash_stack.mod.o LD [M]   /home/naveenvc/work/ker/crash_stack/crash_stack.ko make [1]:离开   目录'/usr/src/linux-headers-4.4.0-53-generic'

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

堆栈大小已有详细记录,上面不是正确的测试方法,特别是在使用大页面支持堆栈的旧内核中,上述代码会跳转到下一个堆栈。

带有prink注释掉的func __crash_stack_init是一个叶子函数 - 它不会调用任何东西,因此编译器确切地知道本地变量会发生什么。特别是在这段代码中,它看到不需要完整的数组,因此它没有被分配。然而,对printk的调用是通过的。编译器不知道func将用它做什么,因此它必须在栈上保留1024 * sizeof(long),这会导致警告。

Stacks在16KB年前被撞到了,你可以在这里开始阅读https://lwn.net/Articles/600644/