内核符号导出
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
![](http://img.blog.csdn.net/20130511145351161)
这是calculate.c
![](http://img.blog.csdn.net/20130511145550954)
这是hello.c
![](http://img.blog.csdn.net/20130511145818090)
这是Makefile
3、首先来看不导出内核符号的情况
3、1屏蔽calculate.c
/*EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);*/
3、2编译内核模块 #make
![](http://img.blog.csdn.net/20130511150237487)
3.3加载内核模块
#insmod calculate.ko
#lsmod | grep calculate 使用lsmod查看该内核模块是否被加载
![](http://img.blog.csdn.net/20130511150600403)
#insmod hello.ko 加载内核模块,注意观察模块加载时的输出信息
![](http://img.blog.csdn.net/20130511151231250)
说明大家可以发现在加载内核hello内核模块时,报出错误语句“hello.ko -I Unkonwn symbol in module”,意思是在加载模块时不能识别一些符号。为什么呢?因为hello.c中使用了add_integar和sub_integar这两个 内核符号,而我们的内核又没有导出这些符号,所以就不能使用。那我们如何知道所使用的内核符号是否已导出,内核中又导出了哪些符号?别急,接着往下看
3、4查看当前环境下内核导出了哪些符号
#cat /proc/kallsyms >log
#vi log
![](http://img.blog.csdn.net/20130511153235024)
说明:大家可以看到内核导出了很多符号,为了能快速的找到我们所需要的符号,使用重定向和grep来搜索
#cat /proc/kallsyms | grep add_integar
#cat /proc/kallsms | grep sub_integar
![](http://img.blog.csdn.net/20130511153934026)
说明:通过观察发现,虽然/proc/kallsyms中有关键字add_integar和sub_integar,但这并不是我们所需要的内核符号,也就是说当前内核 没有导出我们所需要的内核符号
3、5卸载内核模块
#rmmod calculate
#lsmod
![](http://img.blog.csdn.net/20130511160043313)
4、接着来看内核符号导出的情况
4、1修改calculate.c
![](http://img.blog.csdn.net/20130511160502774)
4、2编译内核模块
#make clean
#make
4、3加载内核模块
#insmod calculate.ko
注:先加载内核模块calculate.ko
#insmod hello.ko
注:再加载内核模块hello.ko
![](http://img.blog.csdn.net/20130511163338969)
说明:通过打印信息可以发现,当我们把所需要的内核符号导出时,hello.ko内核模块被正确加载
#lsmod | grep calculate
#lsmod | grep hello
![](http://img.blog.csdn.net/20130511163842069)
4、4查看当前环境下内核是否导出了需要的符号
#cat /proc/kallsyms | grep add_integar
![](http://img.blog.csdn.net/20130511164914314)
说明:上图语句“__ksymtab_add_integar”表明内核符号add_integar已导出。
#cat /proc/kallsyms | grep sub_integar
![](http://img.blog.csdn.net/20130511165208480)
说明:上图语句“__ksymtab_sub_integar”表明内核符号sub_integar已导出。
4、5卸载内核模块
#rmmod hello
注:必须先卸载内核模块hello,因为在内核卸载函数中要使用到内核导出的符号sub_integar。
![](http://img.blog.csdn.net/20130511193806693)
说明:在模块写在函数中,内核模块卸载函数hello_exit被调用,该函数使用了内核导出的符号sub_integar。
#rmmod calculate
#lsmod | grep hello
#lsmod | grep calculate
![](http://img.blog.csdn.net/20130511194210904)
说明:通过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(符号)导出定义的内核符号,
这里的符号即是我们的函数名。
相关文章推荐
- Golang Channel 整理
- 游标使用基础
- 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
- 黑马程序员----0704期java基础班心得
- Android动画进阶—使用开源动画库nineoldandroids——1
- 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android Studio 常用插件
- html5桌面通知,notification的使用,右下角出现通知框
- poj 2424 Flo's Restaurant
- 父类指针能否找到子类成员及定位虚指针
- ext is not defined
- 关于为何会启用CSDN博客说明
- Entity Framework6 with Oracle(可实现code first)
- Qt之操作Excel
- 在Eclipse发展Webapp部署过程,缓存的位置
- 多文件makefile
- HDU 2016 数据的交换输出
- html5全局属性
- 解决eclipse中android添加重载函数时参数为arg0,arg1的问题
- 吃的亿万市场里,菜谱软件是如何占领了山头?