可以根据需要从内核中加载或删除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!