0

这是产生 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
4

1 回答 1

2

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

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

  • 它可以纠正它,但会产生一个抱怨的消息:警告。这样的代码段将通过使用WARN_ON(my_condition)宏来表征。
  • 它不会纠正它,但它不能走得更远:它会产生一个糟糕的结果,使用宏会使你的内核崩溃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()电话,但看起来一些分配标志没有正确设置(这里PageCompound()函数的定义)。

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

于 2013-03-29T13:18:37.987 回答