linux内核模块加载及卸载

由于LINUX设备驱动以内核模块的形式而存在,因此,掌握这一章的内容是编写任何类型设备驱动所必须的。在具体的设备驱动开发中,将驱动编译为内核模块也有很强的工程意义,因为如果将正在开发中的驱动直接编译入内核,而开发过程中会不断修改驱动的代码,则需要不断地编译内核并重启内核,但是如果编译为模块,则只需要rmmod并insmod即可,开发效率大为提高。下面说明如何添加、编译并允许LINUX模块。

除此之外还有好多有用的功能比如KVM虚拟化,都是以内核模块的方式动态地添加到内核中的。

      LINUX的模块主要由6部分组成:

      1、模块的加载函数(必须)

            当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

      2、模块的卸载函数(必须)

            当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

      3、模块许可证声明

            模块许可证(LICENSE)声明描述内核模块的的许可权限,如果不声明LICENSE,模块被加载时,将接到内核被污染的警告。

      4、模块参数(可选)

            模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。

      5、模块导出符号(可选)

            内核模块可以导出符号(symbol,对应于函数或者是变量),这样其他模块就可以使用本模块中的变量或者是函数。

      6、模块作者等信息声明(可选)

      知道了LINUX模块的组成后,我们来编写一个简单的LINUX内核模块hello.c

一、首先编写对应的驱动程序的相关内容:(最简单的hello.c程序)

按 Ctrl+C 复制代码

#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE(“Dual BSD/GPL”);
MODULE_AUTHOR(“MDAXIA”);

static int __init hello_init(void)
{
printk(KERN_ALERT “Hello world!\n”);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT “Goodbye,cruel world!”);
}
module_init(hello_init);
module_exit(hello_exit);

按 Ctrl+C 复制代码

二、编写对应Makefile文件:(注意事项Makefile,首字母大写M)

按 Ctrl+C 复制代码

ifeq ((KERNELRELEASE),) KDIR:=/lib/modules/(KERNELRELEASE),)KDIR:=/lib/modules/(shell uname -r)/build
PWD:=$(shell pwd)
modules:
$(MAKE) -C (KDIR) M=(KDIR)M=(PWD) modules
modules_install:
$(MAKE) -C (KDIR) M=(KDIR)M=(PWD) modules_install
clean:
rm -rf *.o *.ko .depend .mod.o .mod.c Module. modules.
.PHONY:modules modules_install clean
else
obj-m :=hello.o
endif

按 Ctrl+C 复制代码

三、使用make指令对程序进行编译生成目标文件hello.ko

sudo make

使用的是sudo make的指令来保证运行和文件的执行权限等等,编译的结果如下所示:

这里成功生成了我们需要的.ko文件

使用sudo make clean命令来清除相关的中间文件以及目标文件:

sudo make clean

这样就清除了所有的文件了~

四、安装加载模块,需要的是root权限:

sudo insmod ./hello.ko

这里的路径变了一下,是因为我的Ubuntu16.04的试题主机加载模块的时候,需要数字签名,但是数字签名之后还是不能正确的加载,之后就在我的虚拟机Ubuntu16.04上实验了一下,这样居然成功了,因此路径有所改变,但是驱动成功加载了。

驱动加载成功的验证方法:

cat /var/log/syslog | grep Hello

这样就显示驱动成功加载了

也可以使用lsmod来查看模块的加载:

lsmod | grep hello

使用rmmod指令来卸载驱动模块:

sudo rmmod hello

这里顺便推荐一个linux相关指令的中文查询网站:http://man.linuxde.net/

发布了5 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jiust12138/article/details/100971955