内核模块的编译方法

内核源码树:指导是内核源代码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