【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目录中。驱动程序中的每个子目录都有makefile
和kconfig
文件。将以下内容添加到该目录的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-
构建完成!
相关文章:

【Linux】构建模块
🔥博客主页:PannLZ 🎋系列专栏:《Linux系统之路》 🥊不要让自己再留有遗憾,加油吧! 文章目录 构建第一个模块1模块的makefile2内核树内构建3内核树外构建 构建第一个模块 可以在两个地方构建模…...

vscode远程连接失败
目录 解决方案尝试1解决方案尝试2 解决方案尝试1 最近通过vscode一直使用腾讯云的服务器作为远程开发环境,以前一直很好用。 直到最近重装了系统之后,发现vscode没法对云服务器进行连接了,即使在远程主机添加了本地的公钥也不行。直接报错:…...
C#系列-C#访问FTP服务器实现上传下载(8)
FTP Server是什么? FTP Server(File Transfer Protocol Server),即文件传输协议服务器,是在互联网上提供文件存储和访问服务的计算机。它依照FTP协议提供服务,专门用来传输文件。 FTP Server允许不同的客…...
django中实现登录
Django中实现登录功能,通常涉及以下几个步骤: 一:实现步骤 1:创建用户模型:Django自带了一个用户认证系统,通常使用内置的User模型来管理用户。你也可以根据需要自定义用户模型。 2:创建登录表…...
【安卓操作系统——讲解】
安卓操作系统 安卓操作系统 安卓操作系统 安卓(Android)是一种基于Linux内核和其他开源软件的移动操作系统,主要用于触屏移动设备如智能手机和平板电脑。由Andy Rubin等人开发,最初的目的是创建一个先进的操作系统,用…...
Linux发行版全景:选择、使用和未来趋势
1. 引言 Linux操作系统的简介 Linux是一种自由和开源的操作系统内核,由Linus Torvalds在1991年首次发布。随着时间的发展,Linux已经成为世界上最流行的操作系统之一,广泛用于服务器、桌面电脑、移动设备以及嵌入式系统。Linux的主要特点是其…...
STM32 与 ARM 的联系
STM32 和 ARM 是两个不同的概念,但它们之间存在一定的联系。 STM32是一种微控制器产品,由意法半导体(STMicroelectronics)推出,其内核采用了 ARM Cortex-M 核。ARM 是一家英国芯片设计公司,专注于设计和许可…...

每日五道java面试题之java基础篇(二)
第一题. 为什么说 Java 语⾔“编译与解释并存”? ⾼级编程语⾔按照程序的执⾏⽅式分为编译型和解释型两种。 简单来说,编译型语⾔是指编译器针对特定的操作系统将源代码⼀次性翻译成可被该平台执⾏的机器码;解释型语⾔是指解释器对源程序逐…...

【Linux】Shell编程
Shell编程 目录 Shell编程1.shell基础1.输入重定向 & 输出重定向2.管道3.特殊字符(3.1)通配符(3.2)引号(3.3)注释符(#) 4.别名5.命令历史history 2.Shell脚本Shell脚本的执行方式(1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。(2)sh shell脚本名(…...

斯巴鲁Subaru EDI需求分析
斯巴鲁Subaru是日本运输集团斯巴鲁公司(前身为富士重工)的汽车制造部门,以性能而闻名,曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接,首先需要确…...
golang 集成sentry:PostgreSQL
本文介绍通过 pgx库集成sentry, pgx 特点是速度快,可以完全控制,并且支持所有 postgres 数据类型。 pgx地址: https://github.com/jackc/pgx 最简单的接入方式是自定义一个logger, 然后注入到pgx, 完整示…...

ubuntu20.04 安装mysql(8.x)
安装mysql命令 sudo apt-get install mysql-server安装完毕后,立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…...
ChatGPT升级至GPT-4 Turbo:性能升级同时更为经济
ChatGPT升级至GPT-4 Turbo:性能升级同时更为经济 随着技术的进步,ChatGPT迎来了其最新的迭代版本——GPT-4 Turbo。这一最新版本不仅在性能上得到了显著提升,而且在成本效益上也更加引人注目。 性能提升 GPT-4 Turbo带来了诸多改进&#x…...

Android 粒子喷泉动效
一、前言: 在学习open gl es实现动效的时候,打算回顾了一下用普通的2D坐标系实现粒子效果和 open gl 3d 坐标系的区别,以及难易程度,因此本篇以Canvas 2D坐标系实现了一个简单的demo。 粒子动效原理: 粒子动效本质上…...

fast.ai 深度学习笔记(一)
深度学习 2:第 1 部分第 1 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-1-602f73869197 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,这…...
【机器学习】Ubuntu系统下CUDA驱动卸载及重装
目录 背景 驱动卸载 驱动安装 CUDA驱动安装 安装nvidia-smi 背景 这里包含显卡驱动和CUDA驱动,在如下场景下,我们需要卸载显卡驱动并重新安装。 在某些情况下需要对显卡驱动进行升级某些情况下(如重启,或者调整系统配置等&a…...

相机图像质量研究(8)常见问题总结:光学结构对成像的影响--工厂调焦
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

【MySQL】数据库基础 -- 详解
一、什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据(内容)的管理能力(用户角度)。 文件保存数据有以下几个缺点&…...

零基础学Python之整合MySQL
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。 DB-API 是一个规范. 它…...

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学
一、教程描述 本套教程讲解了14种均线的特殊形态,通过直观图形以及大量案例的教学,将深奥、繁琐的均线变得生动与具体,广大投资者在认真学习以后,可以学会均线的使用方法,掌握最强的均线应用实战技术。本套教程不仅适…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...