在 Linux 中,内核模块是一种可加载的代码,允许动态扩展内核的功能,而无需重启系统。以下是内核模块的加载与卸载过程的详细说明。
1. 内核模块的概述
- 内核模块:是一个包含可以被 Linux 内核动态加载和卸载的代码的文件。通常以
.ko
(Kernel Object)为后缀。 - 用途:可以用于添加驱动程序、文件系统、网络协议等功能。
2. 加载内核模块
2.1 使用 insmod
命令
insmod
是最基本的命令,用于将模块加载到内核中。
示例:
sudo insmod my_module.ko
2.2 使用 modprobe
命令
modprobe
命令更为智能,它会自动处理模块的依赖关系。
示例:
sudo modprobe my_module
2.3 验证模块是否加载
可以使用 lsmod
命令查看当前加载的模块:
lsmod | grep my_module
3. 卸载内核模块
3.1 使用 rmmod
命令
rmmod
用于从内核中卸载模块。
示例:
sudo rmmod my_module
3.2 使用 modprobe -r
命令
modprobe -r
命令用于卸载模块,同时处理依赖关系。
示例:
sudo modprobe -r my_module
3.3 验证模块是否卸载
再次使用 lsmod
命令确认模块已被卸载:
lsmod | grep my_module
4. 模块的依赖关系
在使用 modprobe
和 modprobe -r
时,系统会自动处理模块的依赖关系。例如,如果某个模块依赖于另一个模块,modprobe
会确保先加载所需的模块。
5. 常用命令总结
-
加载模块:
sudo insmod my_module.ko
sudo modprobe my_module
-
卸载模块:
sudo rmmod my_module
sudo modprobe -r my_module
-
查看加载的模块:
lsmod
-
查看模块信息:
使用modinfo
命令可以查看模块的详细信息。
modinfo my_module
6. 编写简单的内核模块
下面是一个简单的内核模块示例。
示例代码(my_module.c
):
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_AUTHOR("Your Name");
static int __init my_module_init(void) {
printk(KERN_INFO "Hello, World!\n");
return 0;
}
static void __exit my_module_exit(void) {
printk(KERN_INFO "Goodbye, World!\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
编译模块:
需要创建一个 Makefile:
obj-m += my_module.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
然后在终端中运行以下命令编译模块:
make
7. 加载和卸载自定义模块
编译后,使用 insmod
或 modprobe
加载模块,使用 rmmod
或 modprobe -r
卸载模块。
总结
通过上述步骤,您可以有效地加载和卸载 Linux 内核模块,动态扩展内核功能,并验证模块的状态。掌握这些操作对于系统管理和开发内核模块非常重要。
标签:Linux,module,模块,卸载,modprobe,加载,my,内核模块 From: https://www.cnblogs.com/love-DanDan/p/18401137