Linux内核API完全参考手册(第2版)
上QQ阅读APP看书,第一时间看更新

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工作就结束了。