Linux内核模块编程

版权声明:[email protected] https://blog.csdn.net/Baron_wu/article/details/83346565

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内核模块编程第一部分结束。

猜你喜欢

转载自blog.csdn.net/Baron_wu/article/details/83346565