【Linux】linux内核模块编译makefile

1、编译进内核的模块

如果需要将foo.ko编译进内核,需要在makefile中进行配置:

obj-y += foo.o

2、编译可加载的模块

如果需要将foo.ko编译成可加载模块,需要在makefile中进行配置:

obj-m += foo.o

obj-m表示编译生成可加载模块。相对应的,obj-y表示直接将模块编译进内核。

3、模块编译依赖多个文件

通常的,驱动开发者也会将单独编译自己开发的驱动模块,当一个驱动模块依赖多个源文件时,需要通过以下方式来指定依赖的文件:

foo-y := a.o b.o c.o   
obj-m += foo.o

foo.o 由a.o,b.o,c.o生成,然后调用$(LD) -r 将a.o,b.o,c.o链接成foo.o文件。

注意这里,除了hello-y,同时也可以用hello-objs,实现效果是一样的。即:

foo-objs := a.o b.o c.o   
obj-m += foo.o

foo-objs := a.o b.o c.o 表示 foo.o 由a.o,b.o与c.o 连接生成。obj-m := foo.o表示编译连接后将生成foo.ko模块。

4、最简单的makefile

obj-m+=hello.o
all:make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean

这个makefile的作用就是编译hello.c文件,最终生成hello.ko文件。

obj-m+=hello.o,这条语句就是显式地将hello.o编译成hello.ko。而hello.o则由make的自动推导功能编译hello.c文件生成。

-C选项:此选项指定make在编译时将会进入指定的目录(内核源码目录)。
modules是将源文件编译并生成内核模块。
$(KDIR):/lib/modules/(shell uname -r)/build/,指定内核源码的位置。
M=$(PWD):需要编译的模块源文件地址。

5、linux内核模块编译makefile

通常,标准的Kbuild-Makefile会写成这样:

ifneq ($(KERNELRELEASE),)obj-m  := hello.oelseKDIR ?= /lib/modules/`uname -r`/buildall:$(MAKE) -C $(KDIR) M=$(PWD) modules		// -C:表示change,change到内核源码里面去编译, M=$( ):指定了要编译驱动的源码目录;// 因此就该程序会再次进入我们这个makefile文件进行执行,接下来继续去判断 KERNELRELEASE 变量
clean:$(MAKE) -C $(KDIR) M=$(PWD) clean
endif
ifneq (a,b) #如果a和b不相等,执行这句。
else    #否则,执行这句。

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

需要注意的一个基本概念是:每一次编译,顶层makefile都试图递归地进入每个子目录调用子目录的makefile,只是当目标子目录中没有任何修改时,默认不再进行重复编译以节省编译时间。

  1. 首次执行当前标准的Kbuild-Makefile时,KERNELRELEASE并没有被定义,所以走else分支,直接执行
    $(MAKE) -C $(KDIR) M=$(PWD) modules
  1. 而这条指令会进入到$(KDIR)目录,调用顶层的 Kernel Makefile,在顶层makefile中定义了KERNELRELEASE变量。

  2. 顶层makefile都试图递归地进入每个子目录调用子目录的Kbuild-Makefile只是当目标子目录中没有任何修改时,默认不再进行重复编译以节省编译时间。 在这一时刻只有M=$(PWD)需要编译。

  3. 在顶层makefile中会递归地再次调用到当前目录下的makefile文件,这时KERNELRELEASE变量已经非空,所以执行if分支,

在可加载模块编译列表添加hello模块,由此将模块编译成可加载模块放在当前目录下。



​ obj-m := hello.o这句话是给内核使用,他会收集内核驱动的binary文件,最终生成.ko的驱动文件。 这个Makefile会进来两次,第一次编译内核 第二次生成.ko文件。

​ 归根结底,各级子目录中的makefile文件的作用就是先切换到顶层makefile,然后通过obj-m在可加载模块编译列表中添加当前模块,kbuild-makefile就会将其编译成可加载模块。如果是直接编译整个内核源码,就省去了else分支中进入顶层makefile的步骤。



参考链接:

linux内核模块编译makefile
KBuild MakeFile介绍
Linux内核Makefile介绍
linux字符设备驱动 Makefile分析obj-m := helloDev.o

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery详细介绍

一、引言 在Web开发的历史长河中,JavaScript一直扮演着至关重要的角色。然而,原生的JavaScript在某些方面存在不足,如浏览器兼容性、DOM操作繁琐等。为了简化这些问题,jQuery应运而生。jQuery是一个轻量级的、功能丰富的JavaScri…

李沐动手学习深度学习——3.5练习

减少batch_size(如减少到1)是否会影响读取性能? 肯定会影响,计算机io性能而言,随着batch_size增大,读取越来越快,需要的时间越少。这里会涉及到计算机操作系统的知识点,内存与硬盘之…

AmzTrends x TiDB Serverless:通过云原生改造实现全局成本降低 80%

本文介绍了厦门笛卡尔数据(AmzTrends)在面临数据存储挑战时,选择将其数据分析服务迁移到 TiDB Serverless 的思路和实践。通过全托管的数据库服务,AmzTrends 实现了全局成本降低 80% 的效果,同时也充分展示了 TiDB Ser…

