8

私はカーネルモジュールを書くのが初めてなので、技術的でない問題に直面することはほとんどありません。

特定のカーネル バージョン (たとえば 3.0.0-10、10 はパッチ番号) 用のカーネル モジュールを作成するには、同じバージョンのカーネル ヘッダーが必要なため、カーネル ヘッダーをインストールしてそこから開発を開始するのは簡単に見えます。ただし、パッチが適用されたカーネル バージョンのカーネル ヘッダーは利用できません。ゲスト カーネル vmlinuz-3.0.0-10 がマシンで実行されているため、カーネル ヘッダーをダウンロードすると、見つかりませんと表示されます。

  • 他のアプローチは、その特定のカーネルのソースを取得することですが、ここでも問題は、パッチが適用されたカーネルの同じソースが利用できないことです (linux-kernel-3.0.0-10 または linux-kernel-3.0.0 のソースを取得する必要はありません)。および 10 番目のパッチ)。状況によっては、実行中のカーネルのソースを取得することができますが、常に可能であるとは限りません。

  • もう 1 つは、実行中のカーネル以外のカーネルをビルドし、ビルドしたカーネルをマシンに配置することです。しかし、時間とスペースを消費するプロセスであるそのカーネルのモジュールを構築する必要があります。

したがって、これを尋ねる意図は、カーネル ドライバー開発者の好みを知ることです。他の選択肢はありますか?

あるバージョンでカーネル モジュールをコンパイルし、別のバージョンで実行することは可能ですか (エラーが発生しますが、これに対する回避策はありますか?)

4

3 に答える 3

8

したがって、新しいカーネルを構築することは、次のことを必要とするため、適切なオプションではありません。

  • カーネルの構築
  • モジュールとファームウェアの構築
  • ヘッダーの作成上記のすべてを適切な場所に移動します(モジュールを開発するマシンと同じでない場合)

したがって、実行中のシステム用のカーネルヘッダーがある場合は、カーネルバージョンのソースコードをダウンロードする必要はありません。モジュールを使用する場合は、

make -C /lib/modules/kernel-headers-x.y.z/build M=`pwd` modules

モジュールの準備が整います。

より良い答えがあれば、私はそれらのいずれかを受け入れることを躊躇しません。

于 2012-06-02T22:04:28.467 に答える
3

この質問が出されてから長い時間が経ちました。私はカーネル開発の初心者です。私も同じエラーに遭遇しました。しかし今では、モジュールをビルドした別のカーネルにモジュールをロードできます。解決策は次のとおりです。

  1. 実行しているイメージに関連する kernel-devel をダウンロードします。できるだけ近いバージョンにする必要があります。
  2. モジュールで使用している関数が、kernel-devel にあるヘッダー ファイルにマップされていることを確認します。
  3. include/generated/utsrelease.hファイルの UTS_RELEASE 値を変更します。ハードウェアで実行されているカーネル イメージのバージョンに変更します。
  4. このカーネル ツリーを使用してモジュールをコンパイルします。
  5. これで、カーネル内にモジュールを挿入できます。

注:: 上記の Shahbaz のように、望ましくないイベントが発生する可能性があります。しかし、実験のためだけにこれを行っているのであれば、行ってもいいと思います。:)

于 2014-08-08T19:54:38.240 に答える
-5

あるカーネルでモジュールを構築し、それを別のカーネルに挿入する方法があります。これは、特定の構成をオフにすることによって行われます。これは絶対に危険なので、どの構成かは言いません。その理由は、カーネル間に変更があり、モジュールの動作が異なる可能性があり、多くの場合、完全にフリーズする可能性があるためです。

すべきことは、すでにビルドされたカーネル (または少なくとも構成済みのカーネル) に対してモジュールをビルドすることです。パッチが適用されたカーネルがある場合、そのカーネルをビルドし、それで OS を起動するのが最善の方法です。

これには時間がかかることはわかっています。私は何度もそれをやっていて、それがどれほど退屈になるかを知っていますが、一度正しくやれば、あなたの人生はずっと楽になります. カーネルのコンパイルには約 2 時間ほどかかりますが、マルチコア CPU を使用している場合は並列化できます。また、オフィスを出る前 (または家にいる場合は就寝前) にいつでもコンパイルして、夜間に動作させることができます。

つまり、興味のあるカーネルを自分でビルドすることを強くお勧めします。

于 2012-06-02T11:27:46.220 に答える