1.2 本书中模块编译Makefile模板
在Linux 3.19内核中,模块的编译需要配置过的内核源代码;编译过程首先会到内核源代码目录下读取顶层的Makef ile文件,然后再返回模块源代码所在目录;经过编译、链接后生成的内核模块文件的后缀为.ko。
3.19内核模块的Makef ile模板:
ifneq ($(KERNELRELEASE), ) mymodule-objs:= mymodule 1.o mymodule 2.o #依赖关系 obj-m += mymodule.o #编译链接后将生成mymodule.ko模块 else PWD := $(shell pwd) KVER := $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) #此处将再次调用make clean: rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers *~ endif
当在命令行执行make命令时,将调用Makef ile文件。$(KERNELRELEASE)是在内核源码的顶层/usr/src/linux-3.19.3/Makef ile文件中定义的一个变量,位置在第416行,如图1-1所示。在第一次读取执行此Makef ile时,变量$(KERNELRELEASE)没有被设置,因此第一行ifneq的条件失败,从else后面开始执行,设置PWD、KVER和KDIR等变量。
图1-1 内核源码的顶层Makef ile
当make到标号all时,-C$(KDIR)指明跳转到内核源码目录下读取那里的Makef ile;M=$(PWD)表明返回到当前目录继续读入、执行当前的Makef ile,也就是第二次调用make。这时的$(KERNELRELEASE)已被定义,因此语句ifneq成功,make将继续读取紧接在ifneq后面的内容。ifneq的内容为kbuild语法的语句,指明模块源码中各文件之间的依赖关系和要生成的目标模块名称。
语句“mymodule-objs:=mymodule 1.o mymodule 2.o”表示mymodule.o由mymodule1.o与mymodule2.o链接生成。语句“obj-m+=mymodule.o”表示编译链接后将生成mymodule. ko模块,这个文件就是要插入内核的模块文件。
如果make的目标是clean,直接执行clean标号后的操作,也就清除*.o、*.mod.c、*.ko、*.symvers、*.order、*.markers、*~这些文件操作。执行完clean后面的rm命令后,整个make工作就结束了。