redis一些概念知识

一、redis是什么 Redis是一种非关系型数据库(NoSQL),它主要以键值对存储数据。与传统的关系型数据库相比,Redis更注重内存操作和高性能,常被用作缓存系统或分布式存储系统。 以简单的比喻来解释Redis,可以…

kafka进阶(二)

文章目录 前言一、Ack机制二、ISR集合总结 前言 本篇主要介绍kafka 的 Ack机制 和 ISR集合 一、Ack机制 Kafka提供了三种不同的应答机制(ACK): acks0:这是最不可靠的模式。在这种模式下,生产者不会等待来自服务器的…

三、软考-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。 冯诺依曼体系计算机结构: 1、计算机硬件组成 冯诺依曼计算机结构将…

正向代理的反爬虫与防DDoS攻击:保护网站免受恶意行为

目录 前言 一、正向代理的原理 二、正向代理的反爬虫功能 1. IP地址隐藏 2. 请求多样化 三、正向代理的防DDoS攻击功能 1. 均衡负载 2. IP过滤 结论 前言 在当前互联网环境下,网站常常受到各种恶意行为的侵袭,其中包括爬虫和DDoS攻击。这些行为…

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

《中国计算机学会通讯》2022年第10期读书笔记

试看&#xff1a;https://dl.ccf.org.cn/reading.html?_ack1&id6177027364096000 为计算机科学技术的大变局立言 重要的不是找答案&#xff0c;而是提出别人没有想到或者还不重视的科学问题和技术方向。 几乎没有人愿意去去急需研发人才的中小企业。 CCCF应当关心作为…

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?-OceanBase案例

毫末智行是一家致力于自动驾驶的人工智能技术公司&#xff0c;其前身是长城汽车智能驾驶前瞻分部&#xff0c;以零事故、零拥堵、自由出行和高效物流为目标&#xff0c;助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中&#xff0c;是什么原因让毫末智行…

Linux——基本指令

系列文章目录 文章目录 系列文章目录一、Linux基本常识二、Linux基本指令2.1 mkdir指令&#xff08;重要&#xff09;2.2 rmdir指令2.3 rm指令&#xff08;重要&#xff09;2.4 touch指令2.5 ls指令2.6 pwd指令2.7 cd指令2.7.1 Linux中的目录结构2.7.2 绝对路径和相对路径2.7.3…

对程序、进程、线程、并发、并行、高并发概念的讲解

一、概述 程序、进程、线程、并发、并行和高并发是计算机科学领域中非常重要的概念。 了解进程、线程、并发和并行的概念&#xff0c;可以更好地利用计算机的多核处理器和并行计算能力&#xff0c;提高计算机性能。 了解进程和线程为操作系统中的资源管理提供了基础&#xff…

【风格迁移】对比度保持连贯性损失 CCPL:解决图像局部失真、视频帧间的连贯性和闪烁

对比度保持连贯性损失 CCPL&#xff1a;解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法&#xff1a;对比度保持连贯性损失&#xff08;CCPL&#xff09; 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习&#xff1a;在无需标签的情况下有效学习区分…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的教室人员检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发教室人员检测与计数系统对于优化教学资源和提升教学效率具有重要意义。本篇博客详细介绍了如何利用深度学习构建此系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5的性能&#xff0c;展示…

蓝桥杯第2章:基础算法_3

1.聪明的小羊肖恩 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> using namespace std; typedef long long LL; const int mod100000007; const int N200010; int n,L,R; int a[N]; LL calc(int v){//计算数组a中两个数之和小于等于v的数对数量int l1,rn;LL ans0;whi…

[vue error] TypeError: AutoImportis not a function

问题详情 问题描述: element plus按需导入后&#xff0c;启动项目报错&#xff1a; 问题解决 将unplugin-auto-import 回退到0.16.1 npm install unplugin-auto-import0.16.1 安装完后再次运行就好了

差分题练习(区间更新)

一、差分的特点和原理 对于一个数组a[]&#xff0c;差分数组diff[]的定义是: 对差分数组做前缀和可以还原为原数组: 利用差分数组可以实现快速的区间修改&#xff0c;下面是将区间[l, r]都加上x的方法: diff[l] x; diff[r 1] - x;在修改完成后&#xff0c;需要做前缀和恢复…

PYTHON 自动化办公:压缩图片(PIL)

1、介绍 在办公还是学习过程中&#xff0c;难免会遇到上传照片的问题。然而照片的大小限制一直都是个问题&#xff0c;例如照片限制在200Kb之内&#xff0c;虽然有很多图像压缩技术可以实现&#xff0c;但从图像处理的专业来说&#xff0c;可以利用代码实现 这里使用的库函数是…

云计算之道:学习方法、实践经验与行业展望

一、云计算的理论 云计算是一种基于网络的计算模型&#xff0c;通过将计算资源、存储资源和服务等提供给用户&#xff0c;实现按需获取、灵活部署和按照使用量付费等特点。云计算的基本原理包括以下几个方面&#xff1a; 虚拟化技术&#xff1a;云计算基于虚拟化技术&#xff…