【Linux】构建模块

在这里插入图片描述

🔥博客主页:PannLZ
🎋系列专栏:《Linux系统之路》
🥊不要让自己再留有遗憾,加油吧!


文章目录

    • 构建第一个模块
      • 1模块的makefile
      • 2内核树内构建
      • 3内核树外构建


构建第一个模块

可以在两个地方构建模块,这取决于是否希望用户能够自己使用内核配置界面启用该模块。

1模块的makefile

makefile是用来执行一组操作的特殊文件,其中最重要的操作是程序的编译。专用工具make用于解析makefile

obj-m := helloworld.oKERNELDIR ?= /lib/modules/$(shell uname -r)/buildall default: modules
install: modules_installmodules modules_install help clean:
$(MAKE) -C $(KERNELDIR) M=$(shell pwd) $@#obj- <X>模式,其中<X>应该是y、m、空白或n
#<X>设置为m,则使用变量obj-m,并将mymodule.o构建为模块。
#<X>设置为y,则使用变量obj-y,mymodule.o将构建为内核的一部分。也可以说它是一个内置模块。
#<X>设置为n,则使用变量obj-n,不会构建mymodule.o。
#obj-$(CONFIG_MYMODULE) += mymodule.o,LE)根据内核配置期间的值计算为y或m#KRNELDIR := /lib/modules/$(shell uname -r)/build:KERNELDIR是预构建的内核源码的位置。构建任何模块都需要预构建内核。
#如果已经从源代码构建了内核,则应该把这个变量设置为内核构建的源代码目录的绝对路径。#all default: modules:此行指示实用程序make执行modules目标
#make default、make all或者简单的make命令将被翻译为make modules来执行。#odules modules_install help clean::这行代表makefile中列出的目标有效。#(MAKE) -C $(KERNELDIR ) M=$(shell pwd),$@:为上面列举的每个目标所执行的规则。
#$ @将被替换为引起规则运行的目标名称。
#调用make modules,则$@将被替换为modules,规则将变为$(MAKE)-C $(KERNELDIR ) M=$(shell pwd) module。#C要求实用程序make在读取makefile或执行其他任何操作之前先更改到指定的目录。
#=$(shell pwd):这与内核构建系统相关。内核makefile使用这个变量来定位要构建的外部模块的目录。.c文件应该被放置在这里。

补充:

  • :=直接赋值操作符,它会立即计算右侧的表达式,并将结果赋值给左侧的变量。一旦赋值,无论后续如何改变右侧的表达式,变量的值都不会改变。

  • ?=条件赋值操作符,只有当该变量之前未定义或为空时,才会对其进行赋值。如果该变量已经被赋值,那么 ?= 将不会改变它的值。

2内核树内构建

在内核树中构建驱动程序之前,应该先确定驱动程序中的哪个目录用于存放.c文件。假若文件名是mychardev.c,它包含特殊字符驱动程序的源代码,则应该把它放在内核源码的drivers/char目录中。驱动程序中的每个子目录都有makefilekconfig文件。将以下内容添加到该目录的kconfig中:

config PACKT_MYCDEVtristate "Our packtpub special Characterdriver"default mhelpSay Y here if you want to support the/dev/mycdev device.The /dev/mycdev device is used to accesspacktpub.

在同目录下的makefile文件中添加

obj-$(CONFIG_PACKT_MYCDEV) += mychardev.o

接着在arch/arm/configs目录下开发板的defconfig中添加下面一行内容:

CONFIG_PACKT_MYCDEV=m

也可以运行make menuconfig来从UI中选择它,然后运行make,构建内核,再运行make modules构建模块(包括自己的模块)

内核源码树中包含的模块安装在/lib/modules/$(KERNELRELEASE)/kernel/中。在Linux系统上,它是/lib/modules/$(uname -r)/kernel/

3内核树外构建

在构建外部模块之前,需要有一个完整的、预编译的内核源代码树。内核源码树版本必须与将加载和使用模块的内核相同。有两种方法可以获得预构建的内核版本。

  • 自己构建(前面讨论过)。

  • 从发行版本库安装linux-headers- *包。

    sudo apt-get update
    sudo apt-get install linux-headers-$(uname -r)
    #这将只安装头文件,而不是整个源代码树。头文件将被安装在/usr/src/linux-headers-$(uname -r)下。
    

处理完makefile后,只需要切换到源码目录并运行make命令或者make modules即可。

交叉编译内核模块时,内核makefile实际上需要了解两个变量:ARCH和CROSS_COMPILE,它们分别表示目标体系结构和编译器的前缀名称。因此内核模块本地编译和交叉编译之间的差别是make命令。下面这条命令是为ARM构建:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-

构建完成!
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Python:函数和lambda表达式

函数实质性特定任务的一段代码&#xff0c;程序通过将一段代码定义成函数&#xff0c;并为该函数指定一个函数名&#xff0c;这样即可在需要的时候多次调用这段代码。因此&#xff0c;函数是代码复用的重要手段。 与函数紧密相关的一个知识点就是lambda表达式。lambda表达式可…

防御保护防火墙综合实验

一&#xff1a;办公区设备可以通过电信链路和移动链路上网&#xff08;多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换&#xff09; 以上两条链路&#xff0c;任意一条故障则可以通过另一条链路继续上网 二&#xff1a;分公司设备可以通过总公司的移动链路和 电信…

C||1.水仙花数是指一个n位数,每一位数字的n次幂的和正好等于这个数本身。2.有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

1.水仙花数是指一个n位数&#xff0c;每一位数字的n次幂的和正好等于这个数本身。 比如&#xff1a;153 13 53 33。 要求打印出所有三位数的水仙花数。 #include <stdio.h> #include <math.h> int main() {int i,x,y,z;for(i100;i<1000;i){xi/100%10;yi/10%…

