9

メモリ リーク時のカーネルの動作をテストするために、メモリを継続的に割り当てるカーネル モジュールを作成しています。たとえば、コードは次のようになります。

int bytesLeaked = 128000;
char *var = kmalloc(bytesLeaked, GFP_KERNEL); 
if (var != NULL)
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var);

このコードは init_module にあります。次の質問があります

  1. コードでメモリ リークが発生したかどうかを判断するにはどうすればよいですか? lsmod はあまり明らかにしません。
  2. インターネット上のチュートリアルでは、init_module と exit_module のコードのみが示されています。モジュールが挿入されてから終了するまでの間、一定期間にわたってメモリ割り当てを行いたい場合はどうすればよいでしょうか。
  3. ユーザーがそうするように指示した場合にのみメモリリークするコードを書くことは可能ですか?
4

2 に答える 2

20

カーネルモジュールにメモリリークがあり、マシンにx86アーキテクチャがあるかどうかを確認する必要がある場合は、メモリリーク検出器を備えたKEDRシステムを使用できます。

KEDRでは、カーネルを再構築する必要はありません。オンラインドキュメント(「はじめに」などを参照)では、KEDRをインストールして使用する方法について説明しています。要するに、手順は次のとおりです。

インストール(ソースから):untar source archive --cmake <...> --make --make install

モジュールをロードする前にKEDRを起動します。

$ kedr start <name_of_the_module_to_analyze> -f leak_check.conf

次に、モジュールをロードして、通常どおりに操作できます。アンロードした後、KEDRはdebugfsでレポートを提供します(通常はdebugfsがにマウントされ/sys/kernel/debugます)。次に例を示します。

$ cat /sys/kernel/debug/kedr_leak_check/info
Target module: "...", 
Memory allocations: 3
Possible leaks: 2
Unallocated frees: 0

possible_leaksからのファイル/sys/kernel/debug/kedr_leak_check/は、リークされた各メモリブロックに関する情報(アドレス、サイズ、コールスタック)を提供します。

最後に、KEDRを停止できます(/sys/kernel/debug/kedr_leak_check/消えることに注意してください)。

kedr stop

x86以外のアーキテクチャのシステムを使用している場合は、使用するのが少し難しいですが、Kmemleakも役立つ場合があります。おそらく、CONFIG_DEBUG_KMEMLEAKパラメーターを「y」に設定してカーネルを再構築する必要があります。それでも、Kmemleakは非常に便利なツールでもあります。詳細については、カーネルソースのDocumentation/kmemleak.txtを参照してください。

于 2011-05-07T03:15:44.953 に答える
0
  1. コードはメモリ ブロックを割り当てるときに ( などでkmalloc()) メモリ リークを起こし、最初にメモリ ブロックを解放することなく、そのメモリ ブロックへのすべての参照を失います。varまだスコープ内にあり、メモリのブロックを指しているため、コードはこれを行っていません。次の行を追加するvar = NULL;と、正真正銘のメモリ リークが発生します。

  2. また、ユーザー空間でのイベントがカーネルモジュールをトリガーしてメモリの割り当てを開始するようにすることは絶対に可能です。システム コールを介して直接実行できるかどうかはわかりませんが、それができない場合は、タスクを実行する他の方法がいくつかあります。いずれかを選択して実装するだけです。touchメモリ割り当てをトリガーするたびに事前に定義されたファイルを用意するという単純なものでも機能するはずです。init_moduleただし、それが必要な動作である場合、時間の経過とともに定期的にメモリを割り当てるだけのスレッドをコードで生成できない理由はわかりません。

于 2011-05-06T11:34:22.147 に答える