关于对内核模块基本操作的总结
关于对模块的基本操作,也无非是以下几种:
1.
编译模块
2.
添加模块
3.
查看模块
4.
删除模块
编译模块
就是按照内核程序的规则写一个具有特定功能的模块,当然一般都是用C语言写的,然后用编译内核文件的特定方法
―
make
,来编译源代码,在此之前,首先要写一个Makefile文件,添加必要的命令来顺利的完成内核文件的编译操作。
需要注意的是格式,然后是命令同在c环境编译程序也不一样了,举例说明如下:
############Makefile##############
#Hello world module example Makefile //
简要说明文档的目的或作用;
ifneq($(KERNELRELEASE),)
ç
判断变量KERNELRELEASE是否被定义
obj-m :=hello.o
ç
”
:=
”
用变量来定义变量的方法;前面的变量不能使用后面的变量;
else
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
ç
设定内核源代码位置;
#
”
?=
”
的意思是如果变量KERNELDIR没有被定义,就使用后面的值,如果已定义则不执行;
PWD := $(shell pwd)
ç
定义PWD变量;
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
endif
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。变量会在使用它的地方精确地展开,就像 C/C++中的宏一样
定义$(MAKE)宏变量的意思是,也许我们的 make 需要一些参数,所以定义成一个变量比
较利于维护.
obj-m的作用是同一目录中可以有多个不同的可加载软件模块,一个可加载软件模块可以有多个.s/.c组成。
------------------------------------------------------------------------------------
hello.c
----------------------------------------------------------------------------------
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
char *who="world";
static int hello_init(void)
{
printk(KERN_ALERT "Hello, %s!\n", who);
ç
加载模块成功后返回的信息;
return 0;
}
//
将函数定义为static是避免模块外的函数来调用;
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, %s!\n",who);
ç
卸载模块是显示的信息;
}
module_init(hello_init);
ç
定义的一个宏函数
将这两个文件放到一个目录中然后执行
make
,会出现以下结果:
顺利的话会出现一个后缀是
ko
的文件,就是就是生成的模块。
添加模块
接着上步执行命令:
insmod hello.ko
出现以下结果
得到了预计的反馈信息,说明加载模块成功了。
查看模块
查看已经加载的模块的命令是
lsmod,
可以加一个管道符来查看指定的模块。
可以看到已经出现了,我们制作的模块
hello.
删除模块
删除一个模块,也就是把一个模块从内核中卸载掉,其命令是:
rmmod
格式:
rmmod
模块名
可以看到,模块卸载之后,显示出了预期的信息,说明卸载模块成功了。
综上所说,对于模块的操作,命令并不麻烦,关键是
Makefile
文件的编写,模块程序的编写,所有在内核模块的操作这个环节里,主要还是需要有一定的编程基础,才能很好的完成相关的任务。