内核模块编译--Makefile写法
内核模块编译-Makefile写法如果编译内核模块,可以编写Makefile,然后执行make命令即可。Linux2.6的Makefile模板如下:#Makefile2.6ifneq($(KERNELRELEASE),)#kbuild syntax.dependency relationship offiles and target modules are listed he...
内核模块编译-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):MAKE是Makefile中的宏变量,要引用宏变量要使用符号。这里实际上就是指向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
版权声明:本文为博主原创文章,转载请附上博文链接!
更多推荐
所有评论(0)