读Kernel感悟-kbuild系统-内核模块的编译

驱动模块Makefile解析  作者:王劲南,华清远见嵌入式学院讲师。先看一下代码ifeq ($(KERNELRELEASE),)        KERNELDIR ?= /home/linux/linux-2.6.22.6        PWD := $(shell pwd)        modules:                $(MAKE) -C $(KERNELDIR) M=$(PW 阅读详情

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中有

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。

由此可见,内核的Kbuild系统庞大而复杂。

更多内容参见:www.top-e.org

嵌入式系统/ARM技术中的kbuild系统-内核模块的编译 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:   立即下载

相关推荐

工业场景实战:基于YOLO与多格式标注的传送带异物检测数据集构建指南

本文详细介绍了基于YOLO与多格式标注的传送带异物检测数据集构建方法,涵盖数据采集、标注技巧(YOLO、COCO、VOC格式)、数据增强策略及实战案例。通过工业级解决方案,有效提升异物检测准确率与效率,适用于各类工业场景。

weixin_29168393的博客 463

Kbuild系统源码分析(四)—./scripts/Makefile.build

./scripts/Makefile.build是通过make -f 而不是在Makefile中include使用的,其本身就是一个make的起始脚本 ./scripts/Makefile.build在内核主要通过一个变量定义的方式使用,此变量定义在Kbuild.include中,所有include此文件的make脚本均可以使用此变量: ./scripts/Kbuild.include build := -f $(srctree)/scripts/Makefile.build obj 此脚...

ashimida 2439

STM32H750实战:如何用CubeMX配置NAND Flash时序(附常见问题排查)

本文详细解析了STM32H750通过CubeMX配置NAND Flash时序的实战技巧,包括硬件连接、时序参数计算与优化策略,以及常见问题如RGB屏幕干扰、多片选冲突的解决方案。特别针对NAND Flash的时序配置和抗干扰设计提供了实用代码示例和优化建议,帮助开发者提升系统稳定性和性能。

weixin_29176179的博客 363

kbuild系统-内核模块的编译

  Linux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活方便。那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手。以下是一个简单的hello内核模块的Makefile.     ifneq ($(KERNELRELEASE),)  obj-m:=hello.o  else  KERNELDIR:=/lib/modules/$(shell

ruixj的专栏 1248

STM32H7 FOC控制时序优化与PWM中点更新策略

在永磁同步电机(PMSM)的磁场定向控制(FOC)系统中,控制时序精度是决定电流环带宽、观测器收敛性与动态响应能力的基础要素。其核心在于理解PWM生成、ADC采样与控制计算三者之间的硬件级时间耦合关系——尤其在中心对齐模式下,标准更新机制引入的半周期延迟会破坏电压-电流瞬时映射,导致滑模观测器失配与高频相位滞后。通过将PWM更新事件绑定至重复计数器(RCR)清零点,可实现控制指令在开关周期中点生效,使等效电压矢量中心与计算时刻严格对齐。该策略显著提升系统确定性,为20 kHz以上高频电流环提供物理支撑,并广

flink9streamer的博客 857

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1716

Kbuild系统源码分析(二)—./Makefile

上接 <Kbuild系统源码分析(一)—./Makefile> 5.对非xxx_config目标的编译5.1:设置./Makefile的默认目标 ./Makefile的开头可知,其默认的编译目标是_all,之前的处理流程中处理了对混合目标,xxx_config等编译的情况,而大部分情况都是走到这里,这里要先设置make的默认目标,在整个./Makefile中,_all的编译仅在这里唯一设置了一次,根据当前是否是编译外部模块,_all中的默认目标有所区别: * 如果编译的是外部模块,那么..

ashimida 2345

华为OD机试双机位C卷-分披萨 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【分披萨】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 分披萨。

qq_45776114的博客 1396

linux内核的构建系统,技术|你知道 Linux 内核是如何构建的吗?

介绍我不会告诉你怎么在自己的电脑上去构建、安装一个定制化的 Linux 内核,这样的资料太多了,它们会对你有帮助。本文会告诉你当你在内核源码路径里敲下make 时会发生什么。当我刚刚开始学习内核代码时,Makefile 是我打开的第一个文件,这个文件看起来真令人害怕 :)。那时候这个 Makefile 还只包含了1591 行代码,当我开始写本文时,内核已经是4.2.0的第三个候选版本 了。这个 m...

weixin_34649105的博客 317

手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

MHD0815的博客 315

地图之家总目录

地图之家总目录 cesium示例 leaflet示例

GIS之家家长 1万+

读Kernel感悟-kbuild系统-make bzImage的过程

读Kernel感悟-kbuild系统-make bzImage的过程顶嵌(TOP-E)|嵌入式linux企业培训|嵌入式Linux就业实训|承接嵌入式项目开发   2009-04-02 09:44:27 作者:handsomeluo 来源:顶嵌开源 文字大小:[大][中][小]从以上例子中可以看到,内核的编译系统kbuild是个很庞大的系统。但是,它所使用的make

owenbbkp的专栏 554

链路状态路由协议 OSPF (一)

本章将会学习链路状态路由协议OSPF,理解OSPF的基本概念,工作原理,掌握OSPF配置基本命令。本章重点,OSPF的基本概念,OSPF配置。

yj11290301的博客 3475

读kernel感悟-kbuild系统-make bzImage的过程

<br /> <br />内核的编译系统kbuild是个很庞大的系统 ,但是,它所使用的make和我们平时用的make是一模一样的。kbuild只是通过预定义一些变量(obj-m,obj-y等等)和目标(bzImage ,menuconfig等等),使内核的编译和扩展变得十分方便。我们不妨yy一下kbuild的一些功能:<br />1.考虑到Linux能够方便地移植到各个硬件平台,kbuild也必须很容易添加对某个新的平台的支持,同时上层的Makefile不需要做大的改动。<br />2.Linux下有众多

y296144646q的专栏 860

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

读Kernel感悟-kbuild系统-编译到内核和编译成模块的区别

顶嵌专栏 690

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

读Kernel感悟-kbuild系统-编译到内核和编译成模块的区别(可以解释内核编译过程中和.C文件传宏的问题,实际还是gcc的-D选项)

#ifdef与#if   defined没有区别 #if defined(MODULE) || defined(CONFIG_HOTPLUG)#define __devexit_p(x) x#else#define __devexit_p(x) NULL#endif#ifdef MODULE#define __exit_p(x) x#else#define __exit_p

555

那年,我学习《Linux内核修炼之道》——Kernel地图:Kconfig与Makefile

这些文章是阅读《linux内核修炼之道》的笔记和一些自己补充的知识和感悟,写的不清楚的地方请查看《linux内核修炼之道》等资料。同时文章若有不妥的地方请大家指出,谢谢。 转载请注明出处:http://blog.youkuaiyun.com/muge0913/article/details/7250425 Makefile不是Make Love Kconfig和Makefile是我们浏览...

yuanjinxiu 181

Kbuild系统源码分析(五)—模块的编译流程

模块的编译流程在<Kbuild系统源码分析(二)—./Makefile>等文章中已有提及,这里主要梳理思路并记录之前分析中没有记录的一些细节,这里仅以arm64平台内部模块的编译,目标为modules(编译所有模块),CONFIG_MODULES=y,且CONFIG_MODVERSIONS=y的情况为例,后面提及的模块默认指的是这种情况下的模块. 模块的编译规则如下: modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) mo...

