LDD3中第一个程序MAKEFILE的学习

参考:关于linux内核模块Makefile的解析

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章