uclinux-2008r1(bf561)内核中的EXPORT_SYMBOL
来源:互联网 发布:电杆定位仪器软件 编辑:程序博客网 时间:2024/05/29 15:17
在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中使用了此宏定义。
- uclinux-2008r1(bf561)内核中的EXPORT_SYMBOL
- uclinux-2008r1(bf561)内核中的per_cpu
- 再读uclinux-2008r1(bf561)内核中的bootmem
- uclinux-2008r1(bf561)内核中的zonelist初始化
- uclinux-2008r1(bf561)内核的icache支持(3):__fill_code_cplbtab
- uclinux-2008r1-rc8(bf561)内核的console(1):数据结构
- uclinux-2008r1(bf561)内核存储区域初探
- uclinux-2008r1(bf561)内核的icache支持(1):寄存器配置初始化
- uclinux-2008r1(bf561)内核的icache支持(2):icplb_table的生成
- uclinux-2008r1(bf561)内核的icache支持(4):换页问题
- 再读uclinux-2008r1-rc8(bf561)内核的中断处理(1):数据结构
- 重读uclinux-2008r1-rc8(bf561)内核的中断处理(2):中断配置
- 重读uclinux-2008r1-rc8(bf561)内核的中断处理(3):中断处理流程
- 重读uclinux-2008r1-rc8(bf561)内核的中断处理(4):特定处理函数
- uclinux-2008r1-rc8(bf561)内核的console(2):驱动初始化
- uclinux-2008r1-rc8(bf561)内核的console(3):通过console输出信息
- uclinux-2008r1(bf561)内核中与存储管理相关的几个全局变量
- uclinux-2008r1(bf561)内核中内存管理相关的几个结构体
- JavaScript 与 ActionScript 3.0 交互的一些问题
- 活着
- VC++ 删除文件夹
- 分工
- 至胜!我的最爱!{原创漫画欢迎转载}o(∩_∩)o...
- uclinux-2008r1(bf561)内核中的EXPORT_SYMBOL
- 《数据库系统概论》课本P127 参考答案
- 隐藏链接在地址栏出现,点击时,按住不放,mouseover时,
- uclinux-2008R1-RC8(bf561)到VDSP5的移植(36):__per_cpu_start
- 默哀
- 判断是否来自搜索引擎链接
- VC6工程转换到VC8(转载)
- 网页变灰
- 在 Ubuntu Linux 上安装 Java 和 Eclipse