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

news/2024/9/29 3:24:42

参考资料:

  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
elseKERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(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在生成索引时都会需要一定时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30125.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

jvm内存模型、垃圾回收机制

JVM内存模型JVM内存模型包括:线程计数器、本地方法栈、栈、堆、方法区(元空间),类装载子系统,字节码执行引擎。线程计数器 线程启动时,程序技术会分配一小块空间分配给当前线程,每个线程都会独享一块程序计数器空间,用于存储下条指令的单元地址 程序计数器是一块较小的内…

oracle 性能优化查看(DBMS_SQLTUNE.REPORT_SQL_MONITOR)

参照查看:Oracle调优之看懂Oracle执行计划 - smileNicky - 博客园 (cnblogs.com)临时查看监控需添加 /*+ MONITOR */ 注意空格,不然监控不了select /*+ MONITOR */temp2.*from (select rownum as rn, temp1.*from (select BATCH_ID, PARENT_BATCH_IDfrom t_column_value tcvw…

installshield 安装jdk并配置环境变量

今天来通过installshield安装jdk以及配置环境变量,本质上是调用第三方安装程序。 首先将jdk的安装文件添加到我们的安装程序中然后编写我们的脚本 选择BEHAVIOR AND LOGIC->InstallScript->Setup.Rul->After Move Data->OnFirstUIAfter,如图OnFirstUIAfter脚本如下…

安装Node+npm

下载node 地址: https://nodejs.org/download/rc/v22.0.0-rc.2/ 下载22版本,并安装

Spring启动流程

本文基于AnnotationConfigApplicationContext的方式启动,解析Spring启动的流程 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);一、构造方法 容器启动需要扫描BD(BeanDefinition),并创建BD,Spring将这…

Sychronized和ReentrantLock有哪些不同点

`synchronized` 和 `ReentrantLock` 是 Java 中用于实现线程同步的两种机制,它们之间存在多方面的不同,主要体现在以下几点: 1. 用法上的差异: - `synchronized` 是 Java 的关键字,可以直接用于方法或代码块。对于方法,可以同步整个方法;对于代码块,可以更细粒度地控…

AutoCAD .NET framework支持情况

出处 https://forums.autodesk.com/t5/net/net-framework-support/m-p/9403930 问题描述 我想问一下是否有一些官方表格.Net framework支持。有人有关于支持.NET 5的信息/经验吗? 回答1(03-27-2020)附加了一个用于AutoCAD/Visual Sudio兼容性的非官方表格。 我没有测试,但是…

hj_podman_20240510

略创建文件夹&容器停止&删除 yum install podman yum update / apt-get update # podman exec -u 0 -it a4a89d953992 /bin/bash 这是root账户进入 -u 0~~~# mysql 8.0.37 podman pull mysql:8.0.37 mkdir -p /home/hj/hj_mysql8.0.37_3307 cd /home/hj/hj_mysql8.0.…