多旋翼无人机飞行控制详解,四旋翼无人机飞控原理深入解析

在四旋翼无人机中&#xff0c;相邻的两个螺旋桨旋转方向是相反的。如图所示&#xff0c;三角形红箭头表示飞机的机头朝向&#xff0c;螺旋桨M1、M3的旋转方向为逆时针&#xff0c;螺旋桨M2、M4的旋转方向为顺时针。当飞行时&#xff0c;M2、M4所产生的逆时针反作用力&#xff0…

blender怎么保存窗口布局,怎么设置默认输出文件夹

进行窗口布局大家都会&#xff0c;按照自己喜好来就行了&#xff0c;设置输出文件夹如图 这些其实都简单。关键问题在于&#xff0c;自己调好了窗口布局&#xff0c;或者设置好了输出文件夹之后&#xff0c;怎么能让blender下次启动的时候呈现出自己设置好的窗口布局&#xff…

【JAVA-Day74】探讨Java字节输入流(InputStream)

标题 《深入探讨Java字节输入流(InputStream)的奥秘》摘要引言一、什么是字节输入流 &#x1f60a;扩展理解和代码示例工作原理示例代码注意事项 二、字节输入流操作 TXT &#x1f4c4;1. 打开文件2. 读取文件内容3. 关闭文件示例代码注意事项 三、字节输入流的应用场景 &#…

DAY9.

1.选择芯片型号 2. 3. 4. 5. 6. 7.

《Linux 简易速速上手小册》第9章: 备份与恢复策略(2024 最新版)

文章目录 9.1 理解备份的重要性9.1.1 重点基础知识9.1.2 重点案例&#xff1a;数据中心遭受火灾9.1.3 拓展案例&#xff1a;个人电脑硬盘故障9.1.4 企业级数据库被恶意软件加密 9.2 实施备份策略9.2.1 重点基础知识9.2.2 重点案例&#xff1a;为中小企业实施备份策略9.2.3 拓展…

如何配置Pycharm服务器并结合内网穿透工具实现远程开发

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

机器学习:过拟合和欠拟合的介绍与解决方法

过拟合和欠拟合的表现和解决方法。 其实除了欠拟合和过拟合&#xff0c;还有一种是适度拟合&#xff0c;适度拟合就是我们模型训练想要达到的状态&#xff0c;不过适度拟合这个词平时真的好少见。 过拟合 过拟合的表现 模型在训练集上的表现非常好&#xff0c;但是在测试集…

unity 点击事件

目录 点击按钮&#xff0c;显示图片功能教程 第1步添加ui button&#xff0c;添加ui RawImage 第2步 添加脚本&#xff1a; 第3步&#xff0c;把脚本拖拽到button&#xff0c;点击button&#xff0c;设置脚本的变量&#xff0c; GameObject添加 Component组件 点击按钮&am…

线性时间非比较类排序之基数排序

基数排序 基数排序是桶排序的扩展&#xff0c;因此又称“桶子法”&#xff0c;它是通过键值的部分信息&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;以达到排序的作用。 1. 算法思想 将各元素按位数切割成不同的数字&#xff0c;然后分别根据每个位数的比较结果…

SCI论文作图规范

SCI论文作图规范包括以下几个方面&#xff1a; 一、图片格式 SCI论文通常接受的图片格式包括TIFF、EPS和PDF等。其中&#xff0c;TIFF格式是一种高质量的图像格式&#xff0c;适用于需要高分辨率和颜色准确性的图片&#xff1b;EPS格式是一种矢量图形格式&#xff0c;适用于需…

app逆向-android-studio安装使用教程

Android Studio 是谷歌推出的一个Android集成开发工具&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 android-studio下载地址&#xff1a;https://developer.android.com/studio/archive androi…

Acwing 5469. 有效点对【正难则反+巧妙选择根节点】

原题链接&#xff1a;https://www.acwing.com/problem/content/5472/ 题目描述&#xff1a; 给定一个 n 个节点的无向树&#xff0c;节点编号 1∼n。 树上有两个不同的特殊点 x,y&#xff0c;对于树中的每一个点对 (u,v)(u≠v)&#xff0c;如果从 u 到 v 的最短路径需要经过…

算法沉淀——模拟(leetcode真题剖析)

算法沉淀——模拟 01.替换所有的问号02.提莫攻击03.Z字形变换04.外观数列05.数青蛙 模拟算法是一种通过模拟问题的描述或场景来解决问题的算法。这种算法的核心思想是按照问题描述的规则&#xff0c;逐步模拟问题的发展过程&#xff0c;从而得到问题的解决方案。通常&#xff0…

第7讲 全局异常统一处理实现

新建GlobalExceptionHandler类。 package com.java1234.exception;import com.java1234.entity.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdv…

【MATLAB】GA_BP神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 GA_BP神经网络回归预测算法结合了遗传算法&#xff08;Genetic Algorithm, GA&#xff09;和BP神经网络&#xff08;Backpropagation Neural Network, BPNN&#xff09;&#xff0c;用于解…

《21天精通IPv4 to IPv6》第16天:IPv6网络的故障排除——如何排除IPv6网络故障? ️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

万界星空科技低代码平台与MES的完美结合

低代码与MES系统相结合 ​​低代码平台通常是指aPaaS平台&#xff0c;通过为开发者提供可视化的应用开发环境&#xff0c;降低或去除应用开发对原生代码编写的需求量&#xff0c;进而实现便捷构建应用程序的一种解决方案。 更加简单点的理解就是“拖拽&#xff01;搭建应用”。…