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

カーネルが伝えていることを理解するための手がかりをいくつか提供しようと思います。あなたが見ているのはカーネルの警告ですが、それは何ですか?

一部のカーネル コードは、特定の条件が正しく実行されることを想定しています。ユーザー (つまり、あなた) が必要な条件を満たさない場合、コードは次の 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()、いくつかの割り当てフラグが正しく設定されていないようです (ここに関数の定義がありPageCompound()ます)。

それは問題ではありませんが、最後の発言: vmalloc()function は、 の倍数であるサイズを提供することを期待していますPAGE_SIZEPAGE_SIZEそうでない場合は、要求された長さを最も近い倍数に切り上げます。I got: 4096 bytes of memoryそのため、後でステートメントを取得すると思います。

于 2013-03-29T13:18:37.987 に答える