内核分析:EXPORT_SYMBOL解析

linux内核模块(2)导出符号 /*本文由真胖子同志私人定制,烦请转载保留来源*/ 内核模块不但可以使用内核和其他模块导出的符号,还可以向外部导出自己的符号。如果一个模块向外界导出符号,那么模块的编译工具链将负责生成这写导出符号的section(都带有SHF_ALLOC标志),所以在模块的加载过程中会被搬移到CORE section区域。 (1)    导出符号的定义 内核用structkernel_symbol来表示 阅读详情
Kernel. EXPORT_SYMBOL解析
 
Code Segment:
 
include/module.h:
 
struct kernel_symbol 
{
    unsigned long value;   
    const char *name;
};

/* For every exported symbol, place a struct in the __ksymtab section */
#define __EXPORT_SYMBOL(sym, sec)               \
    __CRC_SYMBOL(sym, sec)                  \
    static const char __kstrtab_##sym[]         \
    __attribute__((section("__ksymtab_strings")))       \
    = MODULE_SYMBOL_PREFIX #sym;                        \
    static const struct kernel_symbol __ksymtab_##sym   \
    __attribute_used__                  \
    __attribute__((section("__ksymtab" sec), unused))   \
    = { (unsigned long)&sym, __kstrtab_##sym }

#define EXPORT_SYMBOL(sym)                  \
    __EXPORT_SYMBOL(sym, "")

#define EXPORT_SYMBOL_GPL(sym)                  \
    __EXPORT_SYMBOL(sym, "_gpl")

#endif

 
Analysis:
 
1. kernel_symbol: 内核函数符号结构体
value: 记录使用EXPORT_SYMBOL(fun),函数fun的地址
name: 记录函数名称("fun"),在静态内存中
 
2. EXPORT_SYMBOL(sym) :导出函数符号,保存函数地址和名称
 
宏等价于:(去掉gcc的一些附加属性,MODULE_SYMBOL_PREFIX该宏一般是"")
 
static const char __kstrtab_sym[] = "sym";
static const struct kernel_symbol __ksymtab_sym =
    {(unsigned long)&sym, __kstrtab_sym }
 
 
3. gcc 附加属性

1>. __atrribute__ 指定变量或者函数属性。在此查看详细http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Variable-Attributes.html#Variable-Attributes。
 
__attribute((section("section-name")) var : 编译器将变量var放在section-name所指定的data或者bss段里面。
 
很容易看出:EXPORT_SYMBOL(sym)将sym函数的名称__kstrtab_sym记录在,段名为"__kstrtab_strings"数据段中。 将sym所对应的kernel_symbol记录在名为__ksymtab段中。
EXPORT_SYMBOL_GPL(sym) 和EXPORT_SYMBOL不同之处在于sym对应的kenel_symbol记录在__ksymtab_gpl段中。
Linux入门(一) -- EXPORT_SYMBOL小结 Linux入门 – EXPORT_SYMBOL小结EXPORT_SYMBOL能够将函数以符号的形式导出给其他模块使用。当使用EXPORT_SYMBOL导出函数之后,我们可以在/proc/kallsyms中查到导出的函数,其显示格式如下:[root@cosysn ~]# tail /proc/kallsyms ffffffffa000a720 T dm_io [dm_mod] ffff 阅读详情

相关推荐

三轴云台稳定控制算法优化实战:从PID到模糊自适应

本文深入探讨了三轴云台稳定控制算法的优化实践,从经典PID控制到模糊自适应算法的进阶应用。通过实战案例和代码示例,详细解析了PID调参技巧、模糊控制实现及多传感器数据融合方法,帮助工程师在复杂环境下提升云台抗干扰能力和响应速度,特别适用于无人机航拍等场景。

green的博客 908

Kernel. EXPORT_SYMBOL解析

Kernel. EXPORT_SYMBOL解析 Code Segment: include/module.h: struct kernel_symbol {    unsigned long value;       const char *name;}; /* For every exported symbol, place a struct in the __k

GAME-LAB(游戏开发,微信公众号:fury-programer) 5048

缠论 公式 自动画线 画笔 中枢 买卖点 源代码

【代码】缠论 公式 自动画线 画笔 中枢 买卖点 源代码。

weixin_40835859的博客 2万+

内核EXPORT_SYMBOL函数讲解(二)

书接上文,在https://blog.youkuaiyun.com/weixin_37867857/article/details/84526808这个博客里面写到EXPORT_SYMBOL函数使用就是把导出的符号以符号值+符号的字符串表示的形式表示的。只是讲解了EXPORT_SYMBOL宏的作用就是把导出的符号以符号名称+符号值的形式存储在struct kernel_symbol为数据结构的文件里面,如果文...

weixin_37867857的博客 2630

CLion for Mac(m1)配置GCC编译器

条件:电脑已经下载过XCode 一. 下载HomeBrew homebrew是一款macos,linux下的包管理工具,我们需要使用他来下载GCC 下载方法: 1.打开终端(terminal) 2.输入 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ps.有可能会遇到的问题 我当初下载挂了VPN,优快云上还有很多解决问题的方法,可以将错误信

supermario19的博客 7845

Android14_MTK调试LCD屏功能

android14 MTK平台调试LCD屏

m0_37786046的博客 1469

如何在一分钟内解决Windows系统崩溃问题

Dirk A. D. Smith / translate by Minghui Li系统崩溃了:如果你是幸运的,它只在你那天崩溃了。更可能的是,你好几天都会遇到这个问题,或者是几周、几个月。毕竟系统很少会只失败一次。甚至它会一直崩溃,直到你找到修复问题的方法。 本文将为你提供快速解决问题的方法,使用一个工具,你可以在几分钟内解决大约50%的windows服务器和工作站的崩溃问题,这个工具就是WinDbg,免费的Windows调试器(debugger)。 你可能从来没用过调试器,没有这个工具或者根本不想用它。

bob_formula1的专栏 1万+

OpenClaw 实战:7个真实场景的多 Agent 落地经验

《OpenClaw实战:7个真实场景的多Agent落地经验》摘要: 作者Maynor分享了从单Agent转向多Agent架构的实战经验。最初遇到的单Agent记忆混乱问题(如Flutter助手被C++话题干扰),通过拆分专项Agent(flutter-tutor/cpp-tutor等)并配置独立workspace解决。随后面临的技能调用混乱问题,采用"基础通用能力+专属能力"分层策略,通过Clawhub管理工具市场,将工具调用准确率从60%提升至95%。最后探讨多Agent协同方案,引入

Maynor的博客 1411

2.7 Linux模块机制

1、模块插入模块的格式。驱动模块在2.6内核下编译出来是.ko文件,.ko文件也是elf格式的。elf格式的文件有3种类型:可重定位文件obj、可执行文件、共享库文件。需要注意的是,用户态编译出来的应用程序是可执行类型的elf,而.ko文件是可重定位类型的elf。 仅从文件格式上就可以看到,模块文件的加载和用户态可执行文件的动态加载机制是不一样的。1.1、外部模块插入工具Modprobe加载外部模块

pwl999的博客 2136

Android Framework AudioFlinge 面试题及参考答案

请解释什么是 AudioFlinger? AudioFlinger 是 Android 音频系统中的一个关键服务。它位于 Android 系统的中间层,是连接上层应用和底层音频硬件驱动的重要桥梁。从功能角度来讲,它主要负责音频数据的混合(Mix)以及输出(Output)。 当多个应用程序同时播放音频时,比如一个音乐播放器在播放歌曲,同时手机的闹铃响起,AudioFlinger 就会发挥它的混合功能。它会把这些不同来源的音频数据按照一定的规则和算法混合在一起。这种混合并不是简单的相加,而是要考

大模型大数据攻城狮的专栏 1573

MIKE 21 教程 2.9 初始条件(Initial Conditions),边界条件Boundary Conditions),解耦(Decoupling)

本节讲解初始条件与边界条件的设置。这两个模块如设置有误则极易出现模型崩溃。

Hello Word 4799

【linux kernel】linux 内核中EXPORT_SYMBOL()分析与实践

linux 内核中EXPORT_SYMBOL()分析与实践 linux内核版本 时间 备注 4.1.15 2021/11/1 技术总结 一、EXPORT_SYMBOL()分析 ​ EXPORT_SYMBOL实际是一个宏函数。用于将函数或者符号向全部内核代码公开,不用修改内核代码就可以在内核模块中直接调用(注意是在内核模块中),即:使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。 ​ 定义如下://出自 linux dir/include/linux/expor

iriczhao的博客 6030

国科大学习资料--数据挖掘(刘莹)--第三章习题及参考答案

国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 第 3 章分类与回归 3.1简述决策树分类的主要步骤。 答:决策树生成的过程如下: (1)对数据源进行数据预处理, 得到训练集和测试集; (2)对训练集进行训练; (3)对初始决策树进行树剪枝; (4)由所得到的决策树提取分类规则; (5)使用测试数据集进行预测,评估决策树模型; 3.2给定决策树,选项有:(1)将决策树转换成规则,然后对结果

无名何许人的博客 3090

[Linux Device Driver] 内核EXPORT_SYMBOL宏定义分析

0. 背景 EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。 在模块函数定义之后使用“EXPORT_SYMBOL(函数名)”来声明。 在调用该函数的另外一个模块中使用extern对之声明。 //经观察内核里面使用EXPORT_SYMBOL声明之后,很多不需...

编程菜汝狗 974

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

内核中 EXPORT_SYMBOL 标志分析

内核版本:Linux-4.19 1. EXPORT_SYMBOL 的作用: EXPORT_SYMBOL 定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在其它内核模块中直接调用,即使用 EXPORT_SYMBOL 可以将一个函数以符号的方式导出给其他模块使用。 EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); 这两个宏均用于给...

aiduan6474的博客 294

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

EXPORT_SYMBOL解析

 Code Segment: include/module.h: struct kernel_symbol { unsigned long value; const char *name; }; /* For every exported symbol, place a struct in the __ksymtab section */ #define __EXPORT_SYMBOL(sym, sec) / __CRC_SY

call321的专栏 824

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux内核模块符号导出:从enhance_kobj看EXPORT_SYMBOL的底层机制与最佳实践

本文深入解析Linux内核模块开发中EXPORT_SYMBOL的底层机制与最佳实践,通过enhance_kobj未定义错误案例,探讨符号导出原理、静态符号冲突处理及EXPORT_SYMBOL与EXPORT_SYMBOL_GPL的选择策略,帮助开发者避免常见陷阱并提升代码质量。

mqtt6iot的博客 773

Linux内核导出符号宏定义EXPORT_SYMBOL的源码分析

源代码: ……. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX "" #endif ……. struct kernel_symbol      //内核符号结构 {        unsignedlong value;  //该符号在内存地址中的地址        constchar *name;    /

fzubbsc的专栏 3680

加载内核模块-Unknown symbol错误分析

在调试过程中,发现一个问题,编译生成一个KO文件,insmod加载后报错: Unknown symbol var_set_integer (err 0) Unknown symbol parse_arg_eq (err 0) 问题分析思路: 一、用命令查看内核中是否已有这个内核符号, 例如要查看是否有var_set_integer这个内核符号,输入命令: #cat /proc...

qing_ping的专栏 3154

linux 内核export_symbol变量,Linux内核导出符号宏定义EXPORT_SYMBOL源代码分析

资源:…….#ifndef MODULE_SYMBOL_PREFIX#define MODULE_SYMBOL_PREFIX ""#endif…….struct kernel_symbol //内核符号结构{unsignedlong value; //该符号在内存地址中的地址constchar *name; //该符号的名称};……#define __EXPORT_SYMBO...

weixin_30941189的博客 312

linux EXPORT_SYMBOL

查看linux/export.h文件: struct kernel_symbol //内核符号结构 { unsigned long value; //该符号在内存地址中的地址 const char *name; //该符号的名称 }; 预备知识: 1、#运算符,##运算符 通常在宏定义中使用#来创建字符串 #abc就表示字符串“abc”等。 ##运算符称为预处理器的粘合剂,用来替...

金溪的博客 443
上一篇: 修改Android开机图片
下一篇: MIPI DSI
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值