Kernel. EXPORT_SYMBOL解析

举报
aiot_bigbear 发表于 2022/09/25 03:42:09 2022/09/25
【摘要】 int snd_write_bypass = 0; EXPORT_SYMBOL_GPL(snd_write_bypass); /dav/test # cat /proc/kallsyms | grep snd_write_bypass 8051e26c r __k...



int snd_write_bypass = 0;
EXPORT_SYMBOL_GPL(snd_write_bypass);

/dav/test # cat /proc/kallsyms | grep snd_write_bypass
8051e26c r __ksymtab_snd_write_bypass
80530219 r __kstrtab_snd_write_bypass

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段中。

文章来源: blog.csdn.net,作者:悟空胆好小,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xushx_bigbear/article/details/49763907

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。