Linuxカーネルコードで__initはどういう意味ですか?


91

Linuxカーネルのソースコードで、私はこの関数を見つけました:

ここで私は何を__init意味するのか理解できません。

回答:


76

include/linux/init.h


55

これらは、Linuxコードの一部を最終的に実行されるバイナリの特別な領域に配置するためのマクロにすぎません。 __initたとえば、(または__attribute__ ((__section__ (".init.text")))このマクロが展開されるより良い方法で)この関数を特別な方法でマークするようにコンパイラに指示します。最後に、リンカはバイナリファイルの最後(または最初)にこのマークが付いたすべての関数を収集します。

カーネルが起動すると、このコードは1回だけ実行されます(初期化)。実行後、カーネルはこのメモリを解放して再利用でき、カーネルメッセージが表示されます。

未使用のカーネルメモリの解放:108kが解放されました

この機能を使用するには、マークされたすべての関数の場所をリンカーに指示する特別なリンカースクリプトファイルが必要です。


11
賢い!これが「未使用のカーネルメモリの解放:108kの解放」の意味です。:-)私はここ数年ずっと不思議に思っていました。コードではなく、ある種のバッファか何かだと思いました。
ファルケン教授2012年

6

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

ソース


5

__initは、__attribute__ ((__section__(".init.text")))。/ include / linux /init.hで定義されているマクロです。これは。に展開されます。

この関数を特別な方法でマークするようにコンパイラーに指示します。最後に、リンカはバイナリファイルの最後(または開始)にこのマークが付いたすべての関数を収集します。カーネルが起動すると、このコードは1回だけ実行されます(初期化)。実行後、カーネルはこのメモリを解放して再利用でき、カーネルが表示されます


3

linux / init.hのコメント(およびドキュメント)を同時に読んでください

また、gccにはLinuxカーネルコード用に特別に作成されたいくつかの拡張機能があり、このマクロはそれらの1つを使用しているように見えることも知っておく必要があります。


1

Linuxカーネルモジュールをコンパイルしてカーネルに挿入すると、最初に実行される関数は__initです。この関数は基本的に、デバイスドライバーの登録などの主要な操作を実行する前に、初期化を実行するために使用されます。逆の効果を持つ別の関数があります。 __exitは、登録されたデバイスまたは同様の機能を削除するために再び使用されるカーネルモジュールを削除するときに呼び出されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.