内核模块的编译方法
内核源码树:指导是内核源代码tar包解压缩后形成的目录(包含其下级所有目录和文件)。
已编译内核源码树:指的是已经成功生成过内核的源码树(已经成功执行过make 的内核源码树)
注:驱动大多都编译为模块,2.6内核中想要编译成模块,必须存在已编译内核源码树,且该源码树编译出来的内核就是该模块即将要运行在其上的内核。
编译方法一
步骤1 、编写Makefile:
obj-m := hello.o
步骤2、编译命令(在终端中输入):
make –C 内核源码树目录 M=`pwd`
eg.
Compute$make –C /work/sysbuild/linux-2.6.22.6/
对于该make命令的解释:
由于目前不处于内核源码树的顶层目录,并且当前目录下的Makefile也没有modules目标,应此使用-C参数来告知make程序需要在执行之前切换到/work/sysbuild/linux-2.6.22.6/ 目录。
此外,由于模块的源代码在当前目录中,不在内核源码中,应此需要使用M变量该变量是内核构造系统的变量)告知内核构造系统,编译模具爱所需要的源代码以及Makefile在当前目录(/work/sysbuild/linux-2.6.22.6/)中来找,而且最终生成模块.ko文件也要放在当前目录中。
编译方法二
步骤1、编写makefile如下:
If ( $ (KERNELREASE), )
KERNELDIR ?=
PWD := $( shell
Modules :
(MAKE) -C (KERNELDIR)M = (PWD)modules
else
obj-m :=
end if
步骤2、编译命令make
对该makefile的解释
当make时,由于变量KERNELRELEASE尚未赋值,所以if的判断为真,于是变脸KERNELDIR被赋值为内核源码树的目录,
PWD被赋值为当前目录,
执行找到的第一个目标modules,
执行目标编译命令,当该命令执行调用内核构造系统系统的时候,内核构造系统会为变量KERNELREASE赋值,从而它不再为空,从而当前目录下的makefile就变成了只有一行 obj-m := hello.o ,
最后将得到编译好的模块hello.ko 。
老师的参考makefile:
Ifneq ($(KERNELRELEASE),)
Obj-m := hello.o
Else
KDIR := /mini2440/linux-2.6.32.2
PWD := $(shell pwd)
all:
make –C $(KDIR) M= $(PWD) modules ARCH=arm
.PKONY:clean
Clean:
@rm –rf
endif