内核符号导出

1、创建实验目录

#mkdir /home/guoqian/4-1-4

#cd /home/guoqian/4-1-4

2、编写内核模块代码calculate.c hello.c Makefile

内核符号导出_第1张图片

这是calculate.c

内核符号导出_第2张图片

这是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

内核符号导出_第3张图片

4、2编译内核模块

#make clean

#make

4、3加载内核模块

#insmod calculate.ko

注:先加载内核模块calculate.ko

#insmod hello.ko

注:再加载内核模块hello.ko

内核符号导出_第4张图片

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

#lsmod | grep calculate

#lsmod | grep hello

内核符号导出_第5张图片

4、4查看当前环境下内核是否导出了需要的符号

#cat /proc/kallsyms | grep add_integar

内核符号导出_第6张图片

说明:上图语句“__ksymtab_add_integar”表明内核符号add_integar已导出。
#cat /proc/kallsyms | grep sub_integar
内核符号导出_第7张图片
说明:上图语句“__ksymtab_sub_integar”表明内核符号sub_integar已导出。
4、5卸载内核模块
#rmmod hello
注:必须先卸载内核模块hello,因为在内核卸载函数中要使用到内核导出的符号sub_integar。
 
说明:在模块写在函数中,内核模块卸载函数hello_exit被调用,该函数使用了内核导出的符号sub_integar。
#rmmod calculate
#lsmod | grep hello
#lsmod | grep calculate
内核符号导出_第8张图片
说明:通过lsmod发现内核模块hello,calculate已经成功从系统中卸载了。
总结:在内核与那代码中,经常会看到内核符号导出;所以熟练的使用内核符号导出就相当必要,总结内核符号导出步骤如下:
1、定义要导出的函数
2、使用EXPORT_SYMBOL(符号)导出定义的内核符号,
这里的符号即是我们的函数名。

你可能感兴趣的:(内核符号导出)