Linuxでカーネルモジュールを開発するための環境をセットアップしようとしています。ホームフォルダにカーネルを構築しました。ソースとバイナリを正しい場所に配置したいので、正しく含めます。
カーネルモジュールを構築する例には、次のものがあります。
#include <linux/init.h>
#include <linux/module.h>
リンカがこれらのヘッダーを探す絶対パスは何ですか?
私は一般的にこの質問にこのようにアプローチします。私はFedora19システムを使用していますが、これはlocate
サービスを提供するすべてのディストリビューションで機能します。
$ locate "linux/init.h" | grep include
/usr/src/kernels/3.13.6-100.fc19.x86_64.debug/include/linux/init.h
/usr/src/kernels/3.13.7-100.fc19.x86_64.debug/include/linux/init.h
/usr/src/kernels/3.13.9-100.fc19.x86_64/include/linux/init.h
/usr/src/kernels/3.13.9-100.fc19.x86_64.debug/include/linux/init.h
パスは異なりますが、重要なポイントは、locate
に何が含まれているか( "linux/init.h")を検索し、これらの結果をフィルタリングしてキーワードinclude
を探すことです。 。
RPM(Redhat)またはAPT(Debian/Ubuntu)を使用してこれらの場所を検索するディストリビューション固有の方法もあります。
ただし、C/C++ファイル内のパスは相対的であることに注意してください。
#include <linux/init.h>
これは、コンパイラーgcc
を呼び出すときに、使用するインクルードファイルの場所をオーバーライドできるようにするためです。これは、スイッチ-I <dir>
を介して制御されます。
man gccからの抜粋
-I dir
Add the directory dir to the list of directories to be searched for
header files. Directories named by -I are searched before the
standard system include directories. If the directory dir is a
standard system include directory, the option is ignored to ensure
that the default search order for system directories and the special
treatment of system headers are not defeated . If dir
begins with "=", then the "=" will be replaced by the sysroot
prefix; see --sysroot and -isysroot.
Linuxカーネルに含まれている「ビルド環境」に独自のカーネルモジュールの開発を組み込む方法について説明するこの記事があります。記事のタイトルは次のとおりです。 ドライバーの移植:外部モジュールのコンパイル 。カーネルのmakefileの構成についても、この記事で説明しています: makefiles.txt 。
カーネル初心者のために、この記事もあります: KernelHeaders kernelnewbies.orgWebサイトから。
注:カーネルは、カーネルに含まれているドキュメントの一部としてここで説明されているKBuildシステムを使用します。
回答は、これを行うための特定の機構を持っている可能性があるため、多くの場合、ディストリビューション固有です。 Debianの場合、 Debian Linuxカーネルハンドブック があります。 Ubuntuは本質的にDebianであるため、これはすべて当てはまるはずです。私が正しく理解していれば、あなたはカーネルのインストールについて質問しています。 1つのアプローチ、良い方法は、カーネルとカーネルヘッダーのバイナリパッケージを構築し、それらをインストールすることです。このハンドブックでは、その方法を説明します。 「DebianWheezyカーネルをオフラインでアップグレードするにはどうすればよいですか?」に対する私の答え も参照してください。この答えは、実際にいくつかのクリーンアップで行うことができます。
標準のDebian/Ubuntuカーネルおよびカーネルヘッダーバイナリパッケージを使用することは完全に合理的なことであり、コンパイルを必要としないことに注意してください。
カーネルにはdeb-pkg
目標。 Debianでは、make deb-pkg
およびSudo dpkg -i
'結果の2つのパッケージ(../
)私にとって魅力のように働いた。 Ubuntuでも同じように動作すると思います。ビルドとインストールの際、それらには自動的に適切な場所に配置されます。