8

とりわけ、メモリのブロックをで割り当てるデバイスドライバを作成していますkmalloc。このメモリは、ユーザープログラムがファイルを閉じるときに解放されます。私の実験の1つでは、ファイルを閉じずにユーザープログラムがクラッシュしました。

何かがこの記憶を解放したでしょうか?

別の実験ではkfree()close()関数から関数に移動しましたmodule_exit()。ユーザープログラムを2回続けて実行したとき、kmalloc最初に解放せずに、以前と同じポインターを使用して再度呼び出しました。したがって、私はそのメモリへのポインタを失い、それを解放することができません。

このメモリは、再起動するまでシステムに失われますか、それともドライバをアンロードすると解放されますか?

4

2 に答える 2

11

カーネルメモリが自動的に解放されることはありません。これにはが含まれkmallocます。

開いているファイル記述子に関連するすべてのメモリは、ファイルを閉じるときに解放する必要があります。
プロセスが終了すると、何らかの理由(を含むkill -9)で、開いているすべてのファイル記述子が閉じられ、ドライバーのclose関数が呼び出されます。したがって、そこで解放した場合、プロセスが実行できることは、プロセスが終了した後もメモリを維持することはできません。

于 2012-07-25T20:58:58.753 に答える
6

ユーザースペースのエクスペリエンスをカーネルプログラミングと関連付けないでください。

これはどういう意味ですか?

通常のプロセスは、終了するとクリーンアップされますが、カーネルモジュールの場合は、実際にはプロセスではないため、そうではありません。

技術的には、モジュールをロードしてからkmallocを呼び出すと、カーネルスペースにメモリを割り当てるようにカーネルに要求しました。これは、技術的にはカーネル全体の新しいメモリであるため、モジュールをアンロードしても、明示的に解放されない限り、割り当てられたカーネルメモリはそこにあります。

簡単に言えば、あなたの質問に答えます。すべてのkmallocにはkfreeが必要です。そうでない場合、システムが稼働している限り、メモリはそこに残ります。

于 2012-07-25T21:16:27.043 に答える