Linux源码阅读笔记18-插入模型及删除模块操作

news2024/9/27 23:31:06

基础知识

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

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

添加和删除

  • 从用户角度来看,模块可以通过两个不同的系统程序添加到运行内核中。他们分别是modprobeinsmodmodprobe在识别出目标模块所依赖的模块后,在内核也会使用insmod,再用户空间队模块的处理也是基于insmod
  • 在处理系统调用的时候,模块代码首先复制到内核内存中。接下来是重定位工作和解决模块中为定义的引用。因为模块使用了持久编译到内核中的函数,在模块本身编译时无法确定这些函数的地址,所以需要再这里处理为定义的引用。
  • 处理未解决的引用,为与内核的剩余部分协作,模块必须使用内核提供的函数。这些可能是通用的辅助函数,比如几乎内核每一部分都会使用的printk或者kmalloc
  • 很明显这些函数定义在内核的基础代码中,因而已经家在到内存。但是如何找到与相关函数名匹配的地址,以便解决这些引用呢?为此,内核提供了一个导出所有函数的列表。该列表给出了所有导出函数的内存地址和对应函数名,可以通过proc文件系统访问,即文件/proc/kallsyms

向内核添加模块时,需要考虑下列相关问题

  • 内核提供的函数符号表,可以在模块加载时动态扩展其长度。
  • 如果模块之间相互依赖,那么向内核添加模块的顺序很重要。

插入和删除模块

用户空间工具和内核的模块实现之间的接口,包括两个系统调用。

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

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

模块的表示

在详细讲解模块相关函数实现之前,有必要解释如何在内核中表示模块(及其属性)。首先需要定义一组数据结构。首先需要定义一组数据结构。其中,module是最重要的数据结构。内核中驻留的每个模块,都分配了该结构的一个实例。其定义如下:

state表示模块当前的状态,可以从枚举类型moudule_state取值。

syms、num_syms和crc用于管理模块导出的符号。syms是一个数组,有num_syms个数组项,数组项类型为kernel_symbol,负责将标识符(name)分配到内存地址(value):

依赖关系和引用

如果模块B依赖模块A提供的函数,那么模块A和模块B之间就存在关系。可以用两种不同的方式来看这种关系。

  • 模块B依赖模块A:除非模块A已经驻留在内核内存,否则模块B无法加载。
  • 模块B引用模块A:换句话说,除非模块B已经移除,否贼模块A无法从内核中移除。事实上,条件应该是所有引用模块A的模块都已经从内核移除。在内核中,这种关系称之为模块B使用模块A。为了正确管理这些依赖关系,内核需要引入另一个数据结构:

模块的二进制结构

  • 生成模块的三个步骤
    • 首先,模块源代码中的所有c文件都编译为普通的.o文件。
    • 在为所有模块产生目标文件后,内核可以分析他们。找到的附加信息(例如,模块依赖关系)保存在一个独立的文件中,也编译为一个二进制文件。
    • 将前述两个步骤的二进制文件链接起来,生成最终的模块。
初始化及清理函数

<init.h>中的module_initmodule_exit宏用于定义init函数和exit函数。

导出符号

内核为导出符号提供了两个宏:EXPORT_SYMBOLEXPORT_SYMBOL_GPL。顾名思义,二者分别用于一般的导出符号和只用于GPL兼容代码和导出符号。同样,其目的在于将相应的符号放置到模块二进制映像的适当段中。

一般模块信息

模块许可证、开发者和描述、备选名称、基本版本控制

插入模块

init_module系统调用是用户空间和内核之间用于装载新模块的接口

插入模块

init_module系统调用是用户空间和内核之间用于装载新模块的接口,通过load_module函数将二进制数据传输到内核地址空间中。具体源码如下:

删除模块

从内核删除模块比插入模块简单的多,系统调用delete_module函数实现移除模块。具体源码如下:

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

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

相关文章

达梦数据库的系统视图v$large_mem_sqls

达梦数据库的系统视图v$large_mem_sqls 达梦数据库的V$LARGE_MEM_SQLS视图提供了最近1000条使用大内存的SQL语句信息。一条SQL语句如果使用的内存值超过ini参数LARGE_MEM_THRESHOLD&#xff0c;就认为使用了大内存。这个视图帮助用户监控和分析哪些SQL语句在执行时占用了大量内…

【python】Python中位运算算法详细解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

torch量化接口深度解读-eager模式-fx模式

一、定义 接口总结量化模式解读 二、实现 接口总结 1. PyTorch提供了三种不同的量化模式&#xff1a;Eager模式量化、FX图模式量化&#xff08;维护&#xff09;和PyTorch 2导出量化。 2. Eager Mode Quantization是一个测试版功能。用户需要进行融合&#xff0c;并手动指定量…

2024年AWS云服务器选择哪个区域最好?

