内核模块编译-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脚本命令pwd(pwd是显示当前目录的路径),把返回值赋给PWD这个变量,所以PWD存的就是当前目录的路径。

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

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

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

(5)all:

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

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

( M A K E ) : M A K E 是 M a k e f i l e 中 的 宏 变 量 , 要 引 用 宏 变 量 要 使 用 符 号 (MAKE):MAKE是Makefile中的宏变量,要引用宏变量要使用符号 (MAKE):MAKEMakefile使。这里实际上就是指向make程序,所以这里也可以把$(MAKE)换成make.

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

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

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

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

(7)mymodule_objs:=file1.ofile2.o

表明mymodule.o由file1.和file2.o链接生成

(8)obj-m:=mymodule.o

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

注:如果模块就由一个文件编译而成,可写为: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

作者:Thinker_mhy
来源:CSDN
原文:https://blog.csdn.net/miaohongyu1/article/details/8877497
版权声明:本文为博主原创文章,转载请附上博文链接!

Logo

更多推荐