记录在WSL2中尝试编写一个简单的驱动遇到的问题
-
尝试在WSL2中编写一个简单驱动,但是遇到了很多问题,在此记录。
WSL2的安装
在windows下安装linux ubuntu子系统可以参照一下帖子:
关于使用这个子系统需要知道的事情:
windows访问linux:
文件夹内搜索 \wsl$
linux访问windows:
cd /mnt/c
WSL需要另外安装内核
在WSL下,如果你试图直接编译一个驱动,会出错,原因是WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。解决方法可以参考如下链接:
WSL安装内核
如何写一个简单的驱动
如何在linux下写一个简单的驱动如下:
简单驱动
在加载驱动时遇到一个还没有解决的问题:
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/test1$ insmod hellomodule.ko
insmod: ERROR: could not insert module hellomodule.ko: Operation not permitted
可以看到上面显示无法正确insert模块。
dmesg一下看看内核报的什么错误:
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/test1$ dmesg
[32479.309951] hellomodule: disagrees about version of symbol module_layout
可以看到有什么版本不匹配了
但实际上我在makefile中用到的kernel版本和uname-r的实际版本是一致的。经过dump也确实一样,这个问题还没有解决。
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/test1$ modprobe --dump-modversion /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/block/nbd.ko | grep module_layout
0xd83ae36e module_layout
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/test1$ modprobe --dump-modversions hellomodule.ko | grep module_layout
0xd83ae36e module_layout
看到有个帖子说比较modinfo,尝试了一下还是没有问题:
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/test1$ modinfo /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/block/nbd.ko
filename: /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
srcversion: 7E843666F1C12A522904EB6
depends:
retpoline: Y
intree: Y
name: nbd
vermagic: 5.15.153.1-microsoft-standard-WSL2 SMP mod_unload modversions
parm: nbds_max:number of network block devices to initialize (default: 16) (int)
parm: max_part:number of partitions per device (default: 16) (int)
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/test1$ modinfo hellomodule.ko
filename: /home/wenjuan/learn/dri/test1/hellomodule.ko
license: GPL
srcversion: 4B81F55C06B3C267070B4B0
depends:
retpoline: Y
name: hellomodule
vermagic: 5.15.153.1-microsoft-standard-WSL2 SMP mod_unload modversions
尝试用lsmod看了一下,发现是空。查阅之后发现是正常现象。
https://github.com/microsoft/WSL/issues/7231
但同时提醒了我上面用来做比较的 /lib/modules/5.15.153.1-microsoft-standard-WSL2/kernel/drivers/block/nbd.ko,其实是我自己编译出来的,并不是系统自带的
往上面重新倒腾看看哪一步有没有遇到问题我没注意到,发现:
wenjuan@LAPTOP-0NP9KHL3:~/learn/dri/WSL2-Linux-Kernel-linux-msft-wsl-5.15.153.1$ sudo make -j $(nproc) modules_install
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
实际上我已经装了binutils了,安装步骤如下
下载安装包:wget http://ftp.gnu.org/gnu/binutils/binutils-2.32.tar.gz
解压安装包:tar -xzvf binutils-2.32.tar.gz
定位到binutils的目录:cd binutils-2.32/
配置安装目录:./configure --prefix=/usr/local/binutils
编译并安装binutils:make && make install