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

嵌入式系统/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:   立即下载

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

5、数字图像采集:X射线成像技术全解析 本文全面解析了数字图像采集中的X射线成像技术,涵盖数字X射线探测器、荧光透视与血管造影、乳腺摄影以及计算机断层扫描(CT)的图像重建原理。详细介绍了TFT平板探测器的优势、DSA技术在血管成像中的应用、乳腺摄影对高对比度和分辨率的需求,以及CT中基于Radon变换和滤波反投影的重建方法。同时探讨了噪声、部分容积效应、金属伪影和运动伪影等常见问题及其影响。最后总结了各类X射线成像技术的特点与应用场景,并展望了未来在图像质量提升和剂量优化方面的技术发展方向。 阅读详情

相关推荐

STM32F429+LAN8720实战:5分钟搞定LWIP裸机网络通讯(附完整代码)

本文详细介绍了如何在STM32F429微控制器上,结合LAN8720 PHY芯片,在裸机环境下快速部署和配置LWIP协议栈以实现网络通讯。内容涵盖硬件RMII接口连接、STM32CubeMX关键配置、代码移植与定制,以及常见问题排查方法,帮助工程师在资源受限的嵌入式系统中高效实现稳定的以太网功能。

2y3u4i5o6p的博客 962

海思hi3520dv400 kernel分析(0)——Kbuild原理分析

(一)前言 kbuild,即 kernel build,用于编译 Linux 内核文件。 kbuild 对 makefile 进行了功能上的扩充,使其在编译内核文件时更加高效,简洁。大部分内核中的 Makefile 都是使用 Kbuild 组织结构的 kbuild Makefile。 Kbuild 执行的几个步骤(大致): 根据内核配置生成文件 .config 将内核的版本号存储在 .........

Biao 2703

Vivado与VCS+Verdi联合仿真环境搭建全攻略

本文详细介绍了如何搭建Vivado与VCS+Verdi联合仿真环境,旨在解决Vivado Simulator在大型FPGA验证中速度慢、调试弱的问题。通过指导工具版本配对、环境变量设置、关键参数配置及Xilinx仿真库编译,帮助工程师高效整合Vivado的设计管理、VCS的高速仿真与Verdi的深度调试能力,从而显著提升验证效率。

weixin_29219189的博客 577

linux kernel Kbuild 编译系统分析

从Linux内核2.6开始,Linux内核的编译采用Kbuild系统,这同过去的编译系统有很大的不同,尤其对于Linux内核模块的编译。在新的系统下,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。 Linux内核Makefile分类 ...

zgp2917的专栏 601

S参数反演法

等效介质理论模型— 利用S参数反演法提取超材料结构的等效参数 等效介质理论模型—利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程。本文对等效介质理论模型进行了详细介绍,并提供对应代码。 超材料的传输矩阵 超材料结构的传输矩阵函数为: 其中,d 为等效光学活性材料的厚度,n 为折射率,Z 表示阻抗。 S参数和传输矩阵T 超材料结构的S参数和传输矩阵T满足下列方程: 利用以上两式,可以得到等效折射率n和相对阻抗的表达式

weixin_43962864的博客 1万+

从菜鸟到高手:我的Abaqus壳单元S4R、S3R、S8R选择心路历程

第一次打开Abaqus的单元库时,我被琳琅满目的壳单元类型晃花了眼。S4R、S3R、S8R、STRI65、S9R5...这些看似随意的字母数字组合,背后却隐藏着影响仿真精度的关键密码。作为一名从土木工程转行到汽车结构仿真的工程师,我花了三年时间才真正理解如何根据问题特性精准选择壳单元。这段学习历程充满试错与顿悟,今天就用几个关键案例,分享我的壳单元选择方法论。

weixin_42525637的博客 418

linux kernel kbuild详解 之一

内核编译过程中会生成以下类型的文件 参见Documentation/kbuild/kbuild.txt modules.order:这个文件记录了Makefile中模块出现的顺序。modprobe通过它来确定解决多个模块匹配的别名(指定模块的绝对路径)。                                如:kernel//home/cjz/Desktop/test/d

崔建忠的专栏 1万+

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 356

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 2440

上网第二课:办了百兆宽带,为什么测速只有一半?

最慢的那一环。

qq_36765170的博客 108

视觉Transformer实战 | Cross-Attention Multi-Scale Vision Transformer(CrossViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准 ViT 结构在处理不同尺度的视觉特征时存在局限性。双分支 ViT (Cross-Attention Multi-Scale Vision Transformer, CrossViT) 通过引入双分支结构来解决这一问题,能够同时捕获局部和全局视觉特征。本文将详细介绍 CrossViT 的技术原理,并使用 PyTorch 从零开始实现 CrossViT 模型。

盼小辉丶的博客 722

kbuild系统-内核模块的编译

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

ruixj的专栏 1248

Langchain cannot connect with Azure SQL Database

Langchain 无法连接到 Azure SQL 数据库

suiusoar 633

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

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

owenbbkp的专栏 554

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

读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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

顶嵌专栏 690

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

读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系统-make bzImage的过程

文章来源:http://www.top-e.org/jiaoshi/class/ 从以上例子中可以看到,内核的编译系统kbuild是个很庞大的系统。但是,它所使用的make和我们平时用的make是一模一样的。kbuild只是通过预定义一些变量(obj-m,obj-y等等)和目标(bzImage ,menuconfig等等),使内核的编译和扩展变得十分方便。我们不妨yy一下kbuild的一些

李亚锋老师 4052

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

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

weixin_34649105的博客 317

Linux Kbuild工作原理分析(以DVSDK生成PowerVR显卡内核模块为例)

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

GQB的专栏 5960

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

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

ashimida 2346

linux内核源码目录结构

linux内核源码目录结构如下所示: (1)Kbuild Kbuild是Kernel build的意思,就是内核编译的意思,这个文件就是linux内核特有的内核编译体系需要用到的文件。 (2)Makefile 这个是linux内核的总Makefile,整个内核工程是用这个Makefile来管理的。 (3)mk 这个文件是九鼎在移植时自己添加的,不是linux内核本身的东西。九鼎添加...

linuxweiyh的博客 7128

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

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值