EXPORT_SYMBOL

来源:互联网 发布:工程预算软件哪个好 编辑:程序博客网 时间:2024/05/22 18:22

参考:http://shaojiashuai123456.iteye.com/blog/840015


include/linux/module.h:

/* For every exported symbol, place a struct in the __ksymtab section */#define __EXPORT_SYMBOL(sym, sec)\extern typeof(sym) sym;\__CRC_SYMBOL(sym, sec)\static const char __kstrtab_##sym[]\__attribute__((section("__ksymtab_strings"), aligned(1))) \= MODULE_SYMBOL_PREFIX #sym;                    \static const struct kernel_symbol __ksymtab_##sym\__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")#define EXPORT_SYMBOL_GPL_FUTURE(sym)\__EXPORT_SYMBOL(sym, "_gpl_future")


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

4./proc/kallsyms
cat /proc/kallsyms会打印出内核当前的符号表,例如:
...
d8834a24 t snd_free_sgbuf_pages [snd_page_alloc]
c0180d7a U create_proc_entry [snd_page_alloc]
d88341d8 T snd_dma_free_pages [snd_page_alloc]
c013d858 U __get_free_pages [snd_page_alloc]
d8834ab5 t snd_malloc_sgbuf_pages [snd_page_alloc]
c014f906 U kmem_cache_alloc [snd_page_alloc]
c0106dcd U dma_alloc_coherent [snd_page_alloc]
...
其中第一列是该符号在内核地址空间中的地址;第二列是符号属性,小写表示局部符号,大写表示全局符号,具体含义参考man nm; 第三列表示符号字符串. 
这里只显示EXPORT_SYMBOL,EXPROT_SYMBOL_GPL处理过的符号。

5.System.map内核符号文件
通过more /boot/System.map 可以查看内核符号列表。
可以显示编译好内核后所有在内核中的符号,模块中的要另行查看。

6.通过nm vmlinux也可以查看内核符号列表
可以显示编译好内核后所有在内核中的符号,模块中的要另行查看。

原创粉丝点击