当前位置: 首页 > 编程笔记 >

加载和删除内核模块

冯驰
2023-03-14
本文向大家介绍加载和删除内核模块,包括了加载和删除内核模块的使用技巧和注意事项,需要的朋友参考一下

可以根据需要从内核中加载或删除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!
 类似资料:
  • MANAGING THE LINUX KERNEL AND LOADABLE KERNEL MODULES 所有操作系统至少由两个主要组件组成。其中第一个也是最重要的是内核。 内核位于操作系统的中心,控制着操作系统所做的一切,包括管理内存,控制 CPU,甚至控制用户在屏幕上看到的内容。操作系统的第二个元素通常被称为用户区域,几乎包括其他所有元素。 内核被设计成一个受保护或特权的区域,只能由 roo

  • 主要内容:initramfe虚拟文件系统GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。 内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块

  • 问题内容: 我尝试安装内核模块。它已成功安装在容器内。确实令人惊讶,但是没有在容器内或主机系统中列出此模块。如何在容器中装入新的内核模块?(容器,主机) 问题答案: 容器通过系统调用与内核交互,并且不包含内核的任何部分或容器内部的内核模块。这就是为什么容器设计轻巧且便于携带的原因之一。xfsprogs也是用户空间程序,而不是内核模块。 如何在容器中加载新的内核模块?(CentOS容器,Ubuntu

  • 本文向大家介绍ajax实现页面加载和内容删除,包括了ajax实现页面加载和内容删除的使用技巧和注意事项,需要的朋友参考一下 ajax最大的好处就在于加载和删除的时候不会跳转页面,现在的网页大多都会选择用ajax来写,相比嵌入PHP代码来说减少了代码量,同时加载页面也会比较快,下面是用ajax以数据库fruit表为例写的加载页面和水果的删除,刚开始用ajax可能写起来还是会比较手生,就当是练习好了。

  • 嘿,伙计们,我需要帮助删除这个按钮并从json文件中加载数据,而不需要点击这个按钮。下面是代码 //从json文件获取内容 @重写小部件构建(BuildContext上下文){Future readJson()异步{final String response=await rootBundle.loadString('assets/aaaa.json');final data=await json.

  • 问题内容: 我有一个同时具有两个外部内核模块和一个用户空间守护程序的应用程序。我想在启动时从用C编写的守护程序代码中加载模块,然后在干净退出时将其卸载。我可以用比使用相应的方式更干净的方式加载它们吗? 问题答案: 最小的可运行示例 使用此简单的参数打印机模块,在QEMU + Buildroot VM和Ubuntu 16.04主机上进行了测试。 我们使用/ 和 Linux系统调用。 Linux内核为