要點(diǎn):在用戶空間驅(qū)動程序insmodmodprobermmod一些宏:LINUX_VERSION_CODE整數(shù)宏GNU make 擴(kuò)展語法
obj-m +=hello.o
KERNELDIR := /usr/src/linux-headers-2.6.32-5-686
PWD :=$(shell pwd)
.PHONY: test clean all
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsm *.order *.symvers .tmp_versions
test:
insmod ./hello.ko
rmmod hello
dmesg -c
obj-m由內(nèi)核構(gòu)造系統(tǒng)使用的makefilet符號,用來確定在當(dāng)前目錄中應(yīng)構(gòu)造哪些模塊.即m:指定把對象編譯為模塊obj-y指定把對象編譯進(jìn)內(nèi)核中如果我們要構(gòu)造的模塊為module.ko,并由file1.c和file2.c則正確的makefile可如下編寫:obj-m :=module.omodule-objs :=file1.o file2.o為了讓上面的makefile可以工作,必須在大的內(nèi)核構(gòu)造系統(tǒng)環(huán)境中調(diào)用它們,所以上述命令首先要改變-C指定的目錄,即: $(MAKE) -C $(KERNELDIR)然后指定M變量目錄,即讓makefile在構(gòu)造modules目標(biāo)之前返回到模塊源代碼的目錄,既當(dāng)前目錄 M=$(PWD),最后modules目標(biāo)指向obj-m變量中設(shè)定的模塊.
M不是一個編譯選項(xiàng),而是一個變量,從頂層makefile文件里可以找到它的定義
文件在
/usr/src/linux-headers-2.6.32-5-common/Makefile
69 ifeq ("$(origin M)", "command line")
70 KBUILD_EXTMOD := $(M)
71 endif
-C 用于指定內(nèi)核源代碼的目錄
-M 用于module所在的目錄
如果一個模塊包括了多個.c文件(如 file1.c , file2.c),則應(yīng)該以如下方式編寫Makefile
obj-m := modulename.o
module-objs := file1.o file2.o