Linux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活 方便。那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手。以下是 一个简单的hello内核模块的Makefile.

ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:$(MAKE) -C $(KERNELDIR)  M=$(PWD) modules
clean:rm -rf *.o *.mod.c *.mod.o *.ko
endif

当我们写完一个hello模块,只要使用以上的makefile。然后make一下就行。

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

当我们在这个目录运行make时,make是怎么执行的呢?

LDD3第二章第四节“编译和装载”中只是简略地说到该Makefile被执行了两次,但是具体过程是如何的呢?

首先,由于make 后面没有目标,所以make会在Makefile中的第一个不是以.开头的目标作为默认的目标执行。于是default成为make的目标。make会执行 $(MAKE) -C $(KERNELDIR) 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.这个KERNELRELEASE也很令人困惑,它是什么呢?在/home/study/prog/mod/he llo/Makefile中是没有定义这个变量的,所以起作用的是else…endif这一段。

不过,如果把hello模块移动到内核源代码中。例如放到/usr/src/linux/driver/中, KERNELRELEASE就有定义了。在/usr/src/linux/Makefile中有 162 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION) 这时候,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 这时 KERNELRELEASE已经存在。

所以执行的是: obj-m:=hello.o 
关于make modules的更详细的过程可以在scripts/Makefile.modpost文件的注释 中找到。如果想查看make的整个执行过程,

可以运行make -n。

转载于:https://www.cnblogs.com/Cysan/p/4384158.html

linux内核模块Makefile的解析相关推荐

  1. 1添加最简单的Linux内核模块

    1添加最简单的Linux内核模块 一.实验目的 1 熟练掌握基本的Linux内核模块开发框架和编译方法. 2 熟练掌握Linux内核模块添加流程. 3 理解Linux内核模块代码中的一些常见宏和参数. ...

  2. 调试linux内核模块

    1:前言: 最近几天学习Linux-2.6平台上的设备驱动,所以要建立内核及内核模块的调试平台.虽然网上有很多相关教程,但多是基于2.6.26以前的通过补丁安装的,过程非常复杂,而且问题比较多.lin ...

  3. Linux内核模块编程系列1-极简内核模块编写

    1.准备工作 使用如下命令查看自己Linux的内核版本 uname -a 结果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88 ...

  4. Linux内核模块简介

    一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...

  5. Linux内核模块学习笔记(转载)

    Linux内核模块    Linux设备驱动会以内核模块的形式出现,因此学会编写Linux内核模块编程是学习linux设备驱动的先决条件. 1.1linux内核模块简介 Linux内核的整体结构非常庞 ...

  6. 编写Linux内核模块——第一部分:前言

    [编者的话]Linux内核模块作为Linux内核的扩展手段,可以在运行时动态加载和卸载.它是设备和用户应用程序之间的桥梁,可以通过标准系统调用,为应用程序屏蔽设备细节.本文来自Derek Molloy ...

  7. linux下makefile

    概述 -- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都 为你做了这个工作,但我觉得要作一个好的和 professional的程序员,mak ...

  8. 编写函数实现员工信息录入和输出_编写我的第一个Linux 内核模块“hello_module”...

    前言: Linux 内 核 模 块 全 称 为 " 动 态 可 加 载 内 核 模 块 (Loadable Kernel Module,LKM)",是系统内核向外部提供的功能插口. ...

  9. Linux内核模块的概念和基本的编程方法

    Linux内核模块的概念和基本的编程方法 标签: Linux内核模块 2013-06-14 18:29 1864人阅读 评论(0) 收藏 举报 分类: linux内核(34) 版权声明:本文为博主原创 ...

最新文章

  1. 《2022城市大脑建设标准研究报告》在京正式发布
  2. java accept charset_springmvc中post请求中文乱码问题
  3. 执行appium程序时遇到如下报错,ImportError: cannot import name 'InvalidArgumentException',...
  4. TCP 三次握手 和 四次挥手
  5. Android 捕获异常,上报异常日志,捕获奔溃日志,bugly使用实例
  6. dijkstra算法matlab程序_Dijkstra算法例子
  7. win7文件和文件夹可以重名吗_Win7下如何重命名,替换System32文件夹下的系统文件...
  8. 类Shiro权限校验框架的设计和实现(2)--对复杂权限表达式的支持
  9. php推荐位调用,推荐位数据循环调用
  10. 使用Idea进行Junit单元测试
  11. 简单循迹小车实验心得_智能小车实验报告
  12. 安装完永中office2009不能正常启动
  13. 大学生html电影网页设计作业成品 我喜欢的电影榜单题材网页制作代码 简单静态网页模板下载
  14. WebService实例
  15. 专家建议将“元宇宙”更名为“元网络”或“灵境网络” 回归本质 规范发展
  16. code==200是什么意思
  17. 为什么巡检在工业生产中如此重要?
  18. python利用ffmpeg进行rtmp推流直播
  19. 主从复制:主从复制的概述、一主一从架构搭建主从复制的原理、同步数据一致性问题
  20. kubernetes 节点维护 cordon, drain, uncordon

热门文章

  1. 51单片机的几种精确延时
  2. 2021 增强式学习RL 李宏毅
  3. C语言使用结构体给另一个同类型结构体赋值
  4. [精品教程,新老鸟必读]:极限装机、优化全攻略(新手优化教程)
  5. 中国移动NBIOT卡的几种APN应用场景
  6. android操作系统偷流量,运营商在“偷流量”?用实验告诉你真相!
  7. java五个数以升序排列,java4个数的数组排列
  8. 网站采集器,网站采集工具(图文教程)
  9. 怎么把做好的ps保存成图片_PS保存图片提示“无法完成请求”,这里有4种解决方法...
  10. 达芬奇密码 第八十二章