您的位置首页>企业动态>

用linux内核驱动模块开发makefile

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解用linux内核驱动模块开发makefile问题。以下是从网络上一个经典的linux设备驱动程序

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解用linux内核驱动模块开发makefile问题。

以下是从网络上一个经典的linux设备驱动程序中提取的Makefile文件,以及对其内容的详细解释。这个文件可以完成大部分驱动的编译,使用时只需要稍加修改。

$(警告KERNELLEASE=$(KERNELLEASE))if eq($(KERNELLEASE),)KERNELDIR?=/lib/modules/$(shell uname-r)/build pwd :=$(shell pwd)MYMOD :=hellomomodules : $(MAKE)-C $(KERNELDIR)M=$(PWD)modules lean : RM-RF *。o *~核心。靠。*.cmd *。ko *.mod.c .tmp _ versions Module * modules * phony : modules modules _ install clean else obj-m :=$(MYMOD)。oendif

一个

2

10

11

12

13

14

15

16

17

18

19

让我们依次介绍makefile中每行语句的功能,如下所示:

1.变量定义。首先,如果在模块的源代码目录中执行make,此时宏KERNELRELEASE是未定义的,因此将执行ifeq的以下内容,并分别为以下变量赋值:

内核:这个变量用来存储内核源代码的路径。在Makefile中,我们可以看到有两个内核源码,一个用来存储标准内核源码的路径,另一个用来存储当前正在运行的ubuntu系统的内核源码的路径。如果您的驱动程序想要在开发板上运行,那么Makefile中的KERNELDIR应该选择标准的内核源代码路径。如果你的驱动只想要在你的ubuntu上测试,那么选择当前运行的ubuntu系统的内核源码路径。

PWD:这个变量用来存储你当前驱动源代码所在的路径。

MYMOD:这个变量用来保存你的模块名。编译时,你会寻找$(MYMOD)。c进行编译,最终得到一个$(MYMOD)。ko将被生成,所以你需要修改这个MYMOD来编译你自己的模块。

2.编译规则。因为make后面没有目标,make将执行Makefile中不以“.”开头的第一个目标作为默认目标。所以“模块”成了make的目标。也就是说,执行以下规则:

$(MAKE) -C$(KERNELDIR) M=$(PWD)模块

这个规则展开后,就是:

makeC/home/Linux/Linux x 3.14/M=/home/Linux/test/modules

其中包括:

-C表示在存储内核的目录中执行它的Makefile。在执行过程中,将定义内核释放。内核版本在内核顶部的makefile的第396行:

KERNELRELEASE=$(shell cat include/config/kernel . release 2/dev/null)

2代表错误重定向。当出现错误信息时(猫够不到),不会打印在终端上。相反,它将被重定向到一个空文件(黑洞,不可见)。如果没有错误(cat to message -3.14.0),它将被分配给KERNELRELEASE,并且不会被重定向。

“M=”选项的作用是,当用户需要编译基于某个内核的外部模块时,需要在make modules命令中添加“M=dir”,程序会自动在你指定的dir目录中查找模块源代码,进行编译并生成KO文件。

执行此规则时,Makefile将执行else分支,obj-m=hello.o .执行此规则时,hello.c将编译为hello.o,最后编译为hello.ko模块。电话这是一个特殊的目标名称。的具体含义。冒牌货的目标是,如果有文件比如:模块、modules_install、clean等。在Makefile的工作目录中,命令会出错,这是防止这个错误的方法。

3.最后,将改进后的makefile的源代码粘贴到我自己的项目中,以供参考:

KERNEL _ DIR=$(TOP _ DIR)/platform/kernelDRVNAME=mydrv _ gpioPWD=$(shell pwd)obj-m=$(DRVNAME)。o $(DRVNAME)-objs :=$(DRVNAME). obuild : @ echo $(KERNEL _ DIR)$(MAKE)-C $(KERNEL _ DIR)M=$(PWD)install : build CP $(DRVNAME)。ko $(COM _ INSTALL _ YXAON _ DIR)/user/YXKOclean : @ RM-RF *。o *。柯。*.cmd *.mod.c *。订单*。西蒙弗斯。tmp_versions *~

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。