Linuxカーネルを理解する
カーネルは、モジュールを管理するときに2つの主要なタスクを実行する必要があります。最初の作業は、カーネルの残りの部分が主要機能のエントリポイントなどのモジュールのグローバルシンボルに到達できるようにすることです。モジュールはカーネルや他のモジュールのシンボルアドレスも知っている必要があります。したがって、モジュールを接続すると、参照は一度解決されます。第2の動作は、他のモジュールまたはカーネルの他の部分がモジュールを使用している間にモジュールがアンロードされないように、モジュールの使用を追跡することからなる。簡単な参照数で各モジュールの使用量を追跡できます。
すべての共有ライブラリは動的にリンクされ(を使用してLD_LIBRARY_PATH
)、動的にロードできます(dlopen()
、dlsym()
およびを介してdlclose()
)。これは正しいですか?
モジュールはLinuxカーネルの共有ライブラリですか?
Linuxカーネルはどのようにモジュールを動的に使用しますか?動的接続(使用)を介して、またはLD_LIBRARY_PATH
動的ローディング(dlopen()
、dlsym()
および経由dlclose()
)を介してですか?
答え1
すべての共有ライブラリは動的にリンクされ(を使用して
LD_LIBRARY_PATH
)、動的にロードできます(dlopen()
、dlsym()
およびを介してdlclose()
)。これは正しいですか?
はい。違いは、ダイナミックリンカがダイナミックリンカによって駆動され、プログラムが起動すると(プログラムの作成者の観点から)、ライブラリがすでにリンクされており、すべてのシンボルが確認され、これらの操作がすべて手動で実行されることです。
モジュールはLinuxカーネルの共有ライブラリですか?
多少のローディング機構が異なります。動的リンカーとはlibdl
カーネルではなくユーザー空間でのみ使用されます。
Linuxカーネルはどのようにモジュールを動的に使用しますか?動的接続(使用)を介して、または
LD_LIBRARY_PATH
動的ローディング(dlopen()
、dlsym()
および経由dlclose()
)を介してですか?
カーネルは以下を使用してモジュールをロードします。load_module
、ELFオブジェクトのロード、必要なセグメントマッピング、すべての再配置の実行など、すべての操作を独自に実行します。また、ライセンスの確認、接続sysfs
、初期化関数の呼び出しなど、モジュール固有の操作も実行します。
load_module
ユーザー空間からのアクセスinit_module
またはシステムfinit_module
コール。