Linux kernel 2.6下のmodulesコンパイルとKuild

1583 ワード

転載:http://blog.sina.com.cn/s/blog_602 f 8770010 dq 1 u.
 
Samの前にLinux kernel 2.4にdriverを書いたことがありますが、kersnel 2.6になってからは、driverを書いたことがありません.だから、具体的なものが多く分かりません.今日は文書を見ました.変化が大きいと思います.書き留める2.4カーネルの中で、自分でドライブを書いたら、最大でケネルヘッドファイルをコンパイルに合わせて必要です.通常のCFLAGSは=-D_u uKERNEL_-I$(KDIR)/include-DodULEですが、2.6以下ではありません.モジュールのコンパイルは、カーネルソースの設定に依存する必要があります.コンパイルのプロセスは、まずカーネルソースのターゲットになります.トップレベルのMakefileファイルModuleコンパイルのテンプレートは以下の通りです.
#Makefile for linux2.6 ifneq ($(KERNELRELEASE),) # call from kernel build system scull-objs := main.o pipe.o access.o obj-m := scull.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions endif
KERNELRELEASE:Kernel最上階のMakefileで定義されています.最初の運転では、KERNELREASEは定義されていませんので、else$C$(KERNELDIR)M=$(PWD)ここでKERNELDIRのトップMakefileを読みだします.読んでまた本ディレクトリに戻ります.引き続き本ディレクトリMakefileを実行します.このときKERNELRELEASEが定義されます.if.ifとelseの間に入るのはkbuild文法の文です.