linux驱动开荒内核模块编译之Makefile入门教程,驱动开辟makefile

linux驱动开垦内核模块编写翻译之Makefile入门教程,驱动开采makefile

一、模块的编写翻译

作者们在日前内核编写翻译中驱动移植这块,讲到驱动编写翻译分为静态编写翻译动态编写翻译;静态编写翻译即为将使得直接编写翻译进基本,动态编写翻译即为将使得编译成模块。

而动态编写翻译又分为二种:

a — 内部编译

在根本源码目录内编写翻译

b — 外界编写翻译

在根本源码的目录外编写翻译

二、具体编译进程剖析

注:本次编译是外部编写翻译,使用的基础源码是Ubuntu
的源代码,而非开荒板所用linux 3.14内核源码,运营平台为X86。

对此叁个常见的linux设备驱动模块,以下是三个精华的makefile代码,使用上边那个makefile能够做到半数以上使得的编写翻译,使用时只必要修改一下要编写翻译生成的驱动名称就可以。只需修改obj-m的值。

ifneq($(KERNELRELEASE),)

obj-m:=hello.o

else

KDIR:=/lib/modules/$(shelluname-r)/build

PWD:=$(shellpwd)

all:

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

clean:

rm-f*.ko*.o*.symvers*.cmd*.cmd.o

endif

1、makefile 中的变量

先说明以下makefile中有些变量意义:

(1)KERNELRELEASE 在linux内核源代码中的顶层makefile中有定义

(2)shell pwd 取妥贴前专门的学业路线

(3)shell uname -r 取妥帖前基本的本子号

(4)KDIR 当前基础的源代码目录。

关于linux源码的目录有多个,分别为

“/lib/modules/$(shell uname -r)/build”

“/usr/src/linux-header-$(shell uname -r)/”

但即便编写翻译过基础就能够分晓,usr目录下相当源代码一般是我们温馨下载后解压的,而lib目录下的则是在编写翻译时自动copy过去的,两个的公文结构完全等同,因而一时也将基本源码目录设置成/usr/src/linux-header-$(shell
uname -r)/。关于基本源码目录能够依附自身的贮存地点张开改换。

(5)make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules

那就是编写翻译模块了:

a —
首先转移目录到-C选项钦点的职位(即内核源代码目录),在那之中保存有基本的顶层makefile;

b –
M=选项让该makefile在结构modules指标此前再次来到到模块源代码目录
;然后,modueles指标指向obj-m变量中设定的模块;在上头的例证中,我们将该变量设置成了hello.o。

2、make 的的实践步骤

a — 第二次跻身的时候,宏“KE途乐NELRELEASE”未定义,由此步向 else;

b — 记录内核路线,记录当前路径;

鉴于make
后边未有对象,所以make会在Makefile中的第贰个不是以.起初的靶子作为暗中认可的对象施行。暗中同意推行all这么些法规

c — make -C $(KDIR) M=$(PWD) modules

-C 步向到根本的目录施行Makefile
,在实践的时候KE传祺NELRELEASE就能被赋值,M=$(PWD)表示回去当前目录,再一次实行makefile
,modules
编写翻译成模块的情致

就此那边其实运转的是

make -C /lib/modules/2.6.13-study/build M=/home/fs/code/1/module/hello/
modules

d —
再一次执行该makefile
,KELANDNELRELEASE就有值了,就可以试行obj-m:=hello.o

obj-m:表示把hello.o
和其他的对象文件链接成hello.ko模块文件,编写翻译的时候还要先把hello.c编写翻译成hello.o文件

能够看来make在这里一同调用了3次

1)– make

2)– linux内核源码树的顶层makedile调用,发生。o文件

3)– linux内核源码树makefile调用,把.o文件链接成ko文件

3、编写翻译多文本

若有三个源文件,则运用如下方法:

obj-m := hello.o

hello-objs := file1.o file2.o file3.o

三、内部编写翻译简单表明

若是把hello模块移动到内核源代码中。举例放到/usr/src/linux/driver/中,
KE安德拉NELRELEASE就有定义了。

在/usr/src/linux/Makefile中有KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)。

那会儿,hello模块也不再是独立用make编写翻译,而是在基本中用make
modules实行编写翻译,此时驱动模块便和基本编写翻译在一同。

