Linux kernel 我可以在Linux模块中声明的数组/缓冲区是否有任何大小限制?

Linux kernel 我可以在Linux模块中声明的数组/缓冲区是否有任何大小限制?,linux-kernel,kernel-module,Linux Kernel,Kernel Module,我可以insmod hello.ko而不显示任何错误消息。但我的理解是,linux内核堆栈只有4KB大小,不应该工作。看来我的理解有点差距。谁能帮我找出我遗漏了什么 #include<linux/init.h> #include<linux/kernel.h> #include<linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); int popo() { int a[10*1024*1024]={0};

我可以insmod hello.ko而不显示任何错误消息。但我的理解是,linux内核堆栈只有4KB大小,不应该工作。看来我的理解有点差距。谁能帮我找出我遗漏了什么

#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");


int popo()
{
    int a[10*1024*1024]={0};
            printk(KERN_WARNING "popo\n");
    }
    static int __init my_init()
    {
      printk(KERN_WARNING "Hello world!\n");
  popo();
  return 0;
}

static void my_exit()
{
  printk(KERN_WARNING "bye!\n");
}

module_init(my_init);
module_exit(my_exit);
#包括
#包括
#包括
模块许可证(“双BSD/GPL”);
int popo()
{
int a[10*1024*1024]={0};
printk(KERN_警告“popo\n”);
}
静态int\uu init my\u init()
{
printk(KERN_警告“你好,世界!\n”);
popo();
返回0;
}
静态无效我的_退出()
{
printk(KERN_警告“再见!\n”);
}
模块_init(我的_init);
模块退出(我的退出);

@Eugene:的确如此。我将本地缓冲区大小设置为10240字节,并将其设置为memset();“制造”时收到警告:

...
<...>/kstk.c: In function ‘func’:
<...>/kstk.c:14:1: warning: the frame size of 10244 bytes is larger than 1024 bytes [-Wframe-larger-than=]
  Building modules, stage 2.
Building with KERNELRELEASE = 3.2.0-30-generic-pae
...
然后,我为ARM编译了ko,并用模拟的QEMU/armvm运行它。你猜怎么着:它崩溃得很厉害! 有许多printk:第一行和最后几行printk复制如下:

