Linux 内核源码分析---插入和删除模块

news2024/11/15 23:38:22

模块是一种向 Linux 内核添加设备驱动程序、文件系统及其他组件的有效方法,不需编译新内核或重启系统。

模块具有如下优点:
• 通过使用模块,内核发布者能够预先编译大量驱动程序,而不会致使内核映像的尺寸发生膨胀;
• 内核开发者可以将试验性的代码打包到模块中,模块可以卸载,修改代码或重新打包后可以重新装载。

从用户的角度来看,模块可以通过两个不同的系统程序添加到运行的内核中。它们分别是modprobeinsmod
在这里插入图片描述

modprobe在识别出目标模块所依赖的模块之后,在内核也会使用insmod,在用户空间对模块的处理也是基于insmod

在处理该系统调用时,模块代码首先复制到内核内存中,接下来是重定位工作和解决模块中未定义的引用

  • 因为模块使用了持久编译到内核中的函数,在模块本身编译时无法确定这些函数的地址,所以需要在这里处理未定义的引用。
    处理未解决的引用,为与内核的剩余部分协作,模块必须使用内核提供的函数。这些可能是通用的辅助函数,比如几乎内核每一部分都会使用的 printkkmalloc
  • 函数定义在内核的基础代码中,因而已经加载到内存,为了找到与相关函数名称匹配的地址,内核提供了一个所有导出函数的列表 /proc/kallsyms 文件。该列表给出了所有导出函数的内存地址和对应函数名,可以通过proc文件系统访问:
    在这里插入图片描述

用户空间工具和内核的模块实现之间的接口,包括两个系统调用:
(1)init_module:将一个新模块插入到内核中。用户空间工具只需提供二进制数据。所有其他工作(特别是重定位和解决引用)由内核自身完成。
(2)delete_module:从内核移除一个模块。当然,前提是该模块的代码不再使用,并且其他模块也不再使用该模块导出的函数。

还有一个 request_module 函数(不是系统调用),用于从内核端加载模块。它不仅用于加载模块,还用于实现热插拔功能。

模块的表示

module 是最重要的数据结构。内核中驻留的每个模块,都分配了该结构的一个实例。
在这里插入图片描述

state 表示该模块的当前状态,可以从枚举类型module_state取值:
在这里插入图片描述

symsnum_symscrc用于管理模块导出的符号。 syms是一个数组,有num_syms个数组项,数组项类型为kernel_symbol,负责将标识符( name)分配到内存地址( value):
在这里插入图片描述

依赖关系和引用

如果模块 B 使用了模块 A 提供的函数,那么模块 A 和模块 B 之间就存在关系。 可以用两种不同的方式来看这种关系:
(1) 模块 B 依赖模块 A。除非模块 A 已经驻留在内核内存,否则模块 B 无法装载;
(2) 模块 B 引用模块 A。换句话说,除非模块 B 已经移除,否则模块 A 无法从内核移除。事实上,条件应该是所有引用模块 A 的模块都已经从内核移除。在内核中,这种关系称之为模块 B 使用模块 A。
为正确管理这些依赖关系,内核需要引入另一个数据结构:
在这里插入图片描述

模块的二进制结构

模块使用 ELF 二进制格式,模块中包含了几个额外的段,普通的程序或库中不会出现。

除了少量由编译器产生、与我们的讨论不相关的段(主要是重定位段),模块由以下ELF段组成。

生成模块需要执行下述3个步骤:
(1) 首先,模块源代码中的所有 C 文件都编译为普通的.o目标文件;
(2) 在为所有模块产生目标文件后,内核可以分析它们。找到的附加信息(例如,模块依赖关系)保存在一个独立的文件中,也编译为一个二进制文件;
(3) 将前述两个步骤产生的二进制文件链接起来,生成最终的模块。

a.初始化及清理函数<init.h>中的module_initmodule_exit宏用于定义init函数和exit函数。
b.导出符号:内核为导出符号提供了两个宏: EXPORT_SYMBOLEXPORT_SYMBOL_GPL。顾名思义,二者分别用于一般的导出符号和只用于GPL兼容代码的导出符号。同样,其目的在于将相应的符号放置到模块二进制映象的适当段中;

在导出符号时,内核不仅考虑可以由所有模块使用符号,还要考虑只能由GPL兼容模块使用的符号。内核提供 license_is_gpl_compatible函数来判断给定许可是否与GPL兼容

