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 を使用することにしました(マルチスレッドデバッグツールをサポートしているかどうかはまだわかりません)。だから私:
Eclipse-cdt
および linux-headers-2.6.38-8 をインストールしました。C Project
という名前のTestDriver1
を作成し、上記のコードをコピーアンドペーストしました。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
all 'を作成するルールはありません。やめる。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でコンパイルできますか?
私はあなたとほぼ同じ立場にいます。 this istructionsに従って、カーネル自体と単一のモジュールの構築に成功しました。
メイン記事に3つのステップ(40〜42)を追加して、Eclipseがカーネル全体ではなく特定のドライバーをコンパイルするようにしました。
CONFIG_*
を定義してautoconf.h
を生成するようにカーネルを構成および構築します。これは、Eclipseをダウンロードしてインストールする前または後に実行できます。File
-> New
-> C Project
をクリックしますmy_kernel
のようなプロジェクト名を入力しますLinux GCC
を選択しますAdvanced settings
...]をクリックすると、[プロパティ]ダイアログが表示されます。ISO-8859-1
]を選択して、[適用]をクリックします。C/C++ General
選択を開きます。Preprocessor Include Paths
をクリックしますGNU C
]を選択しますCDT User Setting Entries
を選択しますAdd
....をクリックします。左上のドロップダウンから[プリプロセッサマクロファイル]を選択し、右上のドロップダウンから[プロジェクトパス]を選択し、[ファイル]テキストボックスにinclude/generated/autoconf.h
と入力します。 (注:古いカーネル[2.6.36以前?]の場合、autoconf.h
の場所はinclude/linux/autoconf.h
です)GNU C
]を選択しますAdd
...をクリックします.Workspace
...をクリックしてから、カーネルのインクルードディレクトリを選択しますArch/architecture/include
を追加します(例:Arch/powerpc/include
)# Symbols
]タブをクリックしますAdd
...をクリックします.__KERNEL__
に設定します1
に設定し、[OK]をクリックしますC/C++ build -> Behaviour (tab)
に移動しますBuild (Incremental buil)
チェックボックスをオンにして、モジュールパスをテキストボックスに追加します(私の場合はM=drivers/servo/dynamixel
)。M=..
をall
に置き換えます。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
Eclipseを使用してドライバー開発を行う場合は、逆の方法で行う必要があります。
Automake、autogen、pkg-configなどに追いつき、autotoolsプロジェクトを作成してEclipseにインポートする必要があります。 Eclipse-cdtはこれを提供する必要があります。そうしないと、「autotools-plugin」のインストールを忘れてしまいます(正確な名前がわからないため、これをメモリから書き込みます)。
Eclipse-cdtがまともなMakefileを管理できるという考えを捨ててください。残念ながら、CはJavaではありません。
私もLinuxドライバーのプログラミングに慣れていないので、DKMSと呼ばれるカーネルモジュール(公式のLinuxツリーにはない)を展開する新しい方法があることに気付きました。モジュールはソースとしてインストールされ、DKMSが各カーネルのコンパイルを処理します。これは、モジュールのMakefileが手動で書き込まれ、そのソースがautotoolsに含まれないことを意味します。
更新しました...
DKMSは http://en.community.Dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx に移動しました
このチュートリアル/ DKMSのクイックイントロダクション(Dellプロジェクトページからのリンク): Linux Journal記事 、 Power Solutions paper 、 Ottawa 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