购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 本书中模块编译Makefile模板

在Linux 3.19内核中,模块的编译需要配置过的内核源代码;编译过程首先会到内核源代码目录下读取顶层的Makefile文件,然后再返回模块源代码所在目录;经过编译、链接后生成的内核模块文件的后缀为.ko。

3.19内核模块的Makefile模板:


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命令时,将调用Makefile文件。$(KERNELRELEASE)是在内核源码的顶层/usr/src/linux-3.19.3/Makefile文件中定义的一个变量,位置在第416行,如图1-1所示。在第一次读取执行此Makefile时,变量$(KERNELRELEASE)没有被设置,因此第一行ifneq的条件失败,从else后面开始执行,设置PWD、KVER和KDIR等变量。

图1-1 内核源码的顶层Makefile

当make到标号all时,-C$(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明返回到当前目录继续读入、执行当前的Makefile,也就是第二次调用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工作就结束了。 4pJgaYca6p++8j+QXulY27XOdlGImVRtgNfi8F4GVjT9nm2fPzaejtng0atztpYV

点击中间区域
呼出菜单
上一章
目录
下一章
×