web-dev-qa-db-ja.com

Eclipseを使用してカーネル2.6用の「Hello World」デバイスドライバーを作成する

ゴール

Ubuntuで簡単なデバイスドライバーを作成しようとしています。 Eclipse(または、ドライバープログラミングに適したより優れたIDE)を使用してこれを行いたい。コードは次のとおりです。

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );

私の努力

いくつかの調査の後、ドライバーの開発に Eclipse CTD を使用することにしました(マルチスレッドデバッグツールをサポートしているかどうかはまだわかりません)。だから私:

  1. VMWare仮想マシンに buntu 11.04 desktop x86 をインストールしました。
  2. Synaptic Package Managerを使用してEclipse-cdtおよび linux-headers-2.6.38-8 をインストールしました。
  3. C Projectという名前のTestDriver1を作成し、上記のコードをコピーアンドペーストしました。
  4. デフォルトのビルドコマンドmakeを次のカスタマイズされたビルドコマンドに変更しました。

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

問題

Eclipseを使用してこのプロジェクトをビルドしようとすると、エラーが発生します。ビルドのログは次のとおりです。

****プロジェクトTestDriver1の構成デバッグのビルド****

make -C /lib/modules/2.6.38-8-generic/build M =/home/isaac/workspace/TestDriver1 all

make:ディレクトリ「/usr/src/linux-headers-2.6.38-8-generic」を入力します

make:***ターゲットvmlinux', needed byall 'を作成するルールはありません。やめる。

make:ディレクトリ '/usr/src/linux-headers-2.6.38-8-generic'を離れる

興味深いことに、Shellの代わりにEclipseを使用してこのプロジェクトをビルドしても、エラーは発生しません。 Shellを使用するには、obj-m += TestDriver1.oを含むMakefileを作成し、上記のmakeコマンドを使用してビルドします。

したがって、Eclipse Makefileには何か問題があるはずです。おそらく、現在のアーキテクチャがx86であるときにvmlinuxアーキテクチャ(?)または何かを探している可能性があります。たぶんVMWareのせいでしょうか?

私が理解したように、Eclipseはmakefileを自動的に作成し、それを手動で変更すると、将来的にエラーが発生しますOR makefileの管理が難しくなります。

それでは、どのようにしてこのプロジェクトをEclipseでコンパイルできますか?

9
Isaac

私はあなたとほぼ同じ立場にいます。 this istructionsに従って、カーネル自体と単一のモジュールの構築に成功しました。

