![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP会员 | 芯片代购 | 客户评价 | | ||
|
||
|
|||||
| uclinux-2008r1(bf561)内核中的EXPORT_SYMBOL | |||||
作者:快乐虾 文章来源:http://blog.csdn.net/lights_joy 点击数: 更新时间:2008-5-21 ![]() |
|||||
|
在uclinux内核中,随处可见EXPORT_SYMBOL的定义,它的作用在于为动态插入内核的模块提供一个符号表,使之能调用内核中的函数。因而,如果内核不需要支持insmod,那么自然也就不需要EXPORT_SYMBOL。实际上,在内核没有定义CONFIG_MODULES这个宏的时候,EXPORT_SYMBOL这个宏定义什么也不做:
#define EXPORT_SYMBOL(sym)
而当需要支持insmod的时候,这个宏的定义就变成了:
#define MODULE_SYMBOL_PREFIX ""
#define __CRC_SYMBOL(sym, sec)
/* 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"))) \
= 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, "")
下面以一个实际的EXPORT_SYMBOL来分析一下这个宏的作用。在mm/nommu.c的开头有这样的语句:
struct page *mem_map;
EXPORT_SYMBOL(mem_map);
代入EXPORT_SYMBOL宏之后就变成了:
extern struct page * mem_map;
static const char __kstrtab_mem_map[]
__attribute__((section("__ksymtab_strings")))
= “mem_map”;
static const struct kernel_symbol __ksymtab_mem_map
__attribute_used__
__attribute__((section("__ksymtab" sec), unused))
= { (unsigned long)&mem_map, __kstrtab_mem_map }
在这里kernel_symbol定义为:
struct kernel_symbol
{
unsigned long value;
const char *name;
};
很明显,在这里定义了两个全局变量__kstrtab_mem_map和__ksymtab_mem_map,值得注意的是这两个变量都是放在特定的section中的,据此猜测insmod在读取模块文件后,必须根据此模块的符号表中的名称在__ksymtab这个段中按顺序查找符号,再将此符号相对应的value替换掉动态模块中的指针(当然,目前还不理解insmod是如何取得这个段的首地址的)。
在vmlinux.lds.s中为这两个段留了空间:
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ksymtab) = .; \
*(__ksymtab) \
VMLINUX_SYMBOL(__stop___ksymtab) = .; \
} \
/* Kernel symbol table: strings */ \
__ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
*(__ksymtab_strings) \
} \
以上两个定义出现在RO_DATA的宏定义中,在vmlinux.lds.s中使用了此宏定义。
|
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 前置放大器在移动医疗服务系 便携式多通道大容量生理信号 防腐监测仪的设计与应用 基于AD1674的酶标仪的设计 基于C/S模式的JRTPLIB库的测 ffmpeg与jrtplib相结合应用 blackfin模拟摄像头驱动中的 可编程逻辑在数字信号处理系 发现VDSP4.5一个BUG:单步调 VDSP5.0双核工程下sml3中的变 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 本站介绍 | 合作联络 | 欢迎投稿 | 广告业务 | 网站地图 | 设为首页 | 加入收藏 | 友情链接 | 网站公告 | 联系我们 | | |||
|