GPL软件的使用者有权力得到软件的代码,只要使用了GPL,在发布(redistribution)时,整个项目也必须是GPL的,即主程序和静态链接的库(linux的.a和Windows的.lib)必须是GPL的,动态链接库(Linux的.so,Windows的.dll)必须是GPL兼容的。所谓GPL兼容,也就是GPL软件中可以使用的库,这些许可证必须比GPL弱(如LGPL,BSD),而不能是某个商业许可证。正因如此,GPL是带有很强的传染性,只要你的软件使用了GPL的代码,那么就请以GPL开放源代码吧,并且你的项目中也不能有任何和GPL不兼容的库。

在这里插入图片描述

c.一般模块信息:模块许可证、开发者和描述、备选名称、基本版本控制。

插入删除模块

在这里插入图片描述

插入模块:init_module系统调用是用户空间和内核之间用于装载新模块的接口,通过 load_module函数将二进制数据传输到内核地址空间中:
在这里插入图片描述
二进制数据使用load_module传输到内核地址空间中,所有需要的重定位都会完成,所有引用都会解决。
load_module函数中创建module实例已经添加到全局的modules链表后,内核内需要调用模块的初始化函数并释放初始化数据占用的内存即可。

在实现 load_module 时会出现异常,内核源代码中该函数:完成所有碰到异常问题,此函数可以完成任务如下:

  • 从用户空间复制模块数据到内核地址空间中的一个临时内存位置;
  • 查找各个段位置;
  • 确保内核和模块版本控制字符串和struct module的定义匹配问题;
  • 将存在的各个段分配到其在内存中的最终位置;
  • 重定位符号并解决引用,链接到模块符号任何版本控制信息的都会注意到处理模块的参数。

删除模块:从内核移除模块比插入模块简单得多,系统调用delete_module函数来实现移除模块

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

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

相关文章

PTA—基础编程题目集(7-18)

7-18 二分法求多项式单根 目录 题目描述 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 参考代码 总结 题目描述 输入在第1行中顺序给出多项式的4个系数a3​、a2​、a1​、a0​&#xff0c;在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间…

60_1简单的学生管理系统【功能实现(查看所有学生(分页)、修改和删除学生信息)】

功能实现 老师角色查看所有学生 获取学生列表和分页 1.修改index.jsp 不能直接跳stuList.jsp&#xff0c;没数据 <%if("teacher".equals(role)){%><a href"TeaInitModifyServlet?username<%username%>">修改信息</a><a href…

设施农业“AutoML“时代:大模型自动调参,让农业算法模型更简单易用

&#xff08;于景鑫 北京市农林科学院智能装备技术研究中心&#xff09;设施农业是现代农业的重要发展方向,但在数字化、智能化的进程中仍面临诸多挑战。传统的农业算法模型虽然可以为设施农业提供一定的决策支持,但在实际应用中往往受限于参数调优复杂、模型泛化能力差等因素。…

<Rust><iced>基于rust使用iced构建GUI实例:一个CRC16校验码生成工具

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第五篇实例,是一个CRC16校验码转换程序。 本篇内容: 1、CRC16校验码生成 代码介绍 本文的crc16校验码生成工具,主要设计两个方面,一个是crc16 modbus…

PADS Router 扇出失败问题详细解决方法。

第一步&#xff1a;确定单位是一致的,我的单位是 “密尔”&#xff0c;不是“公制”。 第二步&#xff1a;进去pads router 右键选择特性&#xff0c;注意&#xff0c;是右键点击任意板框内空白位置的特性&#xff0c;这个是涵盖整体的设置&#xff0c;和单独点击一个元器件选…

react-native从入门到实战系列教程一Swiper组件的使用及bug修复

轮播图&#xff0c;在app中随处可见&#xff0c;这么重要的功能我们怎么可能不学习下在react-native中的实现方式。 依然是第三方组件react-native-swiper 官网地址 https://www.npmjs.com/package/react-native-swiper 组件使用的组件及事件参考官方即可。 实现效果 官网…

文件审查流程:使用指南

当您正在处理一个项目并且必须进行文档审查时&#xff0c;您可能会对这个过程到底涉及什么、谁是利益相关者以及审查过程的结果可能是什么感到困惑。在这篇博客文章中&#xff0c;让我们简单介绍一下文档审核过程及其对高质量内容的活力。 文件审查的定义 文件审查是文件经过…

CMD运行指令

