以下是生成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
答案 0 :(得分: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()
来电,我无法告诉您更多信息,但看起来某些分配标记未正确设置(here是PageCompound()
的定义功能)。
这不是问题,而是最后一句话:vmalloc()
函数希望您提供的大小是PAGE_SIZE
的倍数。如果不这样做,则应将请求的长度向上舍入到最接近的PAGE_SIZE
倍。这就是为什么,我想,你稍后会得到I got: 4096 bytes of memory
声明。