web-dev-qa-db-ja.com

カーネルバイナリとカーネルモジュール構築のためのソースの配置?

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)を使用してこれらの場所を検索するディストリビューション固有の方法もあります。

gcc

ただし、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システムを使用します。

参考文献

2
slm

回答は、これを行うための特定の機構を持っている可能性があるため、多くの場合、ディストリビューション固有です。 Debianの場合、 Debian Linuxカーネルハンドブック があります。 Ubuntuは本質的にDebianであるため、これはすべて当てはまるはずです。私が正しく理解していれば、あなたはカーネルのインストールについて質問しています。 1つのアプローチ、良い方法は、カーネルとカーネルヘッダーのバイナリパッケージを構築し、それらをインストールすることです。このハンドブックでは、その方法を説明します。 「DebianWheezyカーネルをオフラインでアップグレードするにはどうすればよいですか?」に対する私の答え も参照してください。この答えは、実際にいくつかのクリーンアップで行うことができます。

標準のDebian/Ubuntuカーネルお​​よびカーネルヘッダーバイナリパッケージを使用することは完全に合理的なことであり、コンパイルを必要としないことに注意してください。

1
Faheem Mitha

カーネルにはdeb-pkg 目標。 Debianでは、make deb-pkgおよびSudo dpkg -i '結果の2つのパッケージ(../)私にとって魅力のように働いた。 Ubuntuでも同じように動作すると思います。ビルドとインストールの際、それらには自動的に適切な場所に配置されます。

1
jthill