linux模块的变量与函数导出与引用

news2024/11/27 14:05:46

在这里插入图片描述

在Linux内核中,不同模块之间可以通过导出和引用函数或变量的方式来进行交互。具体而言,Linux内核提供了一些导出和引用符号的机制,这些机制可以使得不同模块之间能够访问并使用彼此的函数或变量。

导出符号的方式一般有两种:

  1. 使用EXPORT_SYMBOL宏,该宏用于导出函数或变量,例如:
/* 在一个模块中定义并导出一个函数 */
void my_function(void) {
    /* ... */
}
EXPORT_SYMBOL(my_function);
  1. 使用EXPORT_SYMBOL_GPL宏,该宏用于导出仅供GPL许可证模块使用的函数或变量,例如:
/* 在一个模块中定义并导出一个仅供GPL许可证模块使用的函数 */
void my_gpl_function(void) {
    /* ... */
}
EXPORT_SYMBOL_GPL(my_gpl_function);

引用符号的方式一般有两种:

  1. 使用extern关键字,该关键字用于声明其他模块中已经导出的函数或变量,例如:
/* 在一个模块中引用一个已经导出的函数 */
extern void my_function(void);
  1. 使用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏的对应头文件,例如:
/* 在一个模块中引用一个已经导出的函数 */
#include <linux/module.h>
#include <linux/kernel.h>

/* 声明要引用的函数 */
extern void my_function(void);

/* 在模块初始化函数中使用该函数 */
static int __init my_module_init(void) {
    my_function();
    return 0;
}

/* 注册模块初始化函数 */
module_init(my_module_init);

模块导出变量和函数不能重复

不同模块导出的变量名或函数名不能相同。在Linux内核中,导出的符号(变量或函数)的名称必须是全局唯一的,以便不同的模块能够正确地引用和使用这些符号。

如果有多个模块导出了同名的符号,那么链接器会报告符号重复定义的错误,导致内核编译失败。

为了防止符号名重复,内核通常会要求模块开发者在导出符号时,使用模块名或其他特定前缀来命名导出的符号。例如,在一个名为"my_module"的模块中,可以使用"my_module_"作为导出符号的前缀,以确保导出的所有符号都具有唯一的名称。

同时,为了方便模块之间的交互,内核提供了一些机制来避免符号名冲突,例如EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏。这些宏会将导出的符号名添加到内核的全局符号表中,确保不同模块之间可以正确地引用和使用彼此的符号。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

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

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

相关文章

【动态规划算法练习】day12

文章目录 一、978. 最长湍流子数组1.题目简介2.解题思路3.代码4.运行结果 二、413. 等差数列划分1.题目简介2.解题思路3.代码4.运行结果 三、1567. 乘积为正数的最长子数组长度1.题目简介2.解题思路3.代码4.运行结果 总结 一、978. 最长湍流子数组 1.题目简介 978. 最长湍流子…

python输出颜色(终端控制台)

python输出颜色&#xff08;终端控制台&#xff09; 1、终端ANSI2、Python自带的函数库ctypes3、colorama 1、终端ANSI 更多查看 ECHOX.bat输出文本背景和文字颜色 其中特殊字符print("Black :[30m f0 [0m Black :[40m b0 [0m")即是print("Black :\033[30m f0 …

3.设计模式之后七种模式桥接装饰者组合外观享元代理模板

1.桥接模式 bridge(抽象类的实现的子类,通过聚合间接调用接口方法 就是桥) 实现和抽象分开,使他可以独立改变结构型设计模式基于类的最小设计原则(增加功能,增加最少个数的类),通过封装 聚合和继承让不同类实现不同职责 图 23桥接模式原理图 图 26桥接模式传统解决手机操作问题…

(六)Spring源码解析:Spring AOP源码解析

〇、AOP概念 Aspect&#xff1a;切面 给业务方法增加到功能&#xff0c;切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知&#xff08;Advice&#xff09;。实际就是对主业务逻辑的一种增强。 Pointcut&#xff1a;切入点 切入点指声明的…

Nerf-Wild神经辐射场论文学习笔记 Neural Radiance Fields for Unconstrained Photo Collections

前言&#xff1a; 本文为记录自己在Nerf学习道路的一些笔记&#xff0c;包括对论文以及其代码的思考内容。公众号&#xff1a; AI知识物语 B站讲解&#xff1a;出门吃三碗饭 本篇文章主要针对其数学公式来学习其内容&#xff0c;欢迎批评指正&#xff01;&#xff01;&#x…

10-C++学习笔记-字符串

