linux内核模块Makefile的解析
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添加最简单的Linux内核模块
1添加最简单的Linux内核模块 一.实验目的 1 熟练掌握基本的Linux内核模块开发框架和编译方法. 2 熟练掌握Linux内核模块添加流程. 3 理解Linux内核模块代码中的一些常见宏和参数. ...
- 调试linux内核模块
1:前言: 最近几天学习Linux-2.6平台上的设备驱动,所以要建立内核及内核模块的调试平台.虽然网上有很多相关教程,但多是基于2.6.26以前的通过补丁安装的,过程非常复杂,而且问题比较多.lin ...
- Linux内核模块编程系列1-极简内核模块编写
1.准备工作 使用如下命令查看自己Linux的内核版本 uname -a 结果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88 ...
- Linux内核模块简介
一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...
- Linux内核模块学习笔记(转载)
Linux内核模块 Linux设备驱动会以内核模块的形式出现,因此学会编写Linux内核模块编程是学习linux设备驱动的先决条件. 1.1linux内核模块简介 Linux内核的整体结构非常庞 ...
- 编写Linux内核模块——第一部分:前言
[编者的话]Linux内核模块作为Linux内核的扩展手段,可以在运行时动态加载和卸载.它是设备和用户应用程序之间的桥梁,可以通过标准系统调用,为应用程序屏蔽设备细节.本文来自Derek Molloy ...
- linux下makefile
概述 -- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都 为你做了这个工作,但我觉得要作一个好的和 professional的程序员,mak ...
- 编写函数实现员工信息录入和输出_编写我的第一个Linux 内核模块“hello_module”...
前言: Linux 内 核 模 块 全 称 为 " 动 态 可 加 载 内 核 模 块 (Loadable Kernel Module,LKM)",是系统内核向外部提供的功能插口. ...
- Linux内核模块的概念和基本的编程方法
Linux内核模块的概念和基本的编程方法 标签: Linux内核模块 2013-06-14 18:29 1864人阅读 评论(0) 收藏 举报 分类: linux内核(34) 版权声明:本文为博主原创 ...
最新文章
- 《2022城市大脑建设标准研究报告》在京正式发布
- java accept charset_springmvc中post请求中文乱码问题
- 执行appium程序时遇到如下报错,ImportError: cannot import name 'InvalidArgumentException',...
- TCP 三次握手 和 四次挥手
- Android 捕获异常,上报异常日志,捕获奔溃日志,bugly使用实例
- dijkstra算法matlab程序_Dijkstra算法例子
- win7文件和文件夹可以重名吗_Win7下如何重命名,替换System32文件夹下的系统文件...
- 类Shiro权限校验框架的设计和实现(2)--对复杂权限表达式的支持
- php推荐位调用,推荐位数据循环调用
- 使用Idea进行Junit单元测试
- 简单循迹小车实验心得_智能小车实验报告
- 安装完永中office2009不能正常启动
- 大学生html电影网页设计作业成品 我喜欢的电影榜单题材网页制作代码 简单静态网页模板下载
- WebService实例
- 专家建议将“元宇宙”更名为“元网络”或“灵境网络” 回归本质 规范发展
- code==200是什么意思
- 为什么巡检在工业生产中如此重要?
- python利用ffmpeg进行rtmp推流直播
- 主从复制:主从复制的概述、一主一从架构搭建主从复制的原理、同步数据一致性问题
- kubernetes 节点维护 cordon, drain, uncordon
热门文章
- 51单片机的几种精确延时
- 2021 增强式学习RL 李宏毅
- C语言使用结构体给另一个同类型结构体赋值
- [精品教程,新老鸟必读]:极限装机、优化全攻略(新手优化教程)
- 中国移动NBIOT卡的几种APN应用场景
- android操作系统偷流量,运营商在“偷流量”?用实验告诉你真相!
- java五个数以升序排列,java4个数的数组排列
- 网站采集器,网站采集工具(图文教程)
- 怎么把做好的ps保存成图片_PS保存图片提示“无法完成请求”,这里有4种解决方法...
- 达芬奇密码 第八十二章