Linuxドライバを書いてみたいです。環境を構築しようとしています。私の現在のカーネル:
$ uname -r
4.10.0-37-generic
その後、ソースコードをダウンロードします。
$ apt-get source linux-image-$(uname -r)
Reading package lists... Done
Picking 'linux' as source package instead of 'linux-image-4.10.0-37-generic'
...
ドライバをコンパイルして修正しようとしましたが失敗しました。 dmesgを見る:
version magic '4.10.17 SMP mod_unload ' should be '4.10.0-37-generic SMP mod_unload '
この時点で私は混乱しています。ダウンロードしたソースツリーに戻って実行すると
$ make kernelversion
4.10.17
いいですね。 2つを試してみてください。カーネル4.10.17をダウンロードしてインストールします。
$ uname -r
4.10.17-041017-generic
それでもエラー:
version magic '4.10.17 SMP mod_unload ' should be '4.10.17-041017-generic SMP mod_unload
それなら誰かが助けを与えることができるでしょう。 Ubuntuで動作するカーネルと一致するソースを取得するための最良かつ正しい方法は何ですか(まあ、xubuntu、しかしそれは重要ではないと思います)? kernel.orgからコードを取得して最初から再構築する必要がありますか?私はリリースされたUbuntuカーネルと一致させたいと思います。
答え1
方法はいくつかあります...
開発中のモジュールを含む外部モジュールを構築する場合は、カーネルヘッダーのみが必要です。
apt install linux-header-$(uname -r)
/lib/modules/$(uname -r)/{build,source}
これにより、シンボリックリンクが意味のあるものを指すのに必要なファイルが提供されます。その後、次のコマンドを実行して別のディレクトリにモジュールを構築できます。make -C /lib/modules/$(uname -r)/build SUBDIRS="/path/to/your/module" modules
これにより、実行中のカーネルに合わせてモジュールが構築されます。
Ubuntuカーネルに基づいて開発するには、
linux-source
現在のUbuntuバージョンに適したパッケージを使用してください。linux-source-4.10.0
:apt install linux-source-4.10.0 cd /usr/src tar xf linux-source-4.10.0.tar.bz2
これにはUbuntuカーネルパッチが含まれており、現在のカーネルと同じ機能を持つカーネルを構築できます。ただし、パッケージ記述の警告に注意してください。
このパッケージは、主に他のパッケージからカスタムバージョンを構築するために使用されます。
このパッケージを使用してカスタムLinuxカーネルを作成するには、カーネルイメージパッケージの作成作業を簡素化するように設計されたkernel-packageパッケージを確認することをお勧めします。
カーネル用のサードパーティ製モジュールをビルドする場合は、このパッケージは必要ありません。適切な linux-headers パッケージをインストールします。
アップストリームカーネルに基づいて開発するには(私が推奨するものです)、以下を複製する必要があります。リヌスの木そしてそこで働いてください。モジュールをテストするには、アップストリームカーネル全体をビルドするか、上記のセクション1に記載されている方法を使用してモジュールをビルドする必要があります。
とにかく、使用Linuxソースパッケージ自体(Obtainを使用apt-get source
)は、実際にUbuntuで使用されているすべてのカーネルを構築するように設計されています。このソースパッケージを盲目的に使用する場合は、debuild
ビルドが完了するまで数時間待つ必要があります...(場合によってははい適切には、Ubuntuカーネルのドキュメントではこれを行う方法を説明していますが、これはおそらくそれらの1つではありません。 )