在选择2024年AWS云服务器区域时&#xff0c;您需要根据您的业务需求、目标用户群体的位置、数据合规性要求、延迟需求以及成本预算等因素综合考虑。以下是九河云针对不同需求的建议&#xff1a; 北美区域 优势&#xff1a;北美区域&#xff0c;尤其是弗吉尼亚北部&#xff0c…

工业和信息化部明确四方面举措优化信息通信行业营商环境

根据工业和信息化部6日发布的消息&#xff0c;该部门已正式下发《关于创新信息通信行业管理 优化营商环境的意见》。 此意见旨在通过四项主要措施优化行业管理制度和手段&#xff0c;以促进信息通信行业的高质量发展。 这些措施包括&#xff1a;持续改进高效、开放、统一的准…

vue项目部署在子路径中前端配置

vue.config.JS router/index.js或者是man.js

Docker-数据卷指令

数据卷挂载修改内容

Java批量查询CSDN质量分

文章目录 前言代码实现pom.xml实体类工具类质量分查询 效果开源仓库 前言 在CSDN平台申请“专家博主”、“优质创作者”等称号的时候&#xff0c;往往会对博客的质量分有一定的要求&#xff0c;这时候我们需要审视以往所发表的博客&#xff0c;找出质量分较低的博客&#xff0…

春秋云境 | 文件上传 | CVE-2022-23880

靶标介绍 taoCMS v3.0.2 文件管理处存在任意文件上传漏洞&#xff0c;攻击者可执行任意代码 开启靶场 点击下面的“管理” 发现是一个登录页面 右击点检查 发现默认账号和密码&#xff0c;登录进去的页面如图所示 创建一句话木马 找到了文件管理功能&#xff0c;新建一个 sh…

正则表达式测试工具

前言 正则表达式测试工具可供您输入正则表达式和测试文本&#xff0c;立即查看匹配结果. 下面是离线的HTML文件,同样可以提供相同的服务. 目录 使用说明 HTML代码 正则表达式的编写经验和方法 总结 使用说明 1.先将HTML代码存储成.html为后缀的文件; 2.然后用浏览器打开这个…

企业需要了解的平滑替代FTP 的文件传输软件知识

虽然传统的FTP曾经是行业的标准&#xff0c;但随着技术的发展&#xff0c;其局限性逐渐出现&#xff0c;促使各行业寻求更高效、更安全的解决方案。然而&#xff0c;面对市场上许多替代FTP软件&#xff0c;测试也消耗了人力和物质资源。今天&#xff0c;小编将分析市场上企业寻…

前端性能优化-图片优化

前言 本文总结 web 性能优化中图片优化的相关知识点。 一些背景知识 有损压缩&#xff08;Lossy Compression&#xff09; 有损压缩是一种图像压缩方法&#xff0c;通过牺牲一些图像细节以减小文件大小。JPEG 是一种常见的有损压缩图像格式。在压缩过程中&#xff0c;一些数…

火柴游戏(match)-2022蜀山区赛初中组第3题

题目描述 锤锤和柯西在玩火柴棒游戏&#xff0c;他们用火柴棒拼成不同的数字。规则如下&#xff1a; 这是火柴所形成10个数字的方式&#xff0c;每个数字所需的火柴数量不一样。现在给两人每人发N根火柴棒。锤锤要用所有火柴棒摆出其所能摆出最小的数&#xff0c;而柯西则需要…

【简历】吉林某985大学:Java简历指导,面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份顶级985的25届Java简历。顶级985现在的目标只有一个&#xff0c;就是大厂秋招。那么这位同学跟211和普通同学比&#xff0c;优势还…

【JVM】Java内存区域图文详解

1.JVM运行时区域总览 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JVM运行时区域也成为Java内存区域。 在讨论Java内存模型时&#xff0c;通常将其分为线程共享区域和线程私有区域&#xff1a; 2.线程私有区域 2.1.程序计数器 程序计…

springboot船舶维保管理系统--论文源码调试讲解

第二章 相关技术 本次开发船舶维保管理系统使用的是Vue进行程序开发&#xff0c;船舶维保管理系统的数据信息选择MySQL数据库进行存放。 2.1 VUE介绍 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue…

Unity入门1——基本操作

VIew工具 选中View工具后&#xff0c;按住鼠标左键&#xff0c;即可实现拖拽 按住Alt鼠标右键&#xff0c;移动鼠标即可实现缩放&#xff08;或使用鼠标滚轮&#xff09; Move工具 选中移动工具&#xff0c;即可对界面中的物品进行移动。快捷键W 快速定位物体 在层级管理器中…

回溯分割+子集篇--代码随想录算法训练营第二十二天| 131.分割回文串,93.复原IP地址,78.子集,90.子集II

131.分割回文串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a;131.分割回文串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串 。返回 s 所有可能的分割方案。 示例 …

2.3 Python 基本运算符

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

C++ STL专题 list的讲解

目录 1.list的介绍和使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.list的介绍和使用 1.1 list的介绍 1.list是可以在常数范围内任意位置进行插入和删除的序…