2017-05-31 9 views
0

カーネルモジュールとユーザースペースアプリケーションの両方をコンパイルするサードパーティのSWパッケージがあります。残念ながら、このサードパーティは非常に複雑で、Kbuildをカーネルモジュールの構築に使用しません(私は成功しなかった)。私が持っているカーネルソースツリーなしで外部カーネルモジュールを構築する方法

arm-linux-gnueabihf-gcc -D__KERNEL__ -Wall -include /lib/modules/4.4.62-18.6-default/build/include/generated/autoconf.h -MD -MP -Werror -O2 -I /usr/src/linux-4.4.62-18.6/include -I /src/include -DMODULE -c -o hello_dkm.o hello_dkm.c 
    $(LD) -o $(debug_target) $(LD_COMMON_FLAGS) -g $(debug_Objs) 

fatal error: /usr/src/linux-4.4.62-18.6/include/linux/thread_info.h:54:29: fatal error: asm/thread_info.h: No such file or directory 

付録

  • plateform:アルテラのCyclone V SoCの

    は、私は以下の行を持つシンプルなドライバを構築しようとしました、ARM Cortex A9デュアルコア
  • カーネル:Linuxのアルテラ3.7.0
  • ホスト:LinuxのopenSUSEの42

PS: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

:私のチームのプロジェクトplateformでは、カーネルソースツリーを使用して、古典的なコンパイル行を使用することは困難です

ありがとうございます。

+1

私は 'C++'タグはこの質問には当てはまりません。 –

+0

コンパイルカーネルモジュールでは、目的に合わせて 'kbuild'を使用しなくても、カーネルビルドディレクトリ*からのいくつかのファイル(カーネルをビルドした後のソースディレクトリ)が必要です。 Linuxヘッダーで(マクロとして)使用されるため、設定オプションが必要です。 'Module.symvers'ファイルのカーネルコアシンボルのバージョンが必要です。 'kbuild'を使わないでビルドプロセス全体を記述すると、スタックオーバーフローのために*広すぎるようです。 – Tsyvarev

答えて

0

すぐに問題が発生するのは、「asm/thread_info.h」がCPATHになく、-Iパラメータのいずれにも指定されていないことです。そのファイルをシステム上に置いて、そのルートをCPATH環境変数または-Iディレクティブのどちらかに入れる必要があります。

は、あなたが /usr/local/include/linux/asm/thread_info.hでファイルを見つけた場合、あなたはあなたが arm-linux-gnueabihf-gcc CPATH=/usr/local/include/linuxに先行しなければならない、またはおそらく右 arm-linux-gnueabihf-gcc後、コマンドラインのどこかに -I /usr/local/include/linuxを挿入し、これを明確にします。

その他の問題が発生する可能性がありますが、次のステップに進む必要があります。

0

あなたは(の.koファイル)とカーネルモジュールを構築するようなファイルを作ることができ、

それにこのコードを書く名前「のMakefile」とMakefileを作成します。

obj-m += drivername.o 
all: 
make -c /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
make -c /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

そして開放端子とが配置されているドライバと同じディレクトリにmakeコマンドを書き込みます。ドライバの.oと.koファイルが生成されます。

ドライバを挿入すると、insmod ドライバがカーネルにロードされます。

もし私が間違って理解できなかったらあなたに役立つでしょう

+0

これにはkbuildが必要ですが、OPは自分のビルド環境で利用できないと述べています。 –