内核模块编译--Makefile写法

来源:互联网 发布:vnr翻译软件 编辑:程序博客网 时间:2024/05/16 07:10

内核模块编译-Makefile写法

如果编译内核模块,可以编写Makefile,然后执行make命令即可。

Linux2.6的Makefile模板如下:

#Makefile2.6

ifneq  ($(KERNELRELEASE),)

#kbuild syntax.  dependency relationship of  files and target modules are listed here.

mymodule-objs := file1.o  file2.o

obj-m := mymodule.o

else

PWD := $(shell pwd)

KVER := &(shell uname -r)

KDIR := /lib/modules/$(KVER)/build

all:

        $(MAKE)   -C  $(KDIR)  M=$(PWD)

clean:

         rm -rf   *.*.cmd  *.o  *.mod.c *.ko .tmp_versions

endif


注意:

1.ifneq 后面有空格。

2.命令前面必须使用tab键,如&(MAKE)和rm 的前面。

3.Makefile必须和相应的.c文件放在同一个目录下。


代码解释:

(1) ifneq  ($(KERNELRELEASE),)

KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,当第一次执行这个Makefile时,KERNELRELEASE没有被定义,所以会执行else后面的内容。

(2)PWD=$(shellpwd)

可以把shell脚本写到Makefile里面,这句话的意思:执行shell脚本命令pwdpwd是显示当前目录的路径),把返回值赋给PWD这个变量,所以PWD存的就是当前目录的路径。

(3)KVER:=$(shell uname -r)

执行shell脚本命令:uname-r,这个命令的作用是显示当前内核版本(kernelreleaes),所以变量KVER的内容是当前系统kernelrelease.

(4)KDIR:=/lib/modules/$(KVER)/buildDIR指定了内核源码的路径.

(5)all:

        $(MAKE) -C $(KDIR)  M=$(PWD)  #前面必须是tab。

这里all只是个标号,可以自己定义,是make的默认执行目标。

$(MAKE):MAKEMakefile中的宏变量,要引用宏变量要使用符号$。这里实际上就是指向make程序,所以这里也可以把$(MAKE)换成make.

-C:make命令的一个选项,-C作用是changedirectory. -C dir 就是转到dir目录。

M=$(PWD):返回当前目录。

这句话的意思是:当make执行默认的目标all时,-C$(KVDIR)指明跳转到内核源码目录下去执行那里的Makefile,M=$(PWD)表示又返回到当前目录来执行当前的Makefile.

(6)当从内核源码目录返回时,再次执行这个Makefile时,KERNELRELEASE已经被定义过,这次 ifneq  ($(KERNELRELEASE),)条件判断成立,就会执行后面的内容。ifneq之后else之前的内容为kbuild语法的语句,指明模块源码中各模块间的依赖关系,以及要生成的模块的名称。

(7)mymodule_objs:=file1.ofile2.o

表明mymodule.ofile1.file2.o链接生成

(8)obj-m:=mymodule.o

编译链接后要生成mymodule.o模块。obj-m表示以模块编译,obj-y表示编译并链接进内核.

注:如果模块就由一个文件编译而成,可写为:obj-m:=mymodule.o。(必须与mymodule.c名字对应,都是mymodule。上面的file1.ofile2.o也如此)


(9)clean:

       rm -rf   *.*.cmd  *.o  *.mod.c *.ko .tmp_versions

在命令行中输入:make,只会执行(1)到(8)的指令,不会执行clean标号之后的指令。要想执行clean标号后面的指令,需要在命令行中输入:makeclean

rm 就是删除后面这些由make生成的文件。一般如果需要重新执行make编译之前,使用make clean先清理上次生成的文件。

如果想删除make生成的所有文件,也可以使用下面方式:

clean:

      $(MAKE) -C $(KDIR) M=$(PWD)clean

或者

clean:

     make-C $(KDIR) M=$(PWD)clean



一个简单的Makefile例子(为《内核模块程序机构》中hello.c编写的)

//Makfile

ifneq ($(KERNELRELEASE),)

#kbuildsyntax. dependency relationshsip of files and target modules arelisted here.

#mymodule-objs:= file1.o file2.o

obj-m:= hello.o

else

PWD := $(shell pwd)

KVER:= $(shell uname -r)

KDIR:= /lib/modules/$(KVER)/build

all:

       $(MAKE)-C $(KDIR) M=$(PWD)

clean:

       $(MAKE)-C $(KDIR) M=$(PWD) clean

endif