曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 11623|回复: 0
打印 上一主题 下一主题

内核符号表(The kernel Symbol Table)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-8-13 00:16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
所谓内核符号表就是在内核内部函数或变量中可供外部引用的函数和变量的符号表。在 2.6 内核下,使用以下命令可以看到内核符号表:
beyes@linux-beyes:/> cat /proc/kallsyms | more
c0100000 T _text
c0100000 T startup_32
c0100054 t default_entry
c01000b0 T startup_32_smp
c0100132 t checkCPUtype
c01001b3 t is486
c01001ba t is386
c0100227 t check_x87
c010025a t setup_idt
c0100277 t rp_sidt
c01002fa t early_divide_err
c0100300 t early_illegal_opcode
.... ....
在内核符号表中,左边一列是符号地址,右边一列是函数和变量。在一个模块加载后,任何一个被模块导出的符号都会成为内核符号表的一部分。一般情况下,你设计的一个模块实现了自己所需的功能,这里也并不一定需要要所有的符号都导出来。但是,如果希望别人也能用到自己的模块,那就需要将其导出。

使用以下宏可以导出符号到内核符号表:
EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);

使用 EXPORT_SYMBOL_GPL() 只用于包含 GPL 许可权的模块。

示例代码
#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

int add_int(int a, int b)
{
    return (a + b);
}

int sub_int(int a, int b)
{
    return (a - b);
}

EXPORT_SYMBOL(add_int);
EXPORT_SYMBOL(sub_int);

编译后用 insmod 加载到内核中,然后执行以下命令:
beyes@linux-beyes:~/C/kernel/modadd> cat /proc/kallsyms |grep add_int
f9d70034 r __ksymtab_add_int    [modadd]
f9d7004c r __kstrtab_add_int    [modadd]
f9d70040 r __kcrctab_add_int    [modadd]
6ce40a9f a __crc_add_int    [modadd]
f9d70000 T add_int    [modadd]
(滤掉一些多余的输出)
beyes@linux-beyes:~/C/kernel/modadd> cat /proc/kallsyms |grep sub_int
f9d7002c r __ksymtab_sub_int    [modadd]
f9d70044 r __kstrtab_sub_int    [modadd]
f9d7003c r __kcrctab_sub_int    [modadd]
bb5e85f9 a __crc_sub_int    [modadd]
f9d70004 T sub_int    [modadd]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 00:27 , Processed in 0.079218 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表