Linux驱动学习(一)---Ubuntu-helloworld驱动编译

news/2025/11/6 21:46:05/文章来源:https://www.cnblogs.com/loremmoqi/p/19197798

最近想学习Linux内核驱动开发,了解了一些关于Linux的基础知识(看的B站汪晨的视频,CSDN有个博主也总结了这个视频的内容)配置了开发环境,即在windows10上安装了VMware,在VMware里安装了Ubuntu22,前面的搞定之后,就开始第一个helloworld内核编译。我有一个树莓派(Raspberry Pi),就算没有,也可以完成下面的helloworl驱动编译,因为模块编译只要有内核头文件就可以了。后面如果确定用树莓派还是imx6ull再下载他们相应的内核源码进行编译就好了。


先不讲要安装什么编译工具,我们最直白知道要编写一个helloword.c和一个Makefile。

内容如下:
helloworld.c


// 头文件
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>static int __init helloworld(void)
{prink("hello world\n");return 0;
}static void __exit goodbye(void)
{printk("goodbye\n");
}
module_init(helloworld); // 加载模块
module_exit(goodbye);    // 卸载模块MODULE_LICENSE("GPL");  /* 必不可少的声明 */

Makefile

obj-m +=helloworld.o
KDIR := /lib/modules/$(shell uname -r)/buildPWD?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules

Makefile里面的内容表示:

  • 要编译一个 可加载模块(module) ,模块目标文件是 helloworld.ko。最终生成的模块是.helloworld.ko.
  • 定义变量 KDIR 为当前系统内核头文件目录,(指向当前运行内核版本源码或头文件的路径)。
  • 定义变量 PWD 为当前工作目录(即你放这个 Makefile 的目录)。
  • 调用内核的顶层 Makefile 来编译你的模块。

驱动编译有两种方法(具体区别可以自己查一下)

  1. 把驱动编译成模块再编译到内核(现在采用这种)
  2. 直接把驱动编译到内核

下面是要make编译helloworld.c,需要安装编译环境:

`sudo apt update``sudo apt install build-essential linux-headers-$(uname -r)`

接着就是新建文件夹,存放helloworld.c和Makefile(要大写M),内容就是上面的内容。

  1. 编译模块
    make如果第二次编译,记得 make cleanmake
  2. 加载模块
    sudo insmod helloworld.c如果你是在root下,就可以不用加sudo
    p1
  3. 查看日志输出(因为我们不是直接在硬件中编写的,所以只能通过日志查看)
    dmseg | tail -n 10 查看后面10条日志信息
    能看到输出内容是hello world
    p2
  4. 卸载模块
    sudo rmmod helloworld
  5. 查看日志输出(因为我们不是直接在硬件中编写的,所以只能通过日志查看)
    dmseg | tail -n 10 查看后面10条日志信息
    能看到输出内容是goodbye
    🌈到此,恭喜你,第一个内核驱动成功运行了!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025/11/3 ~ 2025/11/9 做题笔记 - sb

2025/11/6 做题笔记 #9127. Optimal Train Operation 之前遗留下来的斜率优化,因为题面是英文一直没看在每一个点修建地铁站的代价是 \(a_i\),每两个地铁站之间的代价是 \((j - i + 1)\max\limits_ {i \le k \le j}c…

利用Google Dork挖掘敏感文件setup.sh的技术解析

本文详细解析了如何使用Google Dork语法"intitle:index of setup.sh"来发现互联网上公开的敏感配置文件setup.sh,这些文件可能包含服务器配置信息、数据库凭证等关键数据,对网络安全评估具有重要意义。Goo…

11.6 程序员的修炼之道:从小工到专家 第四章 注重实效的偏执 - GENGAR

这五节内容围绕编程中的容错设计、逻辑校验和资源管理展开,核心是通过科学的编码规范与工具,尽早发现问题、降低隐患,提升程序可靠性。 按合约设计(DBC)是核心校验理念,通过前条件、后条件和类不变项明确模块的权…

2025.11.6~?

2025.11.6 复盘,上午平复了一下心情 做了P2375,首先注意题中说的数量,然后发现nxt树组指的是前缀和后缀相等,数量的话,直接用nxt递推即可,然后至于不交,就维护一直不交,然后用nxt的答案即可 做了P3426,最开始…

