当前位置: 首页 > news >正文

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

基础知识

模块是一种向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函数实现移除模块。具体源码如下:

相关文章:

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

基础知识 模块是一种向Linux内核添加设备驱动程序、文件系统及其他组件的有效方法&#xff0c;不需要编译新内核 优点 通过使用模块&#xff0c;内核发布者能够预先编译大量驱动程序&#xff0c;而不会致使内核映像的尺寸发生膨胀。内核开发者可以将实验性的代码打包到模块中&a…...

力扣面试经典算法150题:移除元素

移除元素 今日的题目依旧是力扣面试经典算法150题中数组相关的题目&#xff1a;移除元素 题目链接&#xff1a;https://leetcode.cn/problems/remove-element/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个排序数组 nums 和一个值 val&a…...

java关于前端传布尔值后端接收一直为false问题

前端传值&#xff1a; {"message":"我肚子疼","isChiefComplaint": true }后端接收对象结构体&#xff1a; public class SymptomInquiryDTO {private String message;private boolean isChiefComplaint; }结果后端接收到的值一直是false&…...

工具学习_CVE Binary Tool

1. 工具概述 CVE Binary Tool 是一个免费的开源工具&#xff0c;可帮助您使用国家漏洞数据库&#xff08;NVD&#xff09;常见漏洞和暴露&#xff08;CVE&#xff09;列表中的数据以及Redhat、开源漏洞数据库&#xff08;OSV&#xff09;、Gitlab咨询数据库&#xff08;GAD&am…...

智观察 | 行业赛道里的AI大模型

‍ “AI改变世界”被炒得热火朝天&#xff0c;结果就换来AI聊天&#xff1f; 实际上&#xff0c;在日常娱乐之下&#xff0c;AI正在暗暗“憋大招”&#xff0c;深入各行各业&#xff0c;发挥更专业的作用。 自动驾驶 最近“萝卜快跑”霸榜热搜长达一周&#xff0c;让无人驾…...

linux 进程 inode 信息获取

根据端口查找 ss -neltup | grep "$port"根据 pid 查找 ss -neltup | grep "pid$pid"根据 inode 查找 ss -neltup | grep "ino:$inode"根据pid查找进程打开的inode ls -al /proc/$pid/fd查看inode信息 cat /proc/$pid/net/tcp | grep $ino…...

计算机网络-网络层

负责在不同的网络之间转发数据包&#xff0c;基于数据包的 IP地址转发&#xff0c;每个数据包可以按照不同路径传输。网络层不负责丢包重传&#xff0c;以及数据包之间数据顺序的的问题。 网络设备 路由器工作在第三层&#xff1a;网络层&#xff0c;能看到网络层的地址&…...

机器学习:识别AI,GraphRAG,LoRA,线性变换,特征

1.AI识别 1.bitgrit 生成式 AI API 文档 生成式 AI 假图像检测 API 可用于以编程方式检测假图像&#xff08;即由生成式 AI 创建的图像&#xff09;。2.X Virality Prediction API 旨在预测推文的潜在病毒式传播力。https://bitgrit.net/api/docs/x_virality_prediction 2.Gr…...

阿里云SMS服务C++ SDK编译及调试关键点记录

一. 阿里云SMS服务开通及准备工作 在阿里云官网上完成这部分的工作 1. 申请资质 个人or企业 我这里是用的企业资质 2. 申请签名 企业资质认证成功后&#xff0c;会自动赠送一个用于测试的短信签名 也可以自己再进行申请&#xff0c;需要等待审核。 3. 申请短信模板 企…...

Flutter 正在迁移到 Swift Package Manager ,未来会弃用 CocoaPods 吗?

什么是 Swift Package Manager &#xff1f;其实 Swift Package Manager (SwiftPM) 出现已经挺长一段时间了&#xff0c;我记得第一次听说 SwiftPM 的时候&#xff0c;应该还是在 2016 年&#xff0c;那时候 Swift 3 刚发布&#xff0c;不过正式出场应该还是在 2018 年的 Apple…...

