致命的:hello.koモジュールが見つかりません。

致命的:hello.koモジュールが見つかりません。

を使用しており、CentOS-6.5デフォルトのカーネルはです2.6.32-431.11.2.el6.x86_642.6.32そのカーネルをダウンロードしてビルドしました(下/lib/modules/2.6.32)。

私は簡単なプログラムのためのモジュールを書いたhello world。このプログラムは、次のような状況で動作します。

Makefile:(/lib/modules/$(shell uname -r)/build デフォルトカーネル)

$ sudo insmod hello.ko

$ dmesg
module inserted..
hello world..

次のような場合、私のプログラムは機能しません。

Makefile:(/lib/modules/3.2.32/build 新しいカーネル)

$ sudo insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format

dmesg: 
hello: disagrees about version of symbol module_layout

両方のシナリオを試しましたが、次のmodprobeエラーが表示されます。

FATAL: Module hello not found.

カーネルを使って2.6.32モジュールをコンパイルできますか?

ベストアンサー1

Linuxカーネルに含まれるデータ構造のレイアウトは、バージョンごとに異なるだけでなく、コンパイルオプションによっても異なります。したがって、カーネルモジュールをコンパイルするときは、カーネルソースコードのヘッダファイルだけでなく、カーネルのコンパイル時に生成されたいくつかのヘッダファイルも必要です。単にカーネルソースコードを解くだけでは不十分です。

で構築されたカーネルの場合、バージョンCONFIG_MODVERSIONS番号は異なる場合がありますが、データ構造のレイアウトは同じでなければなりません。このオプションはUbuntuカーネルで有効になります。このオプションを使用すると、ヘッダーに加えて正しいModule.symversファイル用にモジュールをコンパイルする必要があります。ほとんどのディストリビューションと同様に、CentOSにはコンパイルされたカーネルヘッダーと同じパッケージにこのファイルが含まれています。 CentOSカーネルヘッダーパッケージは、kernel-headersコンパイル中のカーネルと一致するバージョンをインストールする必要があります。また、見ることができますカーネルパッケージの概要CentOSドキュメントと完全なカーネルソースコードは不要wikiから。

ビルドされていないカーネルの場合CONFIG_MODVERSIONS(自分のカーネルをコンパイルした場合かもしれません)、モジュールをロードするときに確認するのは簡単なバージョンチェックです。解凍されたカーネルソースコードを取得し、実行.config中のカーネルのコンパイル中に使用されたカーネルソースコードをコピーしてから実行できますmake modules_prepare。カーネルに適用されたパッチがバイナリ互換性に影響しないことを確認するのはユーザーの責任です。

おすすめ記事