wsl2内核通过模块方法增加设备驱动程序

参考:https://github.com/AlexFanw/HUSTER-CS/tree/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1
https://www.cnblogs.com/lidabo/p/5312827.html

一、编写驱动程序和Makefile
二、将该程序复制wsl下的任意一个目录
我是先在内核文件夹的同级目录创建了一个目录OS_drive,在里面touch一个.c文件,再用vim指令右键复制,突然想起来用记事本打开应该更方便,记事本打开命令是:

notepad.exe 文件名

三、返回该内核根目录,输入指令:

make modules_install

结果如图:
在这里插入图片描述
四、然后还是在内核根目录,再创建一个软连接/usr/src/{你的内核名称} 连接到内核源码目录

sudo ln -s {源码文件夹路径} /usr/src/{你的内核名称}
//下面是我执行的命令
sudo ln -s {../OS_drive} /usr/src/{5.9.9silence2.0Yoga2021-standard}

五、重新make驱动程序:进入源码所在文件夹输入make指令,结果如下图:
在这里插入图片描述
六、insmod 文件名.ko

//我是在内核根目录执行insmod指令的,不确定在文件所在目录insmod有没有用
insmod ../OS_drive/Silence_Drive.ko

七、至此设备驱动程序就加入成功了,如果要卸载模块的话,就在.ko文件所在目录执行rmmod **.ko命令就行:

rmmod **.ko
//文件名Silence_Drive.c
#include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>


long int SILENCE_MAJOR = 0;
static ssize_t read_silence(struct file *flip,char *buf,size_t count, loff_t*f_pos)
{
	int left;
	for(left = count ; left > 0 ; left--)
{
	put_user(9,buf);
	buf++;
}
	return count;
}
static ssize_t write_silence(struct file *flip,const char *file,size_t count, loff_t*f_pos)
{
	return count;
}

static int open_silence(struct inode *inode,struct file *file )
{

	return 0;
}

static void release_silence(struct inode *inode,struct file *file )
{

}

struct file_operations silence_fops={
	.read = read_silence,
	.write=write_silence,
	.open=open_silence,
	.release=release_silence,
};




static int init_mymodule(void)
{
	int result;
	result = register_chrdev(0, "silence", &silence_fops);
	if (result < 0) {
		printk(KERN_INFO "silence: can't get major number\n");
		return result;
	}
	if (SILENCE_MAJOR == 0) SILENCE_MAJOR = result; /* dynamic */
	return 0;
}


static void cleanup_mymodule(void)
{
	unregister_chrdev(SILENCE_MAJOR,"silence");
}

MODULE_LICENSE("GPL");
module_init(init_mymodule);
module_exit(cleanup_mymodule);
//Makefile
ifneq ($(KERNELRELEASE),)
#kbuild syntax.

obj-m +=Silence_Drive.o
else
PWD :=$(shell pwd)
KVER :=$(shell uname -r)
KDIR ::=/lib/modules/$(KVER)/build
all:
		$(MAKE) -C $(KDIR) M=$(PWD)
clean:
		rm -f *.cmd *.o *.mod *.ko
endif



版权声明:本文为qq_43556545原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。