WSL2 内核编译/安装内核头文件/驱动调试
WSL2下编写内核模块 - 简书 (jianshu.com)
1. 查看当前系统的内核版本号
lim@TIM:~$ uname -r
5.4.72-microsoft-standard-WSL2
2. 下载内核源码
去github下载对应的linux内核源码包
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-5.4.72.tar.gz
3. 安装依赖库
先安装如下库,如果编译报错,再安装缺失的库
sudo apt-get install libelf-dev build-essential pkg-config
sudo apt-get install bison build-essential flex libssl-dev libelf-dev bc
4. 编译安装
tar xvf WSL2-Linux-Kernel-linux-msft-5.4.72.tar.gz
cd WSL2-Linux-Kernel-linux-msft-5.4.72/
zcat /proc/config.gz > .config
make -j $(nproc)
sudo make -j $(nproc) modules_install
安装后会看到/lib/modules/5.4.72-microsoft-standard-WSL2
目录下相关文件指到了源码所在的目录
lim@TIM:~/code/driver$ ll /lib/modules/5.4.72-microsoft-standard-WSL2/
total 64
drwxr-xr-x 3 root root 4096 Jul 4 11:12 ./
drwxr-xr-x 3 root root 4096 Jul 4 11:12 ../
lrwxrwxrwx 1 root root 56 Jul 4 11:12 build -> /home/lim/linux-msft/WSL2-Linux-Kernel-linux-msft-5.4.72/
drwxr-xr-x 2 root root 4096 Jul 4 11:12 kernel/
-rw-r--r-- 1 root root 45 Jul 4 11:12 modules.alias
-rw-r--r-- 1 root root 12 Jul 4 11:12 modules.alias.bin
-rw-r--r-- 1 root root 11997 Jul 4 11:12 modules.builtin
-rw-r--r-- 1 root root 0 Jul 4 11:12 modules.builtin.alias.bin
-rw-r--r-- 1 root root 13847 Jul 4 11:12 modules.builtin.bin
-rw-r--r-- 1 root root 0 Jul 4 11:12 modules.dep
-rw-r--r-- 1 root root 12 Jul 4 11:12 modules.dep.bin
-rw-r--r-- 1 root root 0 Jul 4 11:12 modules.devname
-rw-r--r-- 1 root root 0 Jul 4 11:12 modules.order
-rw-r--r-- 1 root root 55 Jul 4 11:12 modules.softdep
-rw-r--r-- 1 root root 49 Jul 4 11:12 modules.symbols
-rw-r--r-- 1 root root 12 Jul 4 11:12 modules.symbols.bin
lrwxrwxrwx 1 root root 56 Jul 4 11:12 source -> /home/lim/linux-msft/WSL2-Linux-Kernel-linux-msft-5.4.72/
5. 编译hello world 模块测试
创建Makefile 和hello.c文件,文件内容如下所示:
lim@TIM:~/code/driver$ ll
-rw-r--r-- 1 lim lim 384 Jul 4 11:34 Makefile
-rw-r--r-- 1 lim lim 344 Jul 4 11:24 hello.c
Makefile文件内容
# Makefile
TARGETNAME = hello
OBJ = $(TARGETNAME).o
MODULE = $(TARGETNAME).ko
obj-m += $(OBJ)
all:
make -j $(nproc) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
install:
@modprobe -r $(TARGETNAME)
@install $(MODULE) /lib/modules/$(shell uname -r)/kernel/drivers/hid
@depmod
@modprobe $(TARGETNAME)
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
hello.c文件内容
// hello.c
#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);
编译
make
6. 安装卸载模块进行验证
重新打开一个shell,监听/dev/kmsg
cat /dev/kmsg
在另一个窗口中安装卸载模块
sudo instmod
sudo rmmod hello
可以看到在cat /dev/kmsg
的窗口有log打印出
1,399,5091652873,-;Hello world
1,400,5101933095,-;Goodbye