写一个内核模块的Makefile模板记录:
ifneq ($(KERNELRELEASE),)
obj-m:=abc.oelse
KDIR:=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
-rm *.o* *.s* *.m*
endif
那么你编译的模块怎么就能在内核中运行呢?
原理是这样的:
1.执行make,因为KERNELRELEASE没有定义,会跳转到 $(KDIR)也就是内核源码目录。(make -C $(KDIR) 就是跳转到 $(KDIR) )
2.执行主目录makefile设置相关变量,其中就有KERNELRELEASE,当然还有其他和内核相关的设定,然后编译一个指定的模块。而这个模块的路径是通过M=$(PWD)指定,也就是当前目录。
3.然后跳到这这个模块的目录执行他的makefile,(又一次执行此makefile)此时KERNELRELEASE已经定义,那就是执行:obj-m:=abc.o。这和内核代码里的模块makefile是一样的。指定了以模块形式编译。
4.最后编译这个模块adc.ko
另外,如果模块有好几个c文件,那么
需要将obj-m = abc.o换成如下代码:
Obj-m = MN.o
MN-objs = M.o, N.o