Linux 驱动开发之内核模块开发(四)—— 符号表的导出

本文详细介绍了Linux内核模块开发中如何使用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏来导出符号,以供其他模块使用。讨论了这两个宏的工作原理,以及它们在模块加载时如何帮助查找导出的变量地址。还阐述了正确的使用方法,包括在模块函数定义后使用导出宏,以及在调用模块中进行extern声明。最后,强调了加载和卸载模块的顺序以确保正确调用导出函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏。 如果你的模块需要输出符号给其他模块使用,应当使用下面的宏定义:

EXPORT_SYMBOL(name);

EXPORT_SYMBOL_GPL(name);   //只适用于包含GPL许可权的模块;

     这两个宏均用于将给定的符号导出到模块外. _GPL版本的宏定义只能使符号对GPL许可的模块可用。 符号必须在模块文件的全局部分导出,不能在函数中导出,这是因为上述这两个宏将被扩展成一个特殊用途的声明,而该变量必须是全局的。这个变量存储于模块的一个特殊的可执行部分(一个"ELF段" ),在装载时,内核通过这个段来寻找模块导出的变量(感兴趣的读者可以看<linux/module.h>获知更详细的信息)。


一、宏定义EXPORT_SYMBOL分析

1、源码

<include/linux/moudule.h>

…….

#ifndef MODULE_SYMBOL_PREFIX
#define MODULE_SYMBOL_PREFIX ""
#endif

…….

struct kernel_symbol       //内核符号结构
{
       unsignedlong value;  //该符号在内存地址中的地址
       constchar *name;     //该符号的名称

};

……

#define __EXPORT_SYMBOL(sym,sec)                                 \
       externtypeof(sym) sym;                                                        \
       __CRC_SYMBOL(sym,sec)                                            \
       staticconst char __kstrtab_##sym[]                                 \
       __attribute__((section(“__ksymtab_strings”),aligned(1)))   \
       =MODULE_SYMBOL_PREFIX#sym;                      \
       staticconst struct kernel_symbol __ksymtab_##sym         \
       __used           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值