0 须知
内核源码树需要已经成功编译过一次才可以进行模块的编译
1.命令行形式
make -C ~/kernel-2.6 M=`pwd` modules
- -C make进入linux源码所在文件夹,从而获得内核的顶层Makefile,从而利用kbuild进行外部模块的编译
- -M make在执行目标前返回到模块源代码所在文件夹
- modules目标将会编译所有包含在obj-m变量下的module.o文件
2.Makefile
可以通过编写Makefile来利用make命令减少输入的指令
2.1 示例
#If KERNELRELEASE is defined, we've been invoked from the
#kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
2.2 代码解释
- 通过判断变量
$(KERNELRELEASE)
是否为空来判断当前make进程是在内核源码树中启动还是在源码树外启动 - 在源码树外执行make命令时,该Makefile将被执行两次。首先判断变量
$(KERNELRELEASE)
为空,则设置KERNELDIR
和PWD
变量来确定内核源码所在文件夹以及模块源文件夹。然后再调用再第一节中所介绍的命令进行模块的编译。 - 当make命令被调用后,由于进入内核源码目录获得了内核的顶层Makefile文件,变量
$(KERNELRELEASE)
不为空,则设置obj-m
变量,利用kbuild进行模块的编译
2.3 KERNELEIR
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
为了获得系统源代码树,利用了系统已安装模块中的软连接build来指向kernel build tree。
如果要使用的内核版本不是系统中正在使用的内核,可以通过再命令行中重设KERNELEIR
变量或者修改Makefile中的值来更改内核源文件的目录。
3 参考文献
Linux Device Driver 3
来源:CSDN
作者:w4c4dwsz
链接:https://blog.csdn.net/w4c4dwsz/article/details/104575269