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相关推荐

  1. 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计

    实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...

  2. 容器环境红队手法总结

    引言 随着云原生的火热,容器及容器编排平台的安全也受到了行业关注,Gartner在近期发布的<Kubernetes安全防护指导框架>中给出Kubernetes安全的8个攻击面,总结如下: ...

  3. linux单体内核,加载Linux单体内核的笔记

    "Hello world"是一个示例模块(module),文件名是hello.c: #include #include MODULE_LICENSE("Dual BSD/ ...

  4. 一个简单的内核模块实现和使用

    一个简单的内核模块包括3个要素 1.MODULE_LICENSE("Dual BSD/GPL");  //模块许可声明 2.module_init(s5pv210_led_init ...

  5. Linux命令之uname

    uname 功能说明: uname用来获取电脑和操作系统的相关信息. 语 法: uname[-amnrsvpio][--help][--version] 补充说明: uname可显示linux主机所用 ...

  6. linux内核配置系统浅析(转)

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...

  7. linux内核采取,采用动态加载模块的方式Linux内核编译

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

  8. linux内核kconfig objs,linux内核中Kconfig和Makefile 详解

    内核源码树的目录下都有两个文档 Kconfig (2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录 ...

  9. # 2017-2018-1 20155224 《信息安全系系统设计基础》实验四

    2017-2018-1 20155224 <信息安全系系统设计基础>实验四 外设驱动程序设计-1 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf&qu ...

最新文章

  1. 第七周项目一-一般函数(2)
  2. MaperReduce实验
  3. comp 313 schemas的学习
  4. CTF EasyStrcmp
  5. 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS
  6. php 失去 焦点 另一个表单猎取值,同一表单如何根据某一个文本框的值 改变另一个文本框的值...
  7. Spring Cloud微服务之Nacos服务注册(九)
  8. Windows 7中配置IPv6需要注意的那点事
  9. 《树莓派Python编程入门与实战(第2版)》——1.9 QA
  10. 网上出售企业支付宝骗局,不看后悔
  11. 综合素质计算机的知识考点,综合素质考点知识
  12. 定义一个矩形类Rectangle:(知识点:对象的创建和使用)
  13. static变量和普通变量的区别
  14. 在matlab中生成m序列
  15. 正则表达式(韩顺平讲解)
  16. python matplotlib 地图_Python数据可视化,看这篇就够了
  17. 中国塑料土工格栅行业市场供需与战略研究报告
  18. 三菱plc232数据线驱动下载_西门子PLC与三菱PLC专业横评,选型不再纠结
  19. 数据结构面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
  20. 使用Servlet3.0上传图片,无法使用part.getSubmittedFileName()方法解决

热门文章

  1. endnote咋手动输入文献_endnote如何导入参考文献?如何手动导入EndNote
  2. 什么叫预判_什么才是真正的用户画像?
  3. oracle导出字符集命令,Oracle数据的导出及导入实现
  4. c语言大作业菜单,C语言大作业:编写菜单控制猜商品价格程序
  5. oracle查找异常中断的sqlid方法,Oracle查找锁定对象以及强制解除锁定的方法
  6. js svg语音波动动画_让动效更酷炫!4 个常见且常用的 SVG 交互动画方法
  7. PDF下载!《Python十大基础专题》《247个Python综合案例》《Pandas 20页学习笔记》...
  8. zenmap nmap输出无显示_液晶显示器高压板坏的现象及维修思路 。
  9. pppoe错误代码 linux,PPPOE常见故障代码及分析
  10. linux系统中使用oracle透明网关连接db2数据库,Linux系统中使用Oracle透明网关连接DB2数据库...