关于对内核模块基本操作的总结

关于对内核模块基本操作的总结
 
关于对模块的基本操作,也无非是以下几种:
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); ç 定义的一个宏函数
module_exit(hello_exit);
 
 
将这两个文件放到一个目录中然后执行 make ,会出现以下结果:
顺利的话会出现一个后缀是 ko 的文件,就是就是生成的模块。
 
添加模块
接着上步执行命令: insmod hello.ko
出现以下结果
得到了预计的反馈信息,说明加载模块成功了。
 
 
查看模块
查看已经加载的模块的命令是 lsmod, 可以加一个管道符来查看指定的模块。
可以看到已经出现了,我们制作的模块 hello.
删除模块
  
删除一个模块,也就是把一个模块从内核中卸载掉,其命令是: rmmod
格式: rmmod 模块名
可以看到,模块卸载之后,显示出了预期的信息,说明卸载模块成功了。
 
综上所说,对于模块的操作,命令并不麻烦,关键是 Makefile 文件的编写,模块程序的编写,所有在内核模块的操作这个环节里,主要还是需要有一定的编程基础,才能很好的完成相关的任务。
 

你可能感兴趣的:(职场,模块,内核,休闲,内核模块)