ドライバのMakefile


モジュールをコンパイルする前に、カーネル準備カーネルツリーを構成して構築します.
 
参考資料:
1.GNU-MAKE中国語マニュアル
2 .Linuxデバイスドライバ(第3版)第2章のコンパイルとマウント部分(p 29)
 3.http://blog.chinaunix.net/u2/66435/showart_1275771.html
GNU-makeでMakefile作成の基礎知識を知る.
 
linuxデバイスドライバでドライバ作成のフォーマットを理解するには、Makefile作成の基礎知識だけでなく、GNU-make構文の拡張にも使用されます.たとえば、中の:obj-m:=です.ドライバのMakefileの実行手順を簡単に説明しました.
 
ウェブサイトではMakefileの実行の具体的な過程を詳しく紹介し、Makefileが2回実行された理由を重点的に紹介した.
 
以下は上記のWebサイトの資料です.
簡単なハローカーネルモジュールのMakefile:
#hell0_makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules
clean:
        rm -rf *.o *.mod.c *.mod.o *.ko
endif

helloモジュールを1つ書き終わると、以上のmakefileを使用します.そしてmakeはすぐにいいです.helloモジュールのソースコードを/home/study/prog/mod/hello/の下に置くとします.このディレクトリでmakeを実行すると、makeはどのように実行されますか?LDD 3第2章第4節「コンパイルとマウント」では、このMakefileが2回実行されたと簡単に述べただけですが、具体的な手順はどうでしょうか.
まず、makeの後ろに目標がないので、makeはMakefileの中で最初にそうではありません.先頭のターゲットはデフォルトのターゲットとして実行されます.そこでdefaultはmakeのターゲットになります.makeは$(MAKE)-C$(KERNELDIR)M=$(PWD)modules shellがmake内部の関数であり、現在のカーネルバージョンが2.6.13-studyであると仮定するため、$(shell uname-r)の結果は2.6.13-studyここで、実際に実行されるのは
make -C /lib/modules/2.6.13-study/build M=/home/study/prog/mod/hello/ modules

/lib/modules/2.6.13-study/buildは、カーネルソース/usr/src/linuxへのシンボルリンクです.makeが2回実行されたことがわかります.最初の実行時はhelloモジュールのソースコードがあるディレクトリ/home/s tudy/prog/mod/hello/の下のMakefileを読みます.2回目の実行は/usr/src/linux/下のMakefileを実行する場合である.
しかし、まだ多くの困惑する問題があります:1.このKERNELLRELEASEも困惑していますが、それは何ですか?この変数は/home/study/prog/mod/hello/Makefileでは定義されていないので、else...endifというセグメントに役立ちます.ただし、helloモジュールをカーネルソースコードに移動すると.たとえば/usr/src/linux/driver/に入れると、KERNELLRELEASEが定義されます./usr/src/linux/Makefileに162 KERNELLRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)この場合、helloモジュールもmake単独でコンパイルするのではなく、カーネルでmake modulesでコンパイルする.このようにして、Makefileは単独でコンパイルしてもカーネルの一部としてコンパイルしても正常に動作します.
2.このobj-m:=hello.oいつ実行されますか?実行中:
make -C /lib/modules/2.6.13-study/build M=/home/study/prog/mod/hello/ modules

の場合、makeは/usr/src/linux/Makefileでターゲットmodules:862を探します.PHONY: modules 863 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) 864 @echo ' Building modules, stage 2.'; 865 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
2つのステージに分かれていますコンパイルoファイル.2.helloを生成する.mod.o hello.koはこの過程でmake-f scripts/Makefileを呼び出す.build obj=/home/study/prog/mod/helloでscripts/Makefile.buildには多くのファイルが含まれます:011-include.config 012 013 include$(if$(wildcard$(obj)/Kbuild)、$(obj)/Kbuild,$(obj)/Makefile)の中に/home/study/prog/mod/hello/Makefileがある場合KERNELLRELEASEは既に存在します.だから実行するのは:obj-m:=hello.o
make modulesに関するより詳細な手順はscript/Makefile.modpostファイルのコメントに見つかりました.makeの実行プロセス全体を表示する場合は、make-nを実行します.