1、执行wsl -l -v,查看当前是否已经从wsl1切换到wsl2,若没有则要切换到wsl2:
2、执行wsl -v,查看当前wsl绑定的内核版本为5.15.90.1:
3、执行cat /proc/version,查看当前完整的内核版本为5.15.90.1-microsoft-standard-WSL2,gcc版本为x86_64-msft-linux-gcc (GCC) 9.3.0:
4、在Ubuntu环境下执行相关命令(保证内核版本和gcc版本均与WSL2中的全部匹配):
(1)下载匹配的WSL Linux Kernel版本5.15.90.1:
git clone --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel --branch linux-msft-wsl-5.15.90.1
(2)cd WSL2-Linux-Kernel
(3)从.config文件中核对一下即将编译所使用的gcc版本,这里需要注意的是:若使用在ubuntu下通过sudo apt-get install gcc安装的gcc版本进行编译,则可能会出错。所以此处需要选择WSL Linux Kernel中携带的gcc版本进行编译:
vi .config
删除配置(×):CONFIG_CC_VERSION_TEXT="gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0"
修改配置为(√):CONFIG_CC_VERSION_TEXT="x86_64-msft-linux-gcc (GCC) 9.3.0"
(4)LOCALVERSION= make -j8
编译OK后,编译的内核存放在:arch/x86/boot/bzImage
cp arch/x86/boot/bzImage /mnt/c/HP/
将拷贝到C:\Users\HP目录下的bzImage重命名为kernel后,拷贝到C:\Windows\System32\lxss\tools下进行kernel的覆盖替换;
(5)sudo make modules_install -j 8
/lib/modules/5.15.90.1-microsoft-standard-WSL2
(6)uname -r
5.15.90.1-microsoft-standard-WSL2
5、编译hello驱动举例:
(1)在WSL2-Linux-Kernel/drivers下建立hello目录,在hello目录下建立hello.c文件:
#include <linux/module.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "welcome, hello\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "bye, hello\n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
(2)在WSL2-Linux-Kernel/drivers/hello下建立Makefile文件:
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean
(3)在WSL2-Linux-Kernel/drivers/hello下执行make;
(4)在WSL2-Linux-Kernel/drivers/hello下执行加载驱动:
sudo insmod ./hello.ko
dmesg|tail
(5)在WSL2-Linux-Kernel/drivers/hello下执行卸载驱动:
sudo rmmod hello
dmesg|tail