ashimida 4504

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

在FL2440资料的LED驱动编程的编译makefile里面看到这样一句话,-C是表示进入$(KERNELDIR)目录执行makefile,而M不是makefile的选项,是内核根目录下的Makefile中使用的变量。 # Use make M=dir to specify directory of external module to build # Old syntax make ... SUBDIRS=$PWD is still supported # Setting the enviro

FF的专栏 1万+

Linux kernel 分析之十二:kbuild系统-内核模块的编译

段错误么? 这里涉及到PIII中用sysenter来代替系统调用的int 0x80的问题。大概就是内核允许一部分代码给用户态进程访问。例如: cat /proc/$pid/maps可以看到: ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]ldd 一个应用程序也可以看到:linux-gate.so.1 =>  (0xffffe00

vanileo的专栏 1754

内核Kbuild 学习

转自http://www.360doc.com/content/12/0107/15/6828497_177891385.shtml # ===========================================================================# We're called with mixed targets (*config and buil

qwaszx523的博客 1894

Makefile中的-C和M=解析

在进行嵌入式开发过程中,经常需要编写和运行Makefile,且在大型项目开发过程中,一般也都是使用Makefile来进行管理、编译、运行的,所以对Makefile的读写是嵌入式软件工程师必须具备的基本能力。 Makefile中,特别是在内核模块编译过程中最常使用到的两个参数就是“-C”和“M=”。 常用Makefile: # Makefile ifneq ($(KERNELRELE

xiaowulang20082008的专栏 1万+

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules)__转载的

此文是我转载的文章,是我在学习Makefile时看到的一篇文章,写得非常好,在此记录下来,感谢博主的分享! 原文链接地址:http://blog.youkuaiyun.com/wocao1226/article/details/7453761 原文如下: 在FL2440资料的LED驱动编程的编译makefile里面看到这样一句话,-C是表示进入$(KERNELDIR)目录执行makefile,而

q15288385528的专栏 1814
上一篇: 读Kernel感悟-伪装现场-fork()系统调用
下一篇: 读核感悟-kbuild系统-make bzImage的过程
TopEmbedded
博客等级 码龄18年 0粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值