PDF——分割pdf的10个工具

PDF分割器是一种可用于将PDF文档分割成更小的文档甚至单个页面的工具。分割 PDF 文档的主要原因是为了更容易共享。 但该过程的成功取决于您用于拆分 PDF 的工具。较简单的工具仅提供几个选项&#xff0c;可能并不适合所有类型的文档。我们将在本文中列出的 10 个最佳 PDF 分割…...

深入解析 Nginx 反向代理:配置、优化与故障排除

深入解析 Nginx 反向代理&#xff1a;配置、优化与故障排除 Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;它以其高并发和高可扩展性在业界享有盛誉。反向代理是 Nginx 的重要功能之一&#xff0c;通过反向代理可以实现负载均衡、安全代理、缓存等多种用途。本篇文…...

深度学习入门(一):感知机与输入数据

单层感知机与多层感知机 单层感知机&#xff08;Single-Layer Perceptron&#xff09;和多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;简称MLP&#xff09;是神经网络的基本形式&#xff0c;用于执行各种机器学习任务&#xff0c;包括分类和回归。它们都基于早期…...

kubernetes 集群组件介绍

kubernetes 集群组件介绍 Kubernetes 架构 在Kubernetes&#xff08;k8s&#xff09;集群中&#xff0c;主节点&#xff08;Master Node&#xff09;和工作节点&#xff08;Worker Node&#xff09;都运行特定的软件组件&#xff0c;它们共同管理和运行容器化的应用程序。以下…...

Java | Leetcode Java题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; class Solution {public int countRangeSum(int[] nums, int lower, int upper) {long sum 0;long[] preSum new long[nums.length 1];for (int i 0; i < nums.length; i) {sum nums[i];preSum[i 1] sum;}BalancedTree treap ne…...

开发一个MutatingWebhook

介绍 Webhook就是一种HTTP回调&#xff0c;用于在某种情况下执行某些动作&#xff0c;Webhook不是K8S独有的&#xff0c;很多场景下都可以进行Webhook&#xff0c;比如在提交完代码后调用一个Webhook自动构建docker镜像 准入 Webhook 是一种用于接收准入请求并对其进行处理的…...

【leetcode详解】另一棵树的子树 (C++递归:思路精析 过程反思)

思路详解&#xff1a; 总体框架&#xff1a; 对root树进行先序遍历&#xff0c;如果当前结点&#xff08;记为cur&#xff09;的值和subRoot的根节点值相等时&#xff0c;就开始判断 以cur为根节点的树 和 子树 是否结构一样? 如何判断两棵树是否结构完全相同&#xff1f; …...

物联网遇到人工智能,极快的加速物联网时代

近些年物联网已成为众多科技企业的战略目标&#xff0c;如智能家居等&#xff0c;在未来&#xff0c;手机、传感器等智能设备都走进了生活当中&#xff0c;据数据显示已经有80%以上的的智能手机配备了人工智能。人工智能也不陌生&#xff0c;自动驾驶、人脸识别这些应用场景都是…...

Vue3+Ts项目中经常遇到导入组件,vscode报无法找到模块xxx,xxx隐式拥有 “any“ 类型解决办法~

1、报错截图&#xff1a; 2、解决办法&#xff1a;在确保路径正确的情况下&#xff0c;你会在 src 目录下找到一个名为 env.d.ts 的文件&#xff08;或者类似的名称&#xff09;。在这个文件中&#xff0c;你可以声明 .vue 文件的模块类型。例如&#xff1a;(这告诉 TypeScript…...

郑州轻工业大学zzulioj1151~1159合集

郑州轻工业大学zzulioj1151~1159合集 郑州轻工业大学zzulioj1151~1159合集 1150数数多少个整数1151大整数加法题目描述1152: 二分搜索1153简易版最长序列题目描述1154: 校门外的树1155字符串比较 多实例题目描述1156单数变复数题目描述1157连续的n个1题目描述1158又是排序&…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...