1. 内核编译源码
KERNEL_VER = $(shell uname -r)
obj -m += test.o
EXTRA_CFLAGS = -g -o0
build: kernel_modules
kernel modules:
#make -C /lib/modules/'uname-r'/build M=$(PWD) modules
make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) clean
2.代码解读
1. 由于Linux版本的不断更新,当设备驱动去兼容不同版本的内核时,需要知道当前使用的内核源码版本,一次来调动对应 版本的API ,在/usr/include/linux/version.h 有linux_version_code和kernel_version(a,b,c)的定义。
2.obj -y += xxx.o 该模块编译到zImage。
obj -m +=xxx.o 该模块不会编译到zImage,生成一个独立的xxx.ko静态编译。
3.extra_flags EXTRA_变量被makefile文件所有的执行命令语句所使用 $(EXTRA_CFLAGS)是使用$(CC)/gcc编译C文件的 编译参数选项,CFLAGS += $(EXTRA_CFLAGS),在外部传入CFLAGS会将makefile中的变量CFLAGS中的值覆盖掉,而
采用EXTRA_FLAGS变量的目的是在外部传入CFLAGS变量时不会将makefile中该变量的值被覆盖掉,而是将相应的值加上 去。
4.M = $(PWD) 意思是返回到当前目录继续读入、执行当前的makefile。当前目录查找模块源码,将其编译,生成.ko文件。
参考链接
1.https://blog.csdn.net/qq_15437667/article/details/69490325
2.https://blog.csdn.net/SoaringLee_fighting/article/details/79676261
3.https://blog.csdn.net/qq_29350001/article/details/50780378