MAKEFILE全部內容
#DEBUG = y
ifeq ($(DEBUG),y)
DEBFLGAS = -O -g -DSCULL_DEBUG
else
DEBFLAGS = -O2
endif
CFLAGS += $(DEBFLAGS)
CFLAGS += -I$(LDDINC)
ifneq ($(KERNELRELEASE),)
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) LDDINC=$(PWD)/../include modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend
ifeq(.depend,$(wildcard .depend))
include .depend
endif
執行過程分析
在構造過程中,該MAKEFILE被讀取兩次,當在命令行輸入‘make’之後,此時KERNELRELEASE還未設置,MAKEFILE裏面可以有多個目標,如果在命令行中沒有指定make的目標,那麼執行第一條帶冒號的語句。在這裏執行modules目標
$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
這裏轉入執行/usr/src/linux下的MAKEFILE,在執行過程中,KERNELRELEASE就會被定義,所以執行:
scull-objs := main.o pipe.o access.o
obj-m := scull.o
最終生成scull.ko。
.ko文件和.o文件相比。o的文件是object文件,.ko是kernel object,與.o的區別在於其多了一些sections,比如.modinfo。.modinfo section是由kernel source裏的modpost工具生成的,包括MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE, device ID table以及模塊依賴關係等等。depmod 工具根據.modinfo section生成modules.dep, modules.*map等文件,以便modprobe更方便的加載模塊。
?=符號講解
?=pattern,在任何匹配pattern的字符串開始處匹配查找字符串,比如正則表達式是‘abc(?=1234)’,那麼當輸入‘abc1234’時輸出test,因爲匹配到了‘1234’,當輸入‘abc123’時沒有輸出,因爲沒有匹配到1234。