&#x1f4da; 前言 字符串是在编程中广泛使用的数据类型&#xff0c;用于表示一系列字符。在C中&#xff0c;我们可以使用C风格字符串和string类来处理字符串操作。本篇学习笔记将详细介绍字符串的相关知识。 &#x1f4d6; 1 C风格字符串 ✨ C风格字符串初始化 C风格字符…

什么是EMC存储 Clarrion存储的cache dirty或者cache lost(CACD)?

CACD是Cant assign, Cache Dirty的缩写&#xff0c;DELL EMC的专业术语。 在开始之前&#xff0c;先介绍下cache dirty的概念&#xff0c;朴素的语言就是有了脏数据&#xff0c;脏数据当然就是不能使用的数据了。为什么数据会脏呢&#xff1f;先从存储的基本概念聊起来。 为了加…

PoseiSwap 将向 Zepoch 节点持有者发放新一轮空投,生态启动在即

目前&#xff0c;随着各类 Layer2 空投不断内卷&#xff0c;越来越多的用户疲于参与其中&#xff08;参与交互也很有可能难以获得空投资格&#xff09;。Nautilus Chain 作为目前模块化 Layer3 架构链&#xff0c;在初期就明确了空投计划&#xff0c;即所有上线的应用都将会拿出…

各类农作物分布遥感监测数据大全

最近收集整理了大量的农作物分布的遥感监测数据&#xff0c;废话不多说&#xff0c;分享给大家&#xff0c;后面会持续更新&#xff01;&#xff01; 数据查看地址&#xff1a; https://www.dilitanxianjia.com/%e9%81%a5%e6%84%9f%e8%a7%a3%e8%af%91%e5%90%8e%e6%88%90%e6%9…

LeetCode 0002. 两数相加

【LetMeFly】2.两数相加 力扣题目链接&#xff1a;https://leetcode.cn/problems/add-two-numbers/ 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff…

2016年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

华为OD机试真题 Java 实现【开心消消乐】【2023 B卷 100分】

目录 一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 给定一个N行M列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为0或1。矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的1进行反…

maven高级开发

分模块设计 例如 如果需要用到其他的模块&#xff0c;直接导入模块坐标就可以了 分模块开发&#xff0c;需建立的模块&#xff0c;选择maven模型 分模块设计需要先针对模块功能进行设计&#xff0c;再进行编码。 继承与聚合 继承&#xff1a;描述的是两个工程间的关系&…

UE4/5通过插件,用GeneratedDynamicMeshActor编辑静态网格到content中

目录 制作 直接复制下面代码到蓝图中粘贴即可&#xff1a; 效果1【用了第一个函数】&#xff1a; 效果2【用了第二个函数】&#xff1a; 制作 首先我们要打开插件&#xff1a; 然后继承GeneratedDynamicMeshActor进行创建&#xff1a; 我们制作一个函数&#xff0c;这个函数将…

Draw.io | 一款强大且支持在线编辑和导出的流程图绘制神器

目录 &#x1f48c; 写在前面 &#x1f5a5;️ 软件介绍 &#x1f5a5;️ 使用方式 1. Draw.io 的核心设计元素 1.1 绘图区 1.2 快速开始 2. Draw.io 的基本操作 2.1 移动、多选、复制与删除 2.2 创建链接 2.3 图形替换与旋转 3. 使用 Draw.io 绘制简单流程图 3.1 基本…

ChatGPT Plugins内幕、源码及案例实战(三)

ChatGPT Plugins内幕、源码及案例实战(三) ChatGPT Plugins内幕、源码及案例实战 6.4 ChatGPT Retrieval Plugin全流程内幕解析 以ChatGPT检索插件为例,我们讲解一下它整个的流程,让大家有一个比较明确、清晰的统一认知:  数据存储:设立的前提是你有文档,会有一些文…

大学教材征订管理系统数据库设计

摘 要 随着计算机及Internet迅速的发展&#xff0c;越来越多的行业实现了管理的信息化和自动化&#xff0c;教育行业也不例外。但在很多高校中,教材征订作为学校教学工作中很重要的一个环节还没完全实现信息化管理。因此本系统针对高校教材征订管理过程中人工管理存在的困难&a…

(02)Cartographer源码无死角解析-(67) 2D后端优化→FastCorrelativeScanMatcher2D -分支定界算法(BranchAndBound)1

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

Java——包(package)

一、Java中的包(package) 在Java中&#xff0c;包&#xff08;package&#xff09;是一种用于组织类和接口的命名空间的机制。它用于将相关的类和接口组织在一起&#xff0c;以便更好地管理和维护代码。 其实就是一个个文件夹 二、包(package)的作用 防止类和接口命名冲突&…

时间序列分解 | Matlab变分模态分解(VMD)的信号分解

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab变分模态分解(VMD)的信号分解 部分源码 %--------------------