内核符号导出
2013-05-11 19:46
148 查看
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(符号)导出定义的内核符号,
这里的符号即是我们的函数名。
#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(符号)导出定义的内核符号,
这里的符号即是我们的函数名。
相关文章推荐
- linux内核导出符号
- 如何导出内核模块符号以及如何引用导出的符号
- 获取Linux内核未导出符号的几种方式
- 关于linux-2.6.26内核以后版本中出现的符号导出无法被调用的问题
- linux内核导出符号
- 内核符号导出
- 内核符号导出例子
- Linux内核导出符号宏定义EXPORT_SYMBOL的源码分析
- linux驱动开发--导出内核符号
- 导出内核符号 EXPORT_SYMBOL insmod: error inserting 'mod2.ko': -1 Unknown symbol in module
- 内核模块导出符号使用
- 获取Linux内核未导出符号的几种方式
- 导出内核符号错误!(err -22)
- Linux 驱动开发之内核模块开发(四)—— 符号表的导出
- linux驱动开发---导出内核符号
- Driver:搭建linux驱动开发环境、内核驱动开发基础、导出符号、打印优先级
- 转载_获取Linux内核未导出符号的几种方式
- 内核符号表导出EXPORT_SYMBOL
- Linux 驱动开发之内核模块开发(四)—— 符号表的导出
- 内核模块编程---符号导出(EXPORT_SYMBOL()) (3)