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