9

カーネルモジュールのロードに問題があります。メモリのサイズが約2Gbの大きなデータ構造があります。テーブルを事前に割り当てているかどうかに関係なく、モジュールをロード時に.bssで表示しsize -A module.koますvmalloc()。ロードはで失敗しinsmod: error inserting 'module.ko': -1 Cannot allocate memoryます。

ユーザーモードLinuxで問題をデバッグしようとしましたが、多数のsegfaultが発生します(gdbで続行できますが、コンソールメッセージが表示されます。overflow in relocation type 10 val <value in the ball park of 6G>正しい'module' likely not compiled with -mcmodel=kernelはずですよね?Kbuild-mcmodel

したがって、質問は次のとおりです。

  1. Linuxカーネルモジュールのサイズに一般的な2Gの制限はありますか?
  2. usernode linuxのカーネルモジュールには特定の2G制限がありますか(過去に、大きなカーネルモジュールにはクリーンで連続的なメモリブロックが必要であることに気づいたと思います...)
  3. カーネルモジュールを指定-mcmodel=largeして、それが機能することを期待できますか?

私はこれをdebiansqueeze、64ビット、2.6.32-5-amd64(ホスト)で8Gbのメモリを使用し、2.6.32をumlで4Gメモリを使用して試したので、これは通常のメモリ不足の問題ではありません。

そのような制限が存在する場合、制限を回避するための追加のクレジット:)

4

3 に答える 3

8

最初の質問ですが、モジュール自体の制限は 64 メガバイトです。モジュール ローダーは、このサイズを超えるモジュールのロードを拒否します。kernel/module.cから:

if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL)
        return ERR_PTR(-ENOMEM);

これは、2.6.32 と新しいカーネル (3.3 まで) の両方に当てはまります。

編集: カーネル バージョン 3.4 では、64 Mb の制限が削除されました。vmalloc()現在、実際の制限は、割り当てることができるメモリの量のみに依存します。

于 2011-06-11T04:33:06.587 に答える
1

カーネル空間のメモリはユーザー空間のメモリとは異なることに注意してください。32 ビット Linux では、カーネルには 1Gb のアドレス空間しかありません。64 ビット Linux のカーネルにはさらに多くの空間アドレス空間がありますが、カーネルのドキュメントによると、モジュールに使用できるのは 1536MB のみです。

于 2011-06-10T16:55:26.023 に答える
0

テーブルを次のように定義した場合static-モジュールのロードは実際に失敗します-これはおそらく、Andrew Aylettによる回答で言及されている 1.5G の制限によるものです。

ただし、動的vmalloc()呼び出しを行うと、8Gb のメモリを持つホストで最大 7680Mb を取得できました (カーネルがいくつかの重要なプロセスを強制終了し、X がハングするまで)。

だから私の質問に答えるために:

  1. はい。ただし、次のようにコンパイルされたデータのみstatic
  2. それのように見えません。
  3. その必要はありません。

追加クレジット: やるだけvmalloc()

これは、2.6.10 より新しいLinux カーネルでのみ機能します。それ以前は、vmalloc() 制限は 64 Mb でした。

于 2011-06-14T07:07:10.177 に答える