私は単純なLinuxモジュールmod.cを書いています。mod.cファイルをコンパイルすると、2つの出力ファイルmod.oとmod.koが作成されます。だから私は知りたいだけです、mod.oとmod.koファイルの違いは何ですか?
2 に答える
簡単に言うと、.koファイルは、カーネルが必要とするカーネルの自動生成データ構造にリンクされたオブジェクトファイルです。
.oファイルは、モジュールのオブジェクトファイルです。Cファイルをコンパイルした結果です。次に、カーネルビルドシステムは、カーネルモジュールを記述するいくつかのデータ構造(your_module_kmod.cという名前)を含む別のCファイルを自動的に作成し、このCファイルを別のオブジェクトファイルにコンパイルし、オブジェクトファイルとビルドしたオブジェクトファイルをリンクして.koを作成します。ファイル。
カーネルモジュールのロードを担当するカーネルのダイナミックリンカは、カーネルが.koファイルのkmodオブジェクトに配置したデータ構造を見つけることを期待しており、それらがないとカーネルモジュールをロードできません。
Linux 2.6より前では、ユーザースペースプログラムはELFオブジェクト(.o)ファイルを解釈し、実行中のカーネルにリンクするすべての作業を実行して、完成したバイナリイメージを生成していました。プログラムはその画像をカーネルに渡し、カーネルはそれをメモリに貼り付けるだけです。Linux 2.6では、カーネルがリンクを行います。ユーザースペースプログラムは、ELFオブジェクトファイルの内容をカーネルに直接渡します。これが機能するには、ELFオブジェクトイメージに追加情報が含まれている必要があります。この特定の種類のELFオブジェクトファイルを識別するために、ファイルに「.o」ではなく「.ko」(「カーネルオブジェクト」)という接尾辞を付けます。たとえば、Linux2.4でファイルserial.oに存在していたシリアルデバイスドライバー。 Linux 2.6では、serial.koファイルに存在します。