CMD运行指令 开始→运行→CMD→键入以下命令即可: ASSOC显示或修改文件扩展名关联。 AT计划在计算机上运行的命令和程序。 ATTRIB显示或更改文件属性。 BREAK设置或清除扩展式CTRLC检查。 CACLS显示或修改文件的访问控制列表(ACLs)。 CALL从另一个批处理程序调用这一个。 CD显示…

不同类型游戏安全风险对抗概览(下)| FPS以及小游戏等外挂问题,一文读懂!

FPS 游戏安全问题 由于射击类游戏本身需要大量数值计算&#xff0c;游戏方会将部分计算存放于本地客户端&#xff0c;而这为外挂攻击者提供了攻击的温床。可以说&#xff0c;射击类游戏是所有游戏中被外挂攻击最为频繁的游戏类型。 根据网易易盾游戏安全部门检测数据显示&#…

未来十年机器人行业前景还好吗?

未来十年机器人行业的前景非常乐观&#xff0c;这一行业预计将持续快速发展并深刻影响我们的工作、生活和社会。以下是对未来十年机器人行业前景的详细分析&#xff1a; 一、技术驱动的创新与发展 1. 智能化与自主化&#xff1a;随着深度学习和神经网络技术的进步&#xff0c;…

MATLAB进阶:数据的拟合

几天我们继续深度学习MATLAB中的数据拟合 最小二乘拟合 假设已知经验公式yf(c,x)yf(c,x)&#xff08;c为参数&#xff0c;x为自变量&#xff09;&#xff0c;要求根据一批有误差的数据(xi,yi)&#xff0c;i0,1,...,n(xi​,yi​)&#xff0c;i0,1,...,n确定参数c。这样的问题称…

SSM大学生就业咨询管理系统-计算机毕业设计源码79442

目录 摘要 1 绪论 1.1 选题背景 1.2 研究目的和意义 1.3国内外研究现状 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据流程 2.2.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2…

python合并音视频-通过moviepy模块合并音视频

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

从零开始的MicroPython(四) 串口

上一篇&#xff1a;按键与外部中断 文章目录 前言串口&#xff08;UART&#xff09;简介MicroPython的UARTUART 类——双工串行通信 ESP32(NodeMCU-32S)GPIO简介引脚 文档代码ESP32&&PC通讯 前言 在嵌入式学习中&#xff0c;串口发挥着重要的作用&#xff0c;不仅仅是…

C++ 随机单词(萌新练习项目)

目录 项目名称 项目目标 功能描述 技术要点 示例代码 扩展建议 学习资源 项目名称 随机单词生成器&#xff08;Random Word Generator&#xff09; 项目目标 学习C基本语法和数据结构。练习使用C标准库中的随机数生成功能。理解容器&#xff08;如std::vector&#xf…

由浅入深的了解进程(5)--环境变量

环境变量 前言环境变量1、更多的环境变量及添加和删除2、整体理解环境变量系统 前言 在上一篇文章中简单的介绍了环境变量&#xff0c;但是没有讲述的比较全面了&#xff0c;所以现在再写一篇来介绍环境变量。 环境变量 在上一篇文章中&#xff0c;我们已经简单的学习了如何…

“网络身份证”来了,淘宝、微信、小红书等已上线试点版功能

“网络身份证时代”即将开启。 近日&#xff0c;公安部、国家网信办共同起草《国家网络身份认证公共服务管理办法&#xff08;征求意见稿&#xff09;》公开征求意见后&#xff0c;未来是否需要“持证上网”一时间引发热议。而在征求意见的期间&#xff0c;小红书、淘宝、微信等…

linux-环境变量,进程地址空间

1.环境变量 1.1基本概念 环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写 C/C 代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但 是照样可以链接…

Stable Diffusion绘画 | 文生图设置详解—随机种子数(Seed)

随机种子数&#xff08;Seed&#xff09; Midjourney 也有同样的概念&#xff0c;通过 --seed 种子数值 来使用。 每次操作「生成」所得到的图片&#xff0c;都会随机分配一个 seed值&#xff0c;数值不同&#xff0c;生成的画面就会不同。 默认值为 -1&#xff1a;每次随机分…

速度规划之:起点速度和终点速度不为零的非对称梯形速度规划

起点速度和终点速度不为零的非对称梯形速度规划 一、引言二、理论基础1. 梯形速度规划概述2.数学建模- 变量定义- 约束关系- 公式推导 三、计算过程1.只存在减速段2.只存在加速段3.存在加速段和减速段4.存在加速度段、匀速段和减速段 四、仿真实现五、优缺点优点缺点 六、总结 …