ARM /myprj $ insmod ./kstk.ko 
[   13.967453] All okay!
[   13.967508] Hello, world
[   13.971181] Unable to handle kernel paging request at virtual address 0d890cc0
[   13.972465] pgd = 80004000
[   13.972966] [0d890cc0] *pgd=00000000
[   13.973831] Internal error: Oops: 5 [#1] SMP
[   13.974649] Modules linked in: kstk(O)
[   13.975656] CPU: 0    Tainted: G           O  (3.2.21 #1)
[   13.976893] PC is at do_page_fault+0xbc/0x3c4
[   13.977648] LR is at do_page_fault+0x74/0x3c4
[   13.978373] pc : [<804165a4>]    lr : [<8041655c>]    psr: 20000193
[   13.978386] sp : 8e056058  ip : 005e4312  fp : 8e0560e4
[   13.980465] r10: 0d890c00  r9 : 2ab2906c  r8 : 8e056058
[   13.981366] r7 : 00000005  r6 : 0d890cc0  r5 : 8e056018  r4 : 8e0561b0
[   13.982471] r3 : 20000193  r2 : 005e4311  r1 : 8e056000  r0 : 8e056000
[   13.983608] Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[   13.984836] Control: 10c53c7d  Table: 6e05006a  DAC: 00000015
[   13.985768] Process nfsiod (pid: 342, stack limit = 0x8e0542f0)
[   13.986753] Stack: (0x8e056058 to 0x8e056000)
[   13.987920] [<804165a4>] (do_page_fault+0xbc/0x3c4) from [<80416958>] (do_translation_fault+0xac/0xb0)
[   13.989377] [<80416958>] (do_translation_fault+0xac/0xb0) from [<800084b8>] (do_DataAbort+0x48/0xac)
[   13.991682] [<800084b8>] (do_DataAbort+0x48/0xac) from [<8041495c>] (__dabt_svc+0x3c/0x60)
[   13.992351] Exception stack(0x8e0561b0 to 0x8e0561f8)
[   13.992850] 61a0:                                     8e056000 8e056000 005e4311 20000193
[   13.993863] 61c0: 8e056350 8e056038 0d890cc0 00000005 8e0561f8 2ab2906c 0d890c00 8e056284
[   13.994673] 61e0: 005e4312 8e0561f8 8041655c 804165a4 20000193 ffffffff

--snip--

       17.321313] Exception stack(0x8e055d80 to 0x8e055dc8)
    [   17.321962] 5d80: 00000004 00000000 00000003 00000002 8f943c00 00000040 8420804c 84208044
    [   17.322979] 5da0: 00000001 8f943cf8 8e055e24 8e055e5c 8e055d28 8e055e08 00000000 80038024
    [   17.323989] 5dc0: 60000113 ffffffff
    [   17.324468] [<80414a6c>] (__und_svc+0x4c/0x80) from [<80038024>] (do_exit+0x4d0/0x6ec)
    [   17.325468] [<80038024>] (do_exit+0x4d0/0x6ec) from [<800141b0>] (die+0x144/0x1f8)
    [   17.326417] [<800141b0>] (die+0x144/0x1f8) from [<8001cd7c>] (__do_kernel_fault+0x84/0x94)
    [   17.327447] [<8001cd7c>] (__do_kernel_fault+0x84/0x94) from [<804165ec>] (do_page_fault+0x104/0x3c4)
    [   17.328577] [<804165ec>] (do_page_fault+0x104/0x3c4) from [<80416958>] (do_translation_fault+0xac/0xb0)
    [   17.329863] [<80416958>] (do_translation_fault+0xac/0xb0) from [<800084b8>] (do_DataAbort+0x48/0xac)
    [   17.331175] Code: e24cb004 e92d4000 e8bd4000 e5901278 (e5914008) 
    [   17.331939] ---[ end trace f1c8dff59d91e3cd ]---
    [   17.332521] Fixing recursive fault but reboot is needed!
    [   17.333493] BUG: scheduling while atomic: insmod/476/0x00000003
    [   17.334656] Modules linked in: kstk(O)
    [   17.335455] 
    [   17.335779] Pid: 342, comm:               nfsiod
    [   17.336706] CPU: 0    Tainted: G      D    O  (3.2.21 #1)
    [   17.337778] PC is at 0x2ad4ff68
    [   17.338415] LR is at 0x2abca3a0
    [   17.339060] pc : [<2ad4ff68>]    lr : [<2abca3a0>]    psr: 20000010
    [   17.339081] sp : 7e93cc38  ip : 00000000  fp : 7e93ccbc
    [   17.341184] r10: 40000000  r9 : 2ab2906c  r8 : 00000001
    [   17.341682] r7 : 2aae2650  r6 : 2ab28e00  r5 : 000000c0  r4 : 2ac68000
    [   17.342743] r3 : fffffff8  r2 : 2adade14  r1 : 2adade04  r0 : 2ac68090
    [   17.344019] Flags: nzCv  IRQs on  FIQs on  Mode USER_32  ISA ARM  Segment user
    [   17.345280] Control: 10c53c7d  Table: 6e05006a  DAC: 00000015
ARM/myprj$insmod./kstk.ko
[13.967453]好的!
[13.967508]你好,世界
[13.971181]无法处理虚拟地址0d890cc0处的内核分页请求
[13.972465]pgd=80004000
[13.972966][0d890cc0]*pgd=00000000
[13.973831]内部错误:Oops:5[#1]SMP
[13.974649]链接到的模块:kstk(O)
[13.975656]CPU:0受污染:GO(3.2.21#1)
[13.976893]PC处于do_页面_故障+0xbc/0x3c4
[13.977648]LR处于do_页面_故障+0x74/0x3c4
[13.978373]pc:[]lr:[]psr:20000193
[13.978386]sp:8e056058 ip:005e4312 fp:8e0560e4
[13.980465]r10:0D890C00R9:2ab2906c r8:8e056058
[13.981366]r7:00000005 r6:0d890cc0 r5:8e056018 r4:8e0561b0
[13.982471]r3:20000193 r2:005e4311 r1:8e056000 r0:8e056000
[13.983608]标志:nzCv IRQs off FIQs on Mode SVC_32 ISA ARM段内核
[13.984836]控制:10c53c7d表:6e05006a DAC:00000015
[13.985768]过程nfsiod(pid:342,堆栈限制=0x8e0542f0)
[13.986753]堆栈:(0x8e056058到0x8e056000)
[13.987920][](do_page_fault+0xbc/0x3c4)from[](do_translation_fault+0xac/0xb0)
[13.989377][](do_翻译错误+0xac/0xb0)来自[](do_数据中止+0x48/0xac)
[13.991682][](数据中止+0x48/0xac)来自[](数据中止+0x3c/0x60)
[13.992351]异常堆栈(0x8e0561b0到0x8e0561f8)
[13.992850]61a0:8e056000 8e056000 005e4311 20000193
[13.993863]61c0:8e056350 8e056038 0d890cc0 0000000 5 8e0561f8 2ab2906c 0d890c00 8e056284
[13.994673]61e0:005e4312 8e0561f8 8041655c 804165a4 20000193 ffffffff
--剪断--
17.321313]异常堆栈(0x8e055d80到0x8e055dc8)
[17.321962]5d80:0000000 4 0000000 0000000 3 0000000 2 8f943c00 000000 40 8420804c 84208044
[17.322979]5da0:00000001 8f943cf8 8e055e24 8e055e5c 8e055d28 8e055e08 00000000 80038024
[17.323989]5dc0:60000113 ffffffff
[17.324468][](u und_svc+0x4c/0x80)来自[](do_exit+0x4d0/0x6ec)
[17.325468][](不退出+0x4d0/0x6ec)从[](模具+0x144/0x1f8)
[17.326417][](die+0x144/0x1f8)来自[](内核故障+0x84/0x94)
[17.327447][](内核错误+0x84/0x94)来自[](页面错误+0x104/0x3c4)
[17.328577][](do_page_fault+0x104/0x3c4)来自[](do_translation_fault+0xac/0xb0)
[17.329863][](do_翻译错误+0xac/0xb0)来自[](do_数据中止+0x48/0xac)
[17.331175]代码:e24cb004 e92d4000 e8bd4000 e5901278(E591408)
[17.331939]--[end trace f1c8dff59d91e3cd]---
[17.332521]正在修复递归故障,但需要重新启动!
[17.333493]错误:原子时调度:insmod/476/0x00000003
[17.334656]链接到的模块:kstk(O)
[   17.335455] 
[17.335779]Pid:342,通信:nfsiod
[17.336706]CPU:0受污染:GDO(3.2.21#1)
[17.337778]电脑位于0x2ad4ff68
[17.338415]LR位于0x2abca3a0
[17.339060]pc:[]lr:[]psr:2000010
[17.339081]sp:7e93cc38 ip:00000000 fp:7e93ccbc
[17.341184]r10:40000000 r9:2ab2906c r8:00000001
[17.341682]r7:2aae2650 r6:2ab28e00 r5:000000 C0 r4:2ac68000
[17.342743]r3:fffffffff8 r2:2adade14 r1:2adade04 r0:2ac68090
[17.344019]标志:模式用户上FIQ上的nzCv IRQ_32 ISA ARM段用户
[17.345280]控制:10c53c7d表:6e05006a DAC:00000015
道德:
开发人员必须注意所有警告!:)

也许,编译器已经看到
a[]
未被使用,并对其进行了优化?您可以通过分解内核模块并查看汇编代码来检查这一点。
ARM /myprj $ insmod ./kstk.ko 
[   13.967453] All okay!
[   13.967508] Hello, world
[   13.971181] Unable to handle kernel paging request at virtual address 0d890cc0
[   13.972465] pgd = 80004000
[   13.972966] [0d890cc0] *pgd=00000000
[   13.973831] Internal error: Oops: 5 [#1] SMP
[   13.974649] Modules linked in: kstk(O)
[   13.975656] CPU: 0    Tainted: G           O  (3.2.21 #1)
[   13.976893] PC is at do_page_fault+0xbc/0x3c4
[   13.977648] LR is at do_page_fault+0x74/0x3c4
[   13.978373] pc : [<804165a4>]    lr : [<8041655c>]    psr: 20000193
[   13.978386] sp : 8e056058  ip : 005e4312  fp : 8e0560e4
[   13.980465] r10: 0d890c00  r9 : 2ab2906c  r8 : 8e056058
[   13.981366] r7 : 00000005  r6 : 0d890cc0  r5 : 8e056018  r4 : 8e0561b0
[   13.982471] r3 : 20000193  r2 : 005e4311  r1 : 8e056000  r0 : 8e056000
[   13.983608] Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[   13.984836] Control: 10c53c7d  Table: 6e05006a  DAC: 00000015
[   13.985768] Process nfsiod (pid: 342, stack limit = 0x8e0542f0)
[   13.986753] Stack: (0x8e056058 to 0x8e056000)
[   13.987920] [<804165a4>] (do_page_fault+0xbc/0x3c4) from [<80416958>] (do_translation_fault+0xac/0xb0)
[   13.989377] [<80416958>] (do_translation_fault+0xac/0xb0) from [<800084b8>] (do_DataAbort+0x48/0xac)
[   13.991682] [<800084b8>] (do_DataAbort+0x48/0xac) from [<8041495c>] (__dabt_svc+0x3c/0x60)
[   13.992351] Exception stack(0x8e0561b0 to 0x8e0561f8)
[   13.992850] 61a0:                                     8e056000 8e056000 005e4311 20000193
[   13.993863] 61c0: 8e056350 8e056038 0d890cc0 00000005 8e0561f8 2ab2906c 0d890c00 8e056284
[   13.994673] 61e0: 005e4312 8e0561f8 8041655c 804165a4 20000193 ffffffff

--snip--

       17.321313] Exception stack(0x8e055d80 to 0x8e055dc8)
    [   17.321962] 5d80: 00000004 00000000 00000003 00000002 8f943c00 00000040 8420804c 84208044
    [   17.322979] 5da0: 00000001 8f943cf8 8e055e24 8e055e5c 8e055d28 8e055e08 00000000 80038024
    [   17.323989] 5dc0: 60000113 ffffffff
    [   17.324468] [<80414a6c>] (__und_svc+0x4c/0x80) from [<80038024>] (do_exit+0x4d0/0x6ec)
    [   17.325468] [<80038024>] (do_exit+0x4d0/0x6ec) from [<800141b0>] (die+0x144/0x1f8)
    [   17.326417] [<800141b0>] (die+0x144/0x1f8) from [<8001cd7c>] (__do_kernel_fault+0x84/0x94)
    [   17.327447] [<8001cd7c>] (__do_kernel_fault+0x84/0x94) from [<804165ec>] (do_page_fault+0x104/0x3c4)
    [   17.328577] [<804165ec>] (do_page_fault+0x104/0x3c4) from [<80416958>] (do_translation_fault+0xac/0xb0)
    [   17.329863] [<80416958>] (do_translation_fault+0xac/0xb0) from [<800084b8>] (do_DataAbort+0x48/0xac)
    [   17.331175] Code: e24cb004 e92d4000 e8bd4000 e5901278 (e5914008) 
    [   17.331939] ---[ end trace f1c8dff59d91e3cd ]---
    [   17.332521] Fixing recursive fault but reboot is needed!
    [   17.333493] BUG: scheduling while atomic: insmod/476/0x00000003
    [   17.334656] Modules linked in: kstk(O)
    [   17.335455] 
    [   17.335779] Pid: 342, comm:               nfsiod
    [   17.336706] CPU: 0    Tainted: G      D    O  (3.2.21 #1)
    [   17.337778] PC is at 0x2ad4ff68
    [   17.338415] LR is at 0x2abca3a0
    [   17.339060] pc : [<2ad4ff68>]    lr : [<2abca3a0>]    psr: 20000010
    [   17.339081] sp : 7e93cc38  ip : 00000000  fp : 7e93ccbc
    [   17.341184] r10: 40000000  r9 : 2ab2906c  r8 : 00000001
    [   17.341682] r7 : 2aae2650  r6 : 2ab28e00  r5 : 000000c0  r4 : 2ac68000
    [   17.342743] r3 : fffffff8  r2 : 2adade14  r1 : 2adade04  r0 : 2ac68090
    [   17.344019] Flags: nzCv  IRQs on  FIQs on  Mode USER_32  ISA ARM  Segment user
    [   17.345280] Control: 10c53c7d  Table: 6e05006a  DAC: 00000015