5

Linuxカーネルの開発について読んでいて、理解できないテキストを読んだだけです。モジュールの__initマクロと__exitマクロについて説明している段落は次のとおりです。

これは、カーネル2.2以降の機能を示しています。init関数とcleanup関数の定義が変更されていることに注意してください。__initマクロを使用すると、組み込みドライバーのinit関数が終了すると、init関数が破棄され、そのメモリが解放されますが、ロード可能なモジュールは解放されません。init関数がいつ呼び出されるかを考えると、これは完全に理にかなっています。

__initと同様に機能する__initdataもありますが、関数ではなくinit変数用です。

__exitマクロは、モジュールがカーネルに組み込まれているときに関数を省略します。__exitと同様に、ロード可能なモジュールには影響しません。繰り返しますが、クリーンアップ関数がいつ実行されるかを考慮すると

私は要点を理解します。このマクロ__initにより、組み込みドライバーのinit関数が終了すると、init関数が破棄され、そのメモリーが解放されます。しかし、なぜですか?ローダブルモジュール用ではありませんか?私はそれを理解できませんでした。

ばかげたことは知っていますが、しばらく考えてみて、完全には理解できませんでした。なぜビルトインドライバーではなく、ロード可能なモジュールではないのですか?で割り当てられた変数、アドレスなど__initは両方に必要ですよね?

4

1 に答える 1

5

あなたが正しい; モジュール内であっても、初期化後に本当に必要のない関数が存在する可能性があるため、原則としてそれらはメモリから削除される可能性があります。モジュールに影響がない理由__initは、実装がいかに簡単かということです。

性質についての質問に対するこの答えは__init、主題にいくらかの光を当てます。基本的に、カーネルビルドシステムは、カーネルのすべての部分にわたって、でフラグが付けられたすべての関数を検索し__init、それらがすべて同じメモリブロックにあるように配置します。

次に、カーネルが起動すると、その1ブロックのメモリを一度に解放できます。

この事前ソートのアイデアは、モジュールではうまく機能しません。モジュールのロード時に初期化コードをロードする必要があるため、他の初期化コードとスペースを共有することはできません。代わりに、カーネルは各モジュールから数百バイトを選択し、それらを個別に解放する必要があります。

ただし、ハードウェアのページサイズは通常4KBであるため、それ未満のチャンクでメモリを解放することは困難です。したがって、__init個々のモジュールの機能を解放しようとすることは、おそらくそれが価値があるよりも厄介です。

于 2012-07-26T14:50:54.450 に答える