メイン記事に3つのステップ(40〜42)を追加して、Eclipseがカーネル全体ではなく特定のドライバーをコンパイルするようにしました。

  1. EclipseとCDTをダウンロードしてインストールします。
  2. CONFIG_*を定義してautoconf.hを生成するようにカーネルを構成および構築します。これは、Eclipseをダウンロードしてインストールする前または後に実行できます。
  3. 適切なカーネルソースがあることを確認してください(たとえば、正しいgitブランチにいることを確認してください)。後で別のブランチをチェックアウトしても問題ありませんが、ソースのインデックスを再作成する必要があり、約20分かかります。
  4. Eclipseを起動します。
  5. File-> New-> C Projectをクリックします
  6. my_kernelのようなプロジェクト名を入力します
  7. Use default locationボックスのチェックを外し、カーネルのルートディレクトリをLocationボックスに入力します。
  8. プロジェクトの種類:ペインで、Makefileプロジェクトをクリックし、空のプロジェクトを選択します
  9. 右側で、Linux GCCを選択します
  10. [Advanced settings...]をクリックすると、[プロパティ]ダイアログが表示されます。
  11. 左側の[リソース]を選択し、[テキストファイルのエンコード]セクションで、[その他]を選択し、ボックスで[ISO-8859-1]を選択して、[適用]をクリックします。
  12. 左側のC/C++ General選択を開きます。
  13. Preprocessor Include Pathsをクリックします
  14. [言語]リストで[GNU C]を選択します
  15. [設定エントリ]リストでCDT User Setting Entriesを選択します
  16. Add....をクリックします。左上のドロップダウンから[プリプロセッサマクロファイル]を選択し、右上のドロップダウンから[プロジェクトパス]を選択し、[ファイル]テキストボックスにinclude/generated/autoconf.hと入力します。 (注:古いカーネル[2.6.36以前?]の場合、autoconf.hの場所はinclude/linux/autoconf.hです)
  17. 使用している他のマクロファイルも追加します。
  18. インデクサーをクリックします
  19. [プロジェクト固有の設定を有効にする]チェックボックスをオンにします。
  20. ビルドに含まれていないインデックスソースファイルのチェックを外します
  21. [インデックスを作成するファイル]ボックスをクリアします。
  22. 左側のパスとシンボルをクリックします。
  23. [含める]タブを選択し、[GNU C]を選択します
  24. Add...をクリックします.
  25. Workspace...をクリックしてから、カーネルのインクルードディレクトリを選択します
  26. 別の追加、ワークスペースを実行し、Arch/architecture/includeを追加します(例:Arch/powerpc/include
  27. [# Symbols]タブをクリックします
  28. Add...をクリックします.
  29. 名前を__KERNEL__に設定します
  30. 値を1に設定し、[OK]をクリックします
  31. [ソースの場所]タブをクリックします
  32. プロジェクトのツイスティをクリックします。
  33. フィルター項目を選択し、フィルターの編集...をクリックします.
  34. [複数追加...]をクリックして、使用しないカーネルソース内のArch/*ディレクトリをすべて選択します(つまり、使用しているアーキテクチャ用ではないすべてのディレクトリ)
  35. [OK]をクリックし、もう一度[OK]をクリックして、そのダイアログを閉じます。
  36. [プロパティ]ダイアログで[OK]をクリックします。
  37. [Cプロジェクト]ダイアログで[完了]をクリックします。
  38. プロジェクトを右クリックして「インデックス」を選択し、「再構築」を選択します
  39. 完了するまでに約20分かかります。
  40. プロジェクト設定を開き、C/C++ build -> Behaviour (tab)に移動します
  41. Build (Incremental buil)チェックボックスをオンにして、モジュールパスをテキストボックスに追加します(私の場合はM=drivers/servo/dynamixel)。
  42. モジュールの準備ができてカーネルをコンパイルしたい場合は、41を繰り返し、M=..allに置き換えます。
5
sorush-r

1>このコマンドで試すことができます

「make」->「/ usr/bin/make」

/usr/bin/make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

2>ディレクトリにHello Wordコードを保存し、ファイル名「Makefile」を作成します

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(Shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
1
namphamtien

Eclipseを使用してドライバー開発を行う場合は、逆の方法で行う必要があります。

Automake、autogen、pkg-configなどに追いつき、autotoolsプロジェクトを作成してEclipseにインポートする必要があります。 Eclipse-cdtはこれを提供する必要があります。そうしないと、「autotools-plugin」のインストールを忘れてしまいます(正確な名前がわからないため、これをメモリから書き込みます)。

Eclipse-cdtがまともなMakefileを管理できるという考えを捨ててください。残念ながら、CはJavaではありません。

1
aquaherd

私もLinuxドライバーのプログラミングに慣れていないので、DKMSと呼ばれるカーネルモジュール(公式のLinuxツリーにはない)を展開する新しい方法があることに気付きました。モジュールはソースとしてインストールされ、DKMSが各カーネルのコンパイルを処理します。これは、モジュールのMakefileが手動で書き込まれ、そのソースがautotoolsに含まれないことを意味します。

http://linux.Dell.com/dkms/

更新しました...

DKMSは http://en.community.Dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx に移動しました

このチュートリアル/ DKMSのクイックイントロダクション(Dellプロジェクトページからのリンク): Linux Journal記事Power Solutions paperOttawa Linux Symposium paper

迅速なドライバーの展開に使用されるDKMS。私のUbuntuマシンでDKMSを使用するカーネルモジュールの例:

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

これは以前に書いたコードです。DKMSHello Worldとして役立つかもしれません。 https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

1
user.dz