这个内核代码被破坏了什么?

时间:2013-03-29 10:30:16

标签: c linux-kernel

以下是生成Oops的代码部分

stuff = vmalloc(10);
if (stuff == NULL) {
    printk("\n Could not allocate memory chunk\n");
} else {
    printk("\n Successfully allocated memory chunk\n");
}
/* Oops here */

Successfully allocate memory chunk..------------[ cut here ]------------..
WARNING: at mm/slub.c:2929 ksize+0x43/0x7a()..
Hardware name: VMware Virtual Platform..
Pid: 21893, comm: insmod Tainted: G..W  2.6.33.3-85.fc13.i686.PAE #1..
Call Trace:[<c043d625>] warn_slowpath_common+0x65/0x7c[<c04c7a1f>] ? 
ksize+0x43/0x7a[<c043d649>]..warn_slowpath_null+0xd/0x10..
[<c04c7a1f>] ksize+0x43/0x7a..[<d0e6229d>] xt_gtpu_init+0x29d/0x2d1 [xt_SGW_GTPU].. 
[<d0e62000>] ? xt_gtpu_init+0x0/0x2d1 [xt_SGW_GTPU]..[<c0403051>] 
do_one_initcall+0x4c/0x13a..[<c0466623>]..sys_init_module+0xa7/0x1dc..
[<c040885f>] sysenter_do_call+0x12/0x28..---[ end trace e82ed3faa2bc068a ]---..
I got: 4096 bytes of memory

1 个答案:

答案 0 :(得分:2)

我会尝试给你一些线索,以了解内核告诉你的内容。 您所看到的是内核警告,但它是什么?

某些内核代码需要特定条件才能正确运行。如果用户(即您)不满足所需条件,则代码可以通过两种方式做出反应:

  • 它可以纠正它,但会产生一个响亮的信息:警告。此类代码段的特点是使用WARN_ON(my_condition)宏。
  • 它不会纠正它,但它不能更进一步:它将产生一个Oops,它将使用宏BUG_ON(my_buggy_condition)
  • 使你的内核崩溃

你的案子击中了第一项(幸运的是你);)。宏将转储有关警告周围环境的一些信息。让我们解密吧。

WARNING: at mm/slub.c:2929 ksize+0x43/0x7a()..清楚地说明WARN_ON宏在mm / slub.c文件的第2929行,在函数ksize()中被点击。而且,奇迹如果您浏览此文件(请参阅Ilya的答案),请在第2929行:WARN_ON(!PageCompound(page));。 显示剩余的调用堆栈后,您可以识别导致此类警告的入口点。在您的情况下,似乎您将错误传递给xt_gtpu_init()函数。

由于您没有公开xt_gtpu_init()来电,我无法告诉您更多信息,但看起来某些分配标记未正确设置(herePageCompound()的定义功能)。

这不是问题,而是最后一句话:vmalloc()函数希望您提供的大小是PAGE_SIZE的倍数。如果不这样做,则应将请求的长度向上舍入到最接近的PAGE_SIZE倍。这就是为什么,我想,你稍后会得到I got: 4096 bytes of memory声明。