详细介绍:自建数字资源库:技术架构全解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能价值权衡的元理论:三值纠缠与文明演进的动力学框架

人工智能价值权衡的元理论:三值纠缠与文明演进的动力学框架 摘要:随着人工智能在复杂决策中扮演日益重要的角色,其面临的核心挑战已从单纯的价值对齐转向如何在多元、动态且时常冲突的人类价值中进行权衡。本文系统…

golang面经——内存相关模块 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11/7

今天上午体育课比赛但没轮到我们组,说实话我感觉我们组如果上了应该可以拿个好名次,看完他们比赛

QOJ4795 Taxi

题意简述 给定一颗 \(n\) 个点的树,边有边权。有 \(m\) 个独立的乘客和 \(m\) 个独立的司机,每个人选一个节点。将乘客与司机匹配,使得距离之和最大。 求所有 \(n^{2m}\) 种可能情况的距离之和 \(\bmod 10^9+7\)。 …

蓝牙耳机怎么连接电脑?【图文详解】蓝牙耳机连接电脑?蓝牙耳机能连接电脑吗?USB蓝牙适配器? - 详解

蓝牙耳机怎么连接电脑?【图文详解】蓝牙耳机连接电脑?蓝牙耳机能连接电脑吗?USB蓝牙适配器? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

AI浪潮下的就业迷思:技术迭代还是泡沫破灭?

最近刷到一堆AI相关的新闻,从OpenAI和亚马逊签下天价算力订单,到谷歌推出能预警洪水的地球级AI,再到微软自研图像模型减少对OpenAI的依赖,感觉整个科技圈都在疯狂押注AI。但作为一个学软件的学生,我反而有点焦虑:…

洛谷 P4159

给定一个 \(n\) 个节点的有向图,连接 \((i, j)\) 的有向边边权为 \(c_{i, j}(0 为没有边)\),问有多少种从 \(1\) 到 \(n\) 的方式使得经过的边边权之和为 \(k\)。 \(n \le 10, c \le 9, k \le 10^9\)。如果 \(c\) 只…

25.11.6 DAG和拓扑排序

一.DAG即有向无环图,常用于: 任务依赖:某任务必须在另一个任务完成后执行(如编译依赖、任务调度)。 课程顺序:先修课关系。 表达式计算顺序。 动态规划优化:例如在 DAG 上进行最长路径、最短路径 DP。 二.拓扑排…

2025-11-06 PQ v.Next日志记录

项目核心信息目前初步预计在这里进行开发测试(后续到develop): https://z.gitee.cn/zgca/projects/777586/repos/zgca/aipq/tree/feature%2Fteacher_feel今日进度(4*4): 当前任务:全员微信开发能力培训完成,活…

数据库介绍,安装,配置

https://www.cnblogs.com/linhaifeng/articles/7126847.html 1.数据库服务器:运行数据库管理软件的计算机 2.数据库管理软件:MySQL,Oracle,db2,SQLserver 3.库:文件夹 4.表:文件 5.记录:事物一系列的特征:cy,…

Spring BeanFactory 接口

[[Spring IOC 源码学习总笔记]] BeanFactory 的子接口 Spring BeanFactory 的设计, 基于接口隔离原则(Interface Segregation Principle), 将具有不同细分的功能定义为接口, 增加扩展性, 支持不同功能的 BeanFactory…

领码方案|微服务与SOA的世纪对话(3):方法论新生——DDD、服务网格与AI Ops的融合之道 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

遗留系统微服务改造(四):从单体到微服务的演进之路 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

备考笔记8

创建型:单抽原建厂 结构型:外桥组元代配饰 行为型:观模迭策责令解访介忘态 分页存储,位示图,多级索引,树的性质

不用Docker也能跑RustFS?Windows一键安装实测来了!

不用Docker也能跑RustFS?Windows一键安装实测来了!2025年,当所有人都在用Docker部署RustFS时,我们偏要反其道而行——​在Windows上直接运行RustFS二进制版​,实测结果令人惊喜:​​安装5分钟搞定,内存占用<…