insmod 命令介绍
在这一步中,我们将探索 Linux 中的 insmod
命令,该命令用于将内核模块插入正在运行的内核中。内核模块是可以根据需要加载和卸载到内核中的代码片段,提供额外的功能或驱动程序。
首先,让我们检查当前的内核版本以及可用的内核模块:
uname -r
lsmod
示例输出:
5.15.0-58-generic
Module Size Used by
nvme_core 102400 1
pci_stub 16384 1
vboxpci 24576 0
vboxnetadp 45056 0
vboxnetflt 49152 0
vboxdrv 1028096 3 vboxnetadp,vboxnetflt,vboxpci
lsmod
命令列出了当前加载的内核模块。我们可以看到有几个与 VirtualBox 相关的模块,VirtualBox 是一种常见的虚拟化软件。
接下来,让我们创建一个简单的内核模块。在 ~/project
目录下创建一个名为 hello.c
的新文件,内容如下:
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple kernel module");
int init_module(void) {
printk(KERN_INFO "Hello, kernel!\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "Goodbye, kernel!\n");
}
这个模块在加载时会打印一条 "Hello, kernel!" 消息,在卸载时会打印一条 "Goodbye, kernel!" 消息。
现在,让我们编译这个内核模块:
sudo apt update
sudo apt-get install -y linux-headers-$(uname -r)
gcc -Wall -DMODULE -D__KERNEL__ -I/lib/modules/$(uname -r)/build/include -c hello.c
linux-headers-$(uname -r)
包包含了为当前内核版本编译内核模块所需的头文件。gcc
命令将 hello.c
文件编译成目标文件 hello.o
。
有了编译好的内核模块,我们现在可以使用 insmod
命令将其插入正在运行的内核中:
sudo insmod hello.o
示例输出:
insmod
命令将 hello.o
模块加载到内核中。你应该会在系统日志(例如 dmesg
)中看到 "Hello, kernel!" 消息。
为了验证模块是否已加载,运行:
lsmod | grep hello
示例输出:
hello 16384 0
输出显示 hello
模块现在已加载到内核中。