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


9

ゴール

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仮想マシンにUbuntu 11.04デスクトップx86をインストールし、
  2. Synaptic Package Managerを使用してインストールされeclipse-cdtlinux-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 byすべて作成するルールはありません。やめる。

make:ディレクトリ '/usr/src/linux-headers-2.6.38-8-generic'を残しています

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

だから、何かが日食で間違っている必要がありますMakefilevmlinux現在のアーキテクチャがx86の場合、アーキテクチャ(?)または何かを探している可能性があります。たぶんそれはVMWareのせいですか?

私が理解したようにeclipse、メイクファイルを自動的に作成し、手動で変更すると、将来エラーが発生したり、管理がmakefile困難になったりします。

だから、どうすればこのプロジェクトを日食でコンパイルできますか?

回答:


5

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

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

  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. Project type:ペインで、Makefileプロジェクトをクリックし、Empty Projectを選択します。
  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.hinclude/linux/autoconf.h
  17. また、使用している他のマクロファイルを追加します。
  18. インデクサーをクリックします
  19. [プロジェクト固有の設定を有効にする]チェックボックスをオンにします。
  20. ビルドに含まれていないインデックスソースファイルのチェックを外します
  21. [インデックスに登録するファイル]ボックスをクリアします。
  22. 左側のパスとシンボルをクリックします。
  23. 「含む」タブを選択してから、 GNU C
  24. クリックAdd...
  25. Workspace...をクリックし、カーネルのインクルードディレクトリを選択します。
  26. 別の追加、ワークスペースを実行し、を追加しますarch/architecture/includearch/powerpc/include
  27. # Symbolsタブをクリックします
  28. クリックAdd...
  29. 名前を __KERNEL__
  30. 値をに設定し1、[OK]をクリックします
  31. [ソースの場所]タブをクリックします
  32. プロジェクトのツイスティをクリックします。
  33. [フィルター]アイテムを選択し、[フィルターの編集...]をクリックします。
  34. [複数追加...]をクリックし、使用しないカーネルソース内のすべてのarch / *ディレクトリを選択します(つまり、使用しているアーキテクチャ用ではないすべてのディレクトリ)。
  35. [OK]をクリックし、もう一度[OK]をクリックしてそのダイアログを閉じます。
  36. [プロパティ]ダイアログで[OK]をクリックします。
  37. C ProjectダイアログでFinishをクリックします。
  38. プロジェクトを右クリックして[インデックス]を選択し、[再構築]を選択します
  39. 完了するまでに約20分かかります。
  40. プロジェクト設定を開き、 C/C++ build -> Behaviour (tab)
  41. チェックBuild (Incremental buil)ボックスをオンにして、モジュールパスをテキストボックスに追加します(私の場合M=drivers/servo/dynamixel)。
  42. あなたはしているモジュールは準備ができている、あなたは、カーネルをコンパイル41を繰り返して、交換したいときM=..all

1

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

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

残念ながら、eclipse-cdtがまともなMakefileを管理できるという考えを放棄するだけで、CはJavaではありません。残念ながら、ありがたいことに。


ありがとう。autotoolsすぐにプラグインを確認します。ドライバープログラミングに適したIDEを知っていますか?私(Linuxの経験がない怠惰なVSユーザー)が管理できるとmakefile思いますか?あるmakefile大規模なプロジェクトで、sは本当に扱いやすいですか?
Isaac

私も怠惰なVSユーザーだったので、autotoolsの習得は急な学習曲線を持っていることを認めなければなりませんが、それはLinuxだけでなく非常に価値があります。Eclipseは最高のIDEの1つですが、autotoolsプロジェクトは非常に多様であるため、IDEはすべての可能性を解析できません。正しく実行したい場合はgeanyを試してください。VS6が気に入った場合はanjutaとcodeliteを試してください。ただし、コマンドラインコンパイルには常に熟練している必要があります。
Aquaquad、2011年

1

私も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ペーパーOttawa Linux Symposiumペーパー

ドライバーの迅速な展開に使用される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

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


1

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

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

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

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

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.