KERNELRELEASE
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/study/prog/mod/hello/下的Makefile。第二次执行时是执行/usr/src/linux/下的Makefile时.
但是还是有不少令人困惑的问题:1.这个KERNELRELEASE也很令人困惑,它是什么呢?在/home/study/prog/mod/hello/Makefile中是没有定义这个变量的,所以起作用的是else…endif这一段。不过,如果把hello模块移动到内核源代码中。例如放到/usr/src/linux/driver/中, KERNELRELEASE就有定义了。在/usr/src/linux/Makefile中有 162KERNELRELEASE=$(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 863modules: $(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。
KERNELRELEASE相关推荐
- 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计
实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...
- 容器环境红队手法总结
引言 随着云原生的火热,容器及容器编排平台的安全也受到了行业关注,Gartner在近期发布的<Kubernetes安全防护指导框架>中给出Kubernetes安全的8个攻击面,总结如下: ...
- linux单体内核,加载Linux单体内核的笔记
"Hello world"是一个示例模块(module),文件名是hello.c: #include #include MODULE_LICENSE("Dual BSD/ ...
- 一个简单的内核模块实现和使用
一个简单的内核模块包括3个要素 1.MODULE_LICENSE("Dual BSD/GPL"); //模块许可声明 2.module_init(s5pv210_led_init ...
- Linux命令之uname
uname 功能说明: uname用来获取电脑和操作系统的相关信息. 语 法: uname[-amnrsvpio][--help][--version] 补充说明: uname可显示linux主机所用 ...
- linux内核配置系统浅析(转)
随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...
- linux内核采取,采用动态加载模块的方式Linux内核编译
Linux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活方便.那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手.以下是一个简单的hello内核模块的Makefi ...
- linux内核kconfig objs,linux内核中Kconfig和Makefile 详解
内核源码树的目录下都有两个文档 Kconfig (2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录 ...
- # 2017-2018-1 20155224 《信息安全系系统设计基础》实验四
2017-2018-1 20155224 <信息安全系系统设计基础>实验四 外设驱动程序设计-1 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf&qu ...
最新文章
- 第七周项目一-一般函数(2)
- MaperReduce实验
- comp 313 schemas的学习
- CTF EasyStrcmp
- 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS
- php 失去 焦点 另一个表单猎取值,同一表单如何根据某一个文本框的值 改变另一个文本框的值...
- Spring Cloud微服务之Nacos服务注册(九)
- Windows 7中配置IPv6需要注意的那点事
- 《树莓派Python编程入门与实战(第2版)》——1.9 QA
- 网上出售企业支付宝骗局,不看后悔
- 综合素质计算机的知识考点,综合素质考点知识
- 定义一个矩形类Rectangle:(知识点:对象的创建和使用)
- static变量和普通变量的区别
- 在matlab中生成m序列
- 正则表达式(韩顺平讲解)
- python matplotlib 地图_Python数据可视化,看这篇就够了
- 中国塑料土工格栅行业市场供需与战略研究报告
- 三菱plc232数据线驱动下载_西门子PLC与三菱PLC专业横评,选型不再纠结
- 数据结构面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
- 使用Servlet3.0上传图片,无法使用part.getSubmittedFileName()方法解决
热门文章
- endnote咋手动输入文献_endnote如何导入参考文献?如何手动导入EndNote
- 什么叫预判_什么才是真正的用户画像?
- oracle导出字符集命令,Oracle数据的导出及导入实现
- c语言大作业菜单,C语言大作业:编写菜单控制猜商品价格程序
- oracle查找异常中断的sqlid方法,Oracle查找锁定对象以及强制解除锁定的方法
- js svg语音波动动画_让动效更酷炫!4 个常见且常用的 SVG 交互动画方法
- PDF下载!《Python十大基础专题》《247个Python综合案例》《Pandas 20页学习笔记》...
- zenmap nmap输出无显示_液晶显示器高压板坏的现象及维修思路 。
- pppoe错误代码 linux,PPPOE常见故障代码及分析
- linux系统中使用oracle透明网关连接db2数据库,Linux系统中使用Oracle透明网关连接DB2数据库...