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'
...
ドライバーをコンパイルしてmodprobeしようとすると、失敗します。 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カーネルと一致させたいと思っています。
いくつかのアプローチがあります...
外部モジュール(開発中のモジュールを含む)をビルドする場合は、カーネルヘッダーのみが必要です。
_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パッケージをインストールしてください。
アップストリームカーネルに基づいて開発したい場合(これがお勧めです)、 Linus ’tree を複製してそこで作業する必要があります。モジュールをテストするには、完全なアップストリームカーネルをビルドするか、上記のポイント1で指定したアプローチを使用してモジュールをビルドする必要があります。
いずれにせよ、(_apt-get source
_を使用して取得した) linux ソースパッケージ自体を使用することはお勧めできません。これは、Ubuntuで使用されるすべてのカーネルをビルドするために設計されているためです。そのソースパッケージを盲目的にdebuild
使用すると、ビルドが完了するまでに何時間も待機します...(これがである状況があります適切であり、Ubuntuカーネルのドキュメントに何をすべきかが説明されていますが、これはおそらくその1つではありません。