您的位置:首页 > 其它

内核符号导出

2015-07-28 12:51 309 查看
1、创建实验目录
#mkdir /home/guoqian/4-1-4
#cd /home/guoqian/4-1-4
2、编写内核模块代码calculate.c hello.c Makefile



这是calculate.c



这是hello.c



这是Makefile
3、首先来看不导出内核符号的情况
3、1屏蔽calculate.c
/*EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);*/
3、2编译内核模块 #make



3.3加载内核模块
#insmod calculate.ko
#lsmod | grep calculate 使用lsmod查看该内核模块是否被加载



#insmod hello.ko 加载内核模块,注意观察模块加载时的输出信息



说明大家可以发现在加载内核hello内核模块时,报出错误语句“hello.ko -I Unkonwn symbol in module”,意思是在加载模块时不能识别一些符号。为什么呢?因为hello.c中使用了add_integar和sub_integar这两个 内核符号,而我们的内核又没有导出这些符号,所以就不能使用。那我们如何知道所使用的内核符号是否已导出,内核中又导出了哪些符号?别急,接着往下看
3、4查看当前环境下内核导出了哪些符号
#cat /proc/kallsyms >log
#vi log



说明:大家可以看到内核导出了很多符号,为了能快速的找到我们所需要的符号,使用重定向和grep来搜索
#cat /proc/kallsyms | grep add_integar
#cat /proc/kallsms | grep sub_integar



说明:通过观察发现,虽然/proc/kallsyms中有关键字add_integar和sub_integar,但这并不是我们所需要的内核符号,也就是说当前内核 没有导出我们所需要的内核符号
3、5卸载内核模块
#rmmod calculate
#lsmod



4、接着来看内核符号导出的情况
4、1修改calculate.c



4、2编译内核模块
#make clean
#make
4、3加载内核模块
#insmod calculate.ko
注:先加载内核模块calculate.ko
#insmod hello.ko
注:再加载内核模块hello.ko



说明:通过打印信息可以发现,当我们把所需要的内核符号导出时,hello.ko内核模块被正确加载
#lsmod | grep calculate
#lsmod | grep hello



4、4查看当前环境下内核是否导出了需要的符号
#cat /proc/kallsyms | grep add_integar



说明:上图语句“__ksymtab_add_integar”表明内核符号add_integar已导出。
#cat /proc/kallsyms | grep sub_integar



说明:上图语句“__ksymtab_sub_integar”表明内核符号sub_integar已导出。
4、5卸载内核模块
#rmmod hello
注:必须先卸载内核模块hello,因为在内核卸载函数中要使用到内核导出的符号sub_integar。



说明:在模块写在函数中,内核模块卸载函数hello_exit被调用,该函数使用了内核导出的符号sub_integar。
#rmmod calculate
#lsmod | grep hello
#lsmod | grep calculate



说明:通过lsmod发现内核模块hello,calculate已经成功从系统中卸载了。
总结:在内核与那代码中,经常会看到内核符号导出;所以熟练的使用内核符号导出就相当必要,总结内核符号导出步骤如下:
1、定义要导出的函数
2、使用EXPORT_SYMBOL(符号)导出定义的内核符号,
这里的符号即是我们的函数名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: