Linux驱动开发(1.基础创建)
序言:从高层逻辑到底层硬件的回归
在当今的软件开发中,我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增,却也逐渐模糊了我们对计算机本质的认知:一切代码终将落地为硬件行为。
Bjarne Stroustrup(C++之父)曾言:“The Web is a flea on the tail of the dog called IT.”(万维网不过是信息技术狗尾巴上的一只跳蚤)。这句话深刻揭示了技术表象与底层根基的关系。
回想DOS时代,从盘符加载到命令执行,每一步都直击硬件本质;而如今的一键开机背后,是无数硬件信号、固件协议和驱动程序的精密协作。理解底层,不是为了复古,而是为了在高层抽象失效时,仍能掌控全局。
设备驱动程序——连接软硬件的桥梁
1.1 什么是设备驱动?
设备驱动是操作系统的“硬件翻译官”,它完成两件事:
-
机制(Mechanism):将硬件操作(如寄存器读写、中断处理)封装为统一接口。
-
策略(Policy):由上层决定如何使用这些接口(如权限管理、数据调度)。
示例:
-
键盘驱动(机制)提供按键扫描码,窗口管理器(策略)决定如何响应快捷键(如Ctrl+C)。
-
GPU驱动(机制)实现图形渲染,桌面环境(策略)管理窗口布局。
1.2 为什么需要学习驱动开发?
-
突破技术黑箱:理解从代码到硬件的完整链路(如
printf
如何点亮屏幕像素)。 -
解决实际问题:定制硬件支持(如为嵌入式设备编写专用驱动)。
-
职业竞争力:内核开发、IoT、自动驾驶等领域对底层能力要求极高。
1.3 设备驱动的分类
类型 | 特点 | 典型设备 | 用户接口示例 |
---|---|---|---|
字符设备 | 按字节流访问,支持read() /write() | 键盘、串口 | /dev/ttyS0 |
块设备 | 按数据块访问,用于存储设备 | 硬盘、SSD | /dev/sda |
网络接口 | 处理数据包,无文件节点 | 网卡、虚拟隧道 | eth0 、wlan0 |
1.4 从零编写一个驱动模块
代码示例:最简单的内核模块
#include <linux/module.h>
#include <linux/init.h>// 模块加载时执行
static int __init my_driver_init(void) {printk(KERN_INFO "Driver loaded: Hello, Kernel!\n"); // 内核日志输出return 0;
}// 模块卸载时执行
static void __exit my_driver_exit(void) {printk(KERN_INFO "Driver unloaded: Goodbye, Kernel!\n");
}// 注册模块入口/出口
module_init(my_driver_init);
module_exit(my_driver_exit);// 模块元信息
MODULE_LICENSE("GPL"); // 开源协议
MODULE_AUTHOR("Your Name"); // 作者
MODULE_DESCRIPTION("A Minimal Driver"); // 描述
操作步骤:
-
使用vim创建一个my_driver.c文件
-
编写
Makefile
:obj-m += my_driver.o all:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
-
编译并加载模块:
make # 编译 sudo insmod my_driver.ko # 加载模块 dmesg | tail -n 2 # 查看内核日志输出 sudo rmmod my_driver # 卸载模块
当加载模块后通过dmesg可以看见我们驱动运行时打印的信息 。
现在自己也在学习Linux驱动开发中也欢迎各位同学和大佬跟我交流~
相关文章:

Linux驱动开发(1.基础创建)
序言:从高层逻辑到底层硬件的回归 在当今的软件开发中,我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增,却也逐渐模糊了我们对计算机本质的认知:一切代码终将落地为…...

mmseg
系列文章目录 文章目录 系列文章目录bug bug File "/public/home/rsinfo/project/mmsegmentation/mmseg/__init__.py", line 61, in <module>assert (mmcv_min_version < mmcv_version < mmcv_max_version), \ AssertionError: MMCV2.2.0 is used but i…...

LangChain核心概念
下面整理的LangChain部分核心概念: 聊天模型【Chat models】:通过聊天 API 暴露的大语言模型(LLMs),将消息序列作为输入,并输出一条消息。消息【Messages】:聊天模型中的通信单元,…...

阿里巴巴全新推理模型QwQ-32B:性能比肩DeepSeek-R1,开源引领未来
摘要 阿里巴巴集团于深夜正式发布全新推理模型QwQ-32B,其性能与DeepSeek-R1完整版相当。该模型已通过Apache 2.0开源协议在Hugging Face和ModelScope平台发布。用户可通过Qwen Chat平台直接体验QwQ-32B的强大功能。这一举措不仅展示了阿里巴巴在人工智能领域的技术实…...

使用Arduino和ESP8266进行基于物联网的垃圾箱监控
使用 Arduino 和 ESP8266 的基于 IOT 的垃圾箱监控系统 在这个 DIY 中,我们将制作一个基于 IOT 的垃圾箱/垃圾监控系统,该系统将通过网络服务器告诉我们垃圾桶是空的还是满的,并且您可以通过互联网从世界任何地方了解“垃圾桶”或“垃圾箱”的状态。它将非常有用,可以安装…...

【Python爬虫】爬取公共交通路网数据
程序来自于Github,以下这篇博客作为完整的学习记录,也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据,并生成shp文件,…...

基于Matlab的人脸识别的二维PCA
一、基本原理 传统 PCA 在处理图像数据时,需将二维图像矩阵拉伸为一维向量,这使得数据维度剧增,引发高计算成本与存储压力。与之不同,2DPCA 直接基于二维图像矩阵展开运算。 它着眼于图像矩阵的列向量,构建协方差矩阵…...

SSM架构 +Nginx+FFmpeg实现rtsp流转hls流,在前端html上实现视频播放
序言: 本文介绍通过SSM架构 NginxFFmpeg实现rtsp流转hls流,在前端html上实现视频播放功能。此方法可用于网络摄像头RTSP视频流WEB端实时播放。(海康和大华都可以),我使用的是海康 步骤一:安装软件 FFmpeg…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-3.2.3 案例:新闻搜索引擎的相关性优化
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch新闻搜索引擎相关性优化实战3.2.3 案例:新闻搜索引擎的相关性优化项目背景1. 相关性问题诊断与分析1.1 初始查询DSL示例1.2 问题诊断矩阵1.3 性能基…...

SQL经典查询
查询不在表里的数据,一张学生表,一张学生的选课表,要求查出没有选课的学生? select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…...

体验开源openeuler openharmony stratovirt模拟器
文档 openeuler社区面向数字基础设施的开源操作系统 openharmony社区 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统…...

【C++】:STL详解 —— 红黑树
目录 平衡二叉查找树 红黑树的概念 红黑树的五大性质 红黑树的效率 红黑树和AVL树的比较 插入与删除操作 内存与实现复杂度 经典性能数据对比 总结 对旋转的基本理解 旋转的作用 左旋(Left Rotation) 右旋(Right Rotation…...

蓝桥试题:蓝桥勇士(LIS)
一、题目描述 小明是蓝桥王国的勇士,他晋升为蓝桥骑士,于是他决定不断突破自我。 这天蓝桥首席骑士长给他安排了 N 个对手,他们的战力值分别为 a1,a2,...,an,且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战…...

Trae IDE新建C#工程
目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说,Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…...

Linux基础--进程管理
目录 静态查看进程 使用命令: ps 动态查看进程 使用命令: top 关闭进程: 使用命令: kill 查看进程占用端口 使用命令: ss 编辑 查看某端口是否被进程占用 使用命令: lsof 作业管理 进程后台运行: 使用命令: jobs 将后台进程调回前台 使用指令: fg 将前台进…...

Java面向对象(详细解释)
第一章 Static关键字 1.static的介绍以及基本使用 1.概述:static是一个静态关键字 2.使用: a.修饰一个成员变量: static 数据类型 变量名 b.修饰一个方法: 修饰符 static 返回值类型 方法名(形参){…...

qt ui相关的第三方库插件库
Qt UI相关的第三方库和插件库有很多,能帮助开发者提高开发效率,扩展UI功能,增强可用性和美观度。以下是一些常见的第三方库和插件: 1. QCustomPlot 功能:用于在Qt应用程序中创建交互式的二维绘图。特点:支…...

详解动态规划算法
动态规划 一、动态规划的核心思想二、动态规划的步骤1. 定义状态(State)2. 确定状态转移方程(State Transition Equation)3. 确定边界条件(Base Case)4. 填表(Table Filling)或递归计…...

LINUX网络基础 [五] - HTTP协议
目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…...

慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8
慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8 现在是已经到了课程的第十章了,开始进行配置项目环境了。现在要完成的任务是项目可以正常运行,而且可以自由切换配置,开发/测试。 下面是当前的目录结构图: 现在来解释一…...

华为配置篇-OSPF基础实验
OSPF 一、简述二、常用命令总结三、实验3.1 OSPF单区域3.2 OSPF多区域3.3 OSPF 的邻接关系和 LSA 置底 一、简述 OSPF(开放式最短路径优先协议) 基本定义 全称:Open Shortest Path First 类型:链路状态路由协议(IGP&…...

闭包:JavaScript 中的隐形大杀器
你可能已经在很多地方听说过闭包这个词,尤其是涉及到 JavaScript 的作用域和异步操作时。闭包是 JavaScript 中非常核心的概念,然而它又非常容易让开发者感到困惑。今天我们就来深入剖析闭包,帮助你真正理解它的工作原理,以及如何…...

【消息队列】数据库的数据管理
1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说,具体要使用哪个数据库,是需要稍作考虑的,如果直接使用 MySQL 数据库也是能实现正常的功能,但是 MySQL 也是一个客户端服务器程序,也就意味着如果想在其他服…...

玩转ChatGPT:GPT 深入研究功能
一、写在前面 民间总结: 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么,ChatGPT呢? 看Deep Research(深入研究)功能。 对于科研狗来说,在这个文章爆炸的时代,如何利用AI准确、高效地收…...

Centos8部署mongodb报错记录
使用mongo ops安装mongodb6.0.4副本集报错 error while loading shared libraries: libnetsnmpmibs.so.35: cannot open shared object file: No such file or directory 解决 yum install net-snmp net-snmp-devel -y建议:初始化系统时把官网上的依赖包都装一遍 即…...

2024四川大学计算机考研复试上机真题
2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测:https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …...

前端面试题 口语化复述解答(从2025.3.8 开始频繁更新中)
背景 看了很多面试题及其答案。但是过于标准化,一般不能直接用于回复面试官,这里我将总结一系列面试题,用于自我复习也乐于分享给大家,欢迎大家提供建议,我必不断完善之。 Javascript ES6 1. var let const 的区别…...

更多文章请查看
更多文章知识请移步至下面链接,期待你的关注 如需查看新文章,请前往: 博主知识库https://www.yuque.com/xinzaigeek...

vulnhub靶场之【digitalworld.local系列】的vengeance靶机
前言 靶机:digitalworld.local-vengeance,IP地址为192.168.10.10 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式ÿ…...

MySql的安装及数据库的基本操作命令
1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…...