首页 > 其他分享 >wsl2自己写的第一个驱动模块

wsl2自己写的第一个驱动模块

时间:2024-05-11 10:57:25浏览次数:16  
标签:clangd clean 编译 内核 模块 驱动 wsl2 hello

参考资料:

  1. 手把手教你使用VSCode进行linux内核代码阅读和开发 - 知乎 (zhihu.com)

  2. 2023 年对比一下 ccls 和 clangd | 工欲善其事,必先利其器 (martins3.github.io)

  3. Linux驱动实践:带你一步一步编译内核驱动程序 - 知乎 (zhihu.com)

  4. vscode extensions - Can not use clangd to read linux kernel code - Stack Overflow


编译驱动模块

直接使用【3】中的代码和 Makefile 配置,选择的方式是最后一条只编译 hello 这一个驱动模块

#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");

// 以下两个函数属于 Linux 的驱动框架,只要把驱动两个函数地址注册进去即可。
module_init(hello_init);
module_exit(hello_exit);
ifneq ($(KERNELRELEASE),)
        obj-m := hello.o
else
        KERNELDIR ?= /lib/modules/$(shell uname -r)/build
        PWD := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
        $(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean
endif

其中Makefile的代码在 clean 中变量有问题,根据上下文应该使用 KERNELDIR 替换第9行的 KERNEL_PATH

不然在执行make clean 会报错,错误内容类似下面所给的:

make -C  M=/home/larcvz/projects/c++/drivers/hello clean
make[1]: *** M=/home/larcvz/projects/c++/drivers/hello: No such file or directory.  Stop.
make: *** [Makefile:9: clean] Error 2

编译完成后加载驱动进行验证

加载驱动:

sudo insmod ./hello.ko

此时终端窗口是没有任何输出的,需要输入指令 dmesg | tail ,可以看到 hello_init 函数的输出内容:

image

卸载驱动:

sudo rmmod hello

再次输入 dmesg | tail ,可以看到 hello_exit 函数的输出内容:

image


提高内核代码阅读体验

本来打算使用 clangd 进行的但是总是出现各种报错,出错的原因在【2】中的内容中有提到,大致就是使用了 gcc 进行编译内核导致的,除非使用 clang 进行编译或是交叉编译。具体解决方法参照文中提到的 vscode extensions - Can not use clangd to read linux kernel code - Stack Overflow

【2】中的位置在:

clangd 无法理解 gcc 的参数,导致内核项目头上总是存在大量报错

这一段中找到

关于lsp需要的compile_command.json,可以使用【1】中文章提到的bear也可以使用后面评论提到的linux/scripts/clang-tools/gen_compile_commands.py 内核自带一个生成compile_command.json的脚本,编译完执行自动生成

我自己最后选择了ccls。两个生产的compile_command.json也有一些差别,我自己使用下来暂时遇到只有有些头文件使用脚本生成的并不能被识别依然会报错,比如compiler.h的文件,脚本生成的里面是compiler-version.h的没有这个导致跳转后还是报错了。用 bear 生成的就没有这个问题。

由于内核比较大,无论是ccls还是clangd在生成索引时都会需要一定时间。

标签:clangd,clean,编译,内核,模块,驱动,wsl2,hello
From: https://www.cnblogs.com/Larcvz/p/18186105

相关文章

  • 非常完整的开源无刷电机驱动项目+仅1300行代码的C语言异步网络库+简单到傻瓜都会用的
    1、VESC-非常完整的开源无刷电机驱动项目ESC是ElectricSpeedController的缩写,也就是电子调速控制器,简称电调;项目作者是BenjaminVedder,所以叫VESC,就是本杰明电调。这个项目主要分为几个部分,VESC固件,物料清单,VESC硬件,VESC工具软件,是一个非常完整的软硬件项目,并且配套的软......
  • modbus - 全新可裁剪的modbus协议实现+面向超薄紧凑型充电设备的无线充电器模块
    1、USBCableTester-各种接口类型USB电缆的便携测试仪网友alvarop制作的一块板卡,能够测试各种USB线是否完好。(注意USB标准有助于识别板卡上的这些USB-c,符合标准的电缆将根据电缆和连接器规格发布选择合适的引脚)。将测试的USB线连接到板子两侧,如果对应线是通的,那板子......
  • os模块常用方法
    os模块是和系统操作有关的模块,在做自动化时,创建或者删除文件或路径、判断是文件还是路径、给文件重命名等,都需要用到这个模块,下面我们罗列了一下os模块常用的方法1、获取当前路径os.getcwd() 2、切换路径os.chdir(r'D:\work')  #路径切换到D:\work r'D:\work'......
  • BOSHIDA AC/DC电源模块的市场发展与前景分析
    BOSHIDAAC/DC电源模块的市场发展与前景分析AC/DC电源模块是一种将交流电转化为直流电的电子设备,广泛应用于各种电子设备和系统中。随着电子技术的快速发展,AC/DC电源模块的市场也在不断扩大,并且具有良好的发展前景。 一,AC/DC电源模块在电子设备中的重要性越来越大。现代电子......
  • 构造和运行模块
    构造和运行模块在尝试运行模块之前,需要使用合适的系统(通常是封闭的)实现内核原代码的相应实验Helloworld模块模块构造/析构:使用module_init/module_exit宏装饰相应函数,实现内核模块的装载/移除许可证:使用MODULE_LICENSE("")实现对许可证的装载;模块的装载与移除:装载insmo......
  • Linux nginx 玩转日志模块
    log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_fo......
  • 基于pinctrl和GPIO子系统的按键驱动程序
    嵌入式驱动开发中pinctrl和GPIO子系统使用频率非常高,其中pinctrl子系统主要用于复用和配置引脚,GPIO子系统用于设置GPIO的输入/输出,向引脚写入数据或者从引脚读取数据。一个引脚可以复用为多种不同的功能,因此要使用GPIO子系统首先要先把引脚配置为GPIO功能。下面将分为两部分记录如......
  • python教程9-第三方模块安装
    https://pypi.python.org/pypi是python的开源模块库。收录了⾃全世界python开发者贡献的模块,⼏乎涵盖了你想⽤python做的任何事情。事实上每个python开发者,只要注册⼀个账号就可以往这个平台上传你⾃⼰的模块,这样全世界的开发者都可以容易的下载并使⽤你的模块。下载和安装:......
  • FMC160-两路14位400Msps AD,两路16位400Msps DA FMC子卡模块
    FMC160-两路14位400MspsAD,两路16位400MspsDAFMC子卡模块一、概述 该板卡可实现2路14bit400MspsAD和2路16bit400MspsDA功能,遵循VITA57标准,北京太速科技板卡可以直接与VME/VXS/AMC/VPX/PCI-EFPGA载板连接使用,用于模拟信号、中频信号采集,信号发出等......
  • Linux下RTC子系统驱动
    Linux下RTC子系统驱动1引入RTCCPU内部有很多定时器,像看门狗WDT,PWM定时器,高精度定时器Timer等等,只在“启动”即“通电时”运行,断电时停止。当然,如果时钟不能连续跟踪时间,则必须手动设置。那么当关机后就没办法自动计数统计时间了。RTC就很好的解决了这个问题,RTC是实时时钟,用......