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