博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Kernel. EXPORT_SYMBOL解析
阅读量:7061 次
发布时间:2019-06-28

本文共 1387 字,大约阅读时间需要 4 分钟。

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__ 指定变量或者函数属性。 在此查看详细 。
 
__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段中。

转载于:https://www.cnblogs.com/jack204/archive/2011/10/12/2208692.html

你可能感兴趣的文章
导出文件名带时间信息的dmp文件
查看>>
zencart简单设置分类链接不同css样式
查看>>
4、移植三星官方内核
查看>>
jsp页面中jstl标签详解[转]
查看>>
linux下配置jdk+tomcat
查看>>
codeforce div 377
查看>>
使用 RGraph(HTML5) 绘制折线图(一)
查看>>
FreeCodeCamp 中级算法记录
查看>>
k8s入门系列之扩展组件(一)DNS安装篇
查看>>
基于Elastic Stack最新版本搭建ELK
查看>>
j抽奖
查看>>
[算法] dijkstra单源无负权最小路径算法
查看>>
字符串的全排列
查看>>
mysql实战39 | 自增主键为什么不是连续的?
查看>>
软件架构师的修炼之道
查看>>
[HDU 1372] Knight Moves
查看>>
java代码实现 金字塔(倒置)
查看>>
NOIP2015DAY2T2子串
查看>>
5种PHP创建数组的方式
查看>>
24. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
查看>>