Linux設備驅動程序:gnu make 擴展語法
要點:
在用戶空間驅動程序
insmod
modprobe
rmmod
一些宏:
LINUX_VERSION_CODE
整數宏
GNU make 擴展語法
obj-m
由內核構造系統使用的makefilet符號,用來確定在當前目錄中應構造哪些模塊.
即m:指定把對象編譯為模塊
obj-y
指定把對象編譯進內核中
如果我們要構造的模塊為module.ko,并由file1.c和file2.c則正確的makefile可如下編寫:
obj-m :=module.o
module-objs :=file1.o file2.o
為了讓上面的makefile可以工作,必須在大的內核構造系統環境中調用它們,所以上述命令首先要改變-C指定的目錄,即:
$(MAKE) -C $(KERNELDIR)
然后指定M變量目錄,即讓makefile在構造modules目標之前返回到模塊源代碼的目錄,既當前目錄 M=$(PWD),最后modules目標指向obj-m變量中設定的模塊.
在用戶空間驅動程序
insmod
modprobe
rmmod
一些宏:
LINUX_VERSION_CODE
整數宏
GNU make 擴展語法
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
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
由內核構造系統使用的makefilet符號,用來確定在當前目錄中應構造哪些模塊.
即m:指定把對象編譯為模塊
obj-y
指定把對象編譯進內核中
如果我們要構造的模塊為module.ko,并由file1.c和file2.c則正確的makefile可如下編寫:
obj-m :=module.o
module-objs :=file1.o file2.o
為了讓上面的makefile可以工作,必須在大的內核構造系統環境中調用它們,所以上述命令首先要改變-C指定的目錄,即:
$(MAKE) -C $(KERNELDIR)
然后指定M變量目錄,即讓makefile在構造modules目標之前返回到模塊源代碼的目錄,既當前目錄 M=$(PWD),最后modules目標指向obj-m變量中設定的模塊.
M不是一個編譯選項,而是一個變量,從頂層makefile文件里可以找到它的定義
文件在
/usr/src/linux-headers-2.6.32-5-common/Makefile
69 ifeq ("$(origin M)", "command line")
70 KBUILD_EXTMOD := $(M)
71 endif
-C 用于指定內核源代碼的目錄
-M 用于module所在的目錄
如果一個模塊包括了多個.c文件(如 file1.c , file2.c),則應該以如下方式編寫Makefile
obj-m := modulename.o
module-objs := file1.o file2.o
obj-m := modulename.o
module-objs := file1.o file2.o
posted on 2012-03-16 11:11 天下 閱讀(978) 評論(3) 編輯 收藏 引用 所屬分類: kernel & Driver

