WSL2 内核编译/安装内核头文件/驱动调试

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
上一篇:【AI视野·今日Robot 机器人论文速览 第十九期】Mon, 5 Jul 2021


下一篇:TypeError:'dict' object is not callable