加载和删除内核模块

可以根据需要从内核中加载或删除Linux内核模块。无需重新编译内核或重新引导系统即可完成此操作,它可以增强系统的功能。

如果没有内核模块,则操作系统将必须包括在基本内核中提供所有预期功能的所有系统。这将导致内存浪费,因为其中大多数系统不会经常使用。同样,用户每次需要新功能时,都需要重建并重新启动基本内核。

内核模块的扩展名为.ko,位于常规Linux系统的/ lib / modules // kernel /目录中。

Linux内核模块中的主要模块是:文件系统驱动程序,设备驱动程序和系统调用。

要将模块插入内核,请使用insmod命令。该命令的语法是-

insmod <module_name>.ko

要从内核中删除模块,请使用rmmod命令。程序使用的模块无法删除。rmmod <.i>命令的语法是-

rmmod <module_name>.ko

可以使用lsmod命令查看新创建的模块。此命令显示当前在系统中加载的可加载内核模块,如下所示:

创建和加载内核模块

下面给出了创建内核模块的步骤-

 让我们首先编写一个example.c程序-

 首先,添加头文件- 

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>

接下来,添加模块描述和作者详细信息。不要忘记添加许可证-

MODULE_DESCRIPTION("Kernel module 1");
MODULE_AUTHOR("Harry");
MODULE_LICENSE("GPL");

现在让我们看看如何创建内核模块-

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>

MODULE_DESCRIPTION("Kernel module 1 ");
MODULE_AUTHOR("Harry");
MODULE_LICENSE("GPL");

static int example_init(void)
{
   pr_debug("Welcome! Good to have you here!\n");
   return 0;
}

static void example_exit(void)
{
   pr_debug("Goodbye!\n");
}

module_init(example_init);
module_exit(example_exit);

在上面的程序中生成的消息不是在控制台中生成的,而是保存在特别保留的内存区域中。可以通过日志记录守护程序(syslog)从此内存区域恢复它们。

 现在让我们看看如何编译我们的内核模块-

 标准编译方法是kbuild。它使用两个文件:Makefile和Kbuild文件进行编译。Kbuild是Linux内核构建系统。

 对于Makefile-

KDIR = home/dept/so2/linux
kbuild:
make -C $(KDIR) M=`pwd`
clean:
make -C $(KDIR) M=`pwd` clean

 从上面的示例中可以看出,在Makefile文件上调用make会导致内核源目录(即home / employee / so2 / linux)中对当前目录(即M =`pwd`)的调用。此过程最终导致从当前目录读取Kbuild文件,并按照该文件中的说明编译模块。

 现在编译模块-

EXTRA_CFLAGS = -Wall -g

obj-m = example.o

插入模块-

insmod example.ko

现在,可以使用lsmod命令查看新创建的模块。lsmod命令显示当前已加载的可加载内核模块。

$lsmod
demo
glue_helper
ssdhci_acpi
sdhci_cpi
ahci

可以使用dmesg命令查看上面获得的输出。此命令用于在Linux中编写内核消息。

$dmesg | tail -2
Welcome! Good to have you here!
Goodbye!

构建模块后,将创建以下文件-

  • example.o-这是链接之前的模块目标文件

  • example.mod.c-该文件包含模块信息

  • example.mod.o-这是在example.mod.c的编译和链接之后创建的文件

  • modules.order-这提供了两个或三个模块的链接顺序

  • modules.symvers- 这指定了符号版本(如果有)。

  • example.ko-这是链接example.o和example.mod.o之后创建的模块内核对象文件

现在让我们看看上面看到的。

加载内核模块

要加载内核模块,使用insmod命令-

$insmod example.ko

现在,让我们显示模块的内容-

dmesg命令用于显示内核消息。

# dmesg | tail -2
Welcome! Good to have you here!
Goodbye!