Linux内核模块编程
Linux内核模块编程
(作者:Baron_wu 禁止转载)首先,创建一个内核模块并插入Linux内核中。这是实验第一部分
首先查看当前内核模块使用情概况:lsmod
Module:模块名
Size:模块大小
Used by:这些模块在哪被使用
接下来编写一个simple.c的程序,当加载和卸载内核模块时给出适当的消息。
代码如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/* This function is called when the module is loaded. */
int simple_init(void)
{
printk(KERN_INFO "Loading Module\n");
return 0;
}
/* This function is called when the module is removed. */
void simple_exit(void) {
printk(KERN_INFO "Removing Module\n");
}
/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");
Simple_list (模块入口点) 返回0代表成功 其他值代表失败
Simple_exit(模块退出点) 无返回值
两个函数都没有参数
接下来两个宏指令是注册模块的入口与出口
Module_init()
Module_exit()
printk()
注意入口点与出口点是如何调用系统函数printk的。Printk()是内核对应的printf(),输出传给内核加载模块,通过使用命令dmesg来查看他的内容。Printk()允许指定优先级标志。它的值在包含文件<linux/printk.h>中给出。
在这个实例中KERN_INFO是优先的。它就像被定义的一个信号消息。
最后三行属于软件许可信息,是内核模块开发的标准格式。
Simple.c用Makefile这个文件来进行编译。在终端输入make进行编译。
Makefile文件内容
obj-m += simple.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
编译后将会生成多个文件, 文件simple.ko代表编译后生成的内核模块。
首先在含有simple.c 和Makefile的文件目录下执行make命令(我的这两个文件在桌面上)
之后将会生成许多文件如下所示:
== Simple.ko是生成的内核模块 ==
接下来便是加载和移除内核模块的演示了。
首先在之前生成的编译模块的目录中执行命令:sudo insmod simple.ko
来加载内核模块
紧接着输入dmesg来查看当前内核加载情况。
在最后一行可以看到加载成功的消息。
**之后要进行的便是移除内核模块的操作。**在终端输入命令:sudo rmmod simple
接着查看是否移除成功。输入命令:dmesg
可以看到已经成功移除。
因为内核记录很快就会填满 所以定期清除缓冲区是有必要的。
执行命令:sudo dmesg -c
到此,Linux内核模块编程第一部分结束。