最近在上操作系统实验课程,课上要求在Linux环境下编写内核模块,恰巧Windows 10 2004也在前一段时间开始推送了,WSL2也就可以开始使用了,因此想着使用WSL2来完成本次实验。老实讲,相比于普通虚拟机,WSL2来做这个实验挺折腾的。下面讲讲注意事项。
这段代码是最简单的内核模块:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("GPL");
static int __init mod_init(void)
{
printk(KERN_ALERT "Hello world\n");
return 0;
}
static void __exit mod_exit(void)
{
printk(KERN_ALERT "Goodbye\n");
}
module_init(mod_init);
module_exit(mod_exit);
Makefile:
obj-m := firstmod.o
CURRENT_PATH := $(shell pwd)
VERSION_NUM := $(shell uname -r)
LINUX_PATH := /usr/src/linux-headers-$(VERSION_NUM)
all :
make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules
clean :
make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean
如果我们直接执行make
命令时,会报错
很容易理解,系统中不存在/usr/src/linux-headers-*这个文件夹,因为WSL2毕竟是经过微软修改后的,没有自带源码,因此我们需要下载源码。
使用uname -r
命令查看系统版本,本机是4.19.84-microsoft-standard,然后使用如下命令下载:
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/4.19.84-microsoft-standard.tar.gz
安装相关的依赖:
sudo apt-get install libelf-dev build-essential pkg-config
sudo apt-get install bison build-essential flex libssl-dev libelf-dev bc
然后如下命令开始编译:
sudo tar xvzf 4.19.84-microsoft-standard.tar.gz
cd WSL2-Linux-Kernel-4.19.84-microsoft-standard
zcat /proc/config.gz > .config
make -j $(nproc) //Compile the kernel and modules
sudo make -j $(nproc) modules_install
期间可能会遇到权限的问题,提权即可。
完成编译后,创建软链接:
sudo ln -s /home/yao/WSL2-Linux-Kernel-4.19.84-microsoft-standard /usr/src/linux-headers-4.19.84-microsoft-standard
请注意,这里的源码源地址请根据自己的实际情况进行修改。
然后就可以make我们的模块了,查看实验结果了。