编写内核模块
该模块装载时会在内核态显示Hello
,卸载时会显示Bye
,具体代码如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Yige LIU");
MODULE_DESCRIPTION("hello module");
static int __init hello_init(void){
/* 使用KERN_WARING参数,防止printk等级过低不能在控制台输出而被写入日志 */
printk(KERN_WARNING "Hello Yige LIU! I'm installed.\n");
return 0;
}
static void __exit hello_exit(void){
printk(KERN_WARNING "Bye Yige LIU! I'm removed.\n");
return;
}
module_init(hello_init);
module_exit(hello_exit);
编写Makefile
如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR := /usr/src/linux-headers-$(shell uname -r)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
endif
配置源码与依赖
由于笔者使用的是WSL2,而其中并没有包含源码,因此需要下载源码并编译。首先查看WSL版本,如下:
在GitHub上下载源码,命令如下:
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/4.19.128-microsoft-standard.tar.gz
安装依赖如下:
sudo apt-get install build-essential pkg-config bc
编译并创建软链接
依次执行如下命令:
sudo tar xvzf 4.19.128-microsoft-standard.tar.gz
cd WSL2-Linux-Kernel-4.19.128-microsoft-standard
sudo zcat /proc/config.gz > .config
make -j $(nproc)
sudo make -j $(nproc) modules_install
创建软链接:
sudo ln -s ~/WSL2-Linux-Kernel-4.19.128-microsoft-standard /usr/src/linux-headers-4.19.128-microsoft-standard
编译自定义模块
此时已完成前期准备工作,在自定义模块目录下执行make
完成对模块的编译,如下:
此时该文件夹下已自动生成了模块所需的文件,如下:
测试
安装并卸载该模块,随后使用dmesg
查看内核态输出,以验证模块是否成功安装并卸载,如下:
观察到已成功安装模块并卸载。