http://www.bkjia.com/Linuxjc/1303054.htmlwww.bkjia.comtruehttp://www.bkjia.com/Linuxjc/1303054.htmlTechArticlelinux驱动开发内核模块编译之Makefile入门教程,驱动开发makefile
一、模块的编写翻译 大家在眼前内核编写翻译中驱动移植那块,讲到驱动编写翻译分为
静…

转载:http://www.embeddedlinux.org.cn/html/yingjianqudong/201403/23-2820.html

 

Linux内核是一种单体内核,可是透过动态加载模块的章程,使它的开辟特别灵活
方便。那么,它是什么样编写翻译内核的吧?大家能够由此分析它的Makefile动手。以下是
三个大约的hello内核模块的Makefile. 

ifneq ($(KERNELRELEASE),)
    obj-m := hello.o
else
    KERNELDIR ?= /root/work/latest_codes/linux-stable
    PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
    @rm -rf *.o *.mod.c *.mod.o *.ko *.order *.symvers .*.cmd .tmp_versions
endif

当大家写完贰个hello模块,只要使用上述的makefile。然后make一下就行。

假设大家把hello模块的源代码放在/home/study/prog/mod/hello/下。

当大家在这么些目录运转make时,make是怎么实践的吗?

 LDD3次之章第4节“编译和装载”中只是简短地谈到该Makefile被执行了三遍,但是实际经过是何许的吧?

首 先,由于make
前边未有目的,所以make会在Makefile中的第三个不是以.起初的对象作为暗许的目的举行。于是default成为make的靶子。make会实践  $(MAKE) -C $(KEXC60NELDIENVISION) M=$(PWD)
modules  shell是make内部的函数,

一经当前基本版本是2.6.13-study,所以 $(shell uname
-r) 的结果是 2.6.13-study 这里,实际运作的是 
 make -C
/lib/modules/2.6.13-study/build
M=/home/study/prog/mod/hello/ modules 
/lib
/modules/2.6.13-study/build是贰个针对内核源代码/usr/src/linux的号子链接。

看得出,make实行了一遍。

先是次实行时是读hello模块的源代码所在目录/home/s
tudy/prog/mod/hello/下的Makefile。

第贰次推行时是实践/usr/src/linux/下的Makefile时. 
可是依然有数不完令人困惑的标题:
1.这几个KECRUISERNELRELEASE也很令人狐疑,它是怎么样呢?在/home/study/prog/mod/he
llo/Makefile中是不曾概念这么些变量的,所以起功能的是else…endif这一段。

  
但是,要是把hello模块移动到内核源代码中。比如放到/usr/src/linux/driver/中,
KE库罗德NELRELEASE就有定义了。在/usr/src/linux/Makefile中有 162  KE瑞虎NELRELEASE=$(VE奥迪Q5SION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVELacrosseSION)$(LOCALVE兰德EnclaveSION) 
那时候,hello模块也不再是独自用make编写翻译,而是在根本中用make modules进行编写翻译。用这种艺术,该Makefile在单身编译和当作根本一部分编写翻译时都能健康干活。

 
2.那几个obj-m :=
hello.o曾几何时会实践到啊? 在实行: 
make -C /lib/modules/2.6.13-study/build
M=/home/study/prog/mod/hello/ modules
时,make
去/usr/src/linux/Makefile中追寻指标modules:

862 .PHONY: modules

863 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)

864 @echo ' Building modules, stage 2.';

865 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost

能够见见,分五个stage:

1.编译出hello.o文件。

2.生成hello.mod.o hello.ko

在那进程中,会调用 make -f
scripts/Makefile.build

obj=/home/study/prog/mod/hello

而 在
scripts/Makefile.build会包括众多文件:  011 -include .config 012 013 include $(if $(wildcard $(obj)/Kbuild),
$(obj)/Kbuild, $(obj)/Makefile)
 在那之中就有/home/study/prog/mod/hello/Makefile 这时
KE奥迪Q7NELRELEASE已经存在。

就此实行的是: obj-m:=hello.o 
关于make
modules的更详尽的历程能够在scripts/Makefile.modpost文件的笺注
中找到。假若想查看make的全部推行进程,

能够运维make -n。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图