LDD3中Makefile浅析

新手,刚开始学linux下的驱动开发。前期看了本robert love《linux kernel development》,很多问题都没有深究。

在学习ldd3时,遇到的第一个问题是编译自己的内核,这个花费了一些工夫后终于搞定。

遇到的第二个问题就是这本书的第二章《构造和运行模块》中的Makefile的问题。

现在初步有了自己的理解,记录下来,供以后温故知新,也方便有我相同疑问的朋友参考。

如有错误之处,请大家指出,共同进步,谢谢。

 

我的开发环境是fedora 13OS,自己下了2.6.35的Kernel源代码树,从新编译,安装了系统。

具体GNU工具的版本就不说了,都是fedora 13自带的。看懂本文,可能需要有一点点makefile基础,我也不是很精通:)

 

首先,将Makefile粘帖出来:

 

 

首先解释下makefile中的几点:

$(MAKE)--是指make。在内核树的主makefile中,可以找到这个变量。

$(KERNELRELEASE)--KERNELRELEASE也是一个变量,可以在内核树的主makefile中找到。

$(MAKE) -C $(KERNELDIR)  --KERNELDIR在前面定义了,是指内核树的根目录。-C选项的作用是将当前的工作目录转移到你所指定的目录,我们这里指定为内核树的根目录,/lib/modules/$(shell uname -r)/build指向的就是内核树的根目录,build是个软链接。 uname -r是shell命令,显示当前的内核版本号,我的是2.6.35.

M=$(PWD)--M=选项让该makefile在构造modules目标之前,返回到当前目录。一般这个makefile和驱动模块的代码在一起,就是返回到驱动模块代码所在的目录。“M=” 选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir” ,程序会自动到你所指定的dir 目录中查找模块源码,将其编译,生成KO 文件。

modules--目标指向obj-m变量中设定的模块。如果有多个源文件,obj-m := hello.o需要改一下,改如下:

 

 

 

接下来重点描述下我对makefile流程的理解,其实这个才是我最花工夫的地方。

 

首先要搞明白一点,我的驱动代码和这个makefile并不一定在内核树根目录下,实际上,我是在/home/xxx/src/下的。在shell里,也是在这个目录下执行的make命令。

 

执行make

首先检查KERNERRELEASE变量,发现没有定义,所以,走else,接下来定义了两个变量KERNELDIR和PWD。

然后会走进default.

 

注意: 此时会因为 -C $(KERNELDIR)进入内核树根目录,执行内核树根目录下的主makefile,这个makefile中有我们前面提到的两个变量的声明,KERNELRELEASE和MAKE。内核树里的主makefile会根据M=选项,执行M=选项指向的目录处的驱动代码的makefile。其实这是第二次读这个makefile了。

然后根据M=选项指向的模块目录,再执行驱动代码位置的makefile,也就是前面粘帖下来的makefile。你可能会有疑问,那这个makefile不是被读了两遍了吗?是的。就是读了两遍,但是两遍结果并不相同。因为第二遍的时候,KERNELRELEASE 和MAKE变量有了定义。于是走了ifndef分支,obj-m有了定义,此时才真正的编译内核模块。编译完模块,会离开内核树的目录,回到M=选项指向的目录。

 

一个标准的模块编译过程,makefile是要被读两次的。

 

采用这种makefile的好处是,既可以将驱动模块放在内核树里面编译(/usr/src/linux/driver/),也可以将驱动模块放在内核树外面,都可以编译通过.

 

使用命令: make -n可以查看详细的执行过程.

 

参考:

1.LDD3

2.http://www.embedu.org/Column/Column310.htm

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值