当前位置: 首页 > news >正文

Linux驱动开发(1.基础创建)

序言:从高层逻辑到底层硬件的回归

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

Bjarne Stroustrup(C++之父)曾言:“The Web is a flea on the tail of the dog called IT.”(万维网不过是信息技术狗尾巴上的一只跳蚤)。这句话深刻揭示了技术表象与底层根基的关系。

回想DOS时代,从盘符加载到命令执行,每一步都直击硬件本质;而如今的一键开机背后,是无数硬件信号、固件协议和驱动程序的精密协作。理解底层,不是为了复古,而是为了在高层抽象失效时,仍能掌控全局

设备驱动程序——连接软硬件的桥梁

1.1 什么是设备驱动?

设备驱动是操作系统的“硬件翻译官”,它完成两件事:

  1. 机制(Mechanism):将硬件操作(如寄存器读写、中断处理)封装为统一接口。

  2. 策略(Policy):由上层决定如何使用这些接口(如权限管理、数据调度)。

示例

  • 键盘驱动(机制)提供按键扫描码,窗口管理器(策略)决定如何响应快捷键(如Ctrl+C)。

  • GPU驱动(机制)实现图形渲染,桌面环境(策略)管理窗口布局。

1.2 为什么需要学习驱动开发?
  1. 突破技术黑箱:理解从代码到硬件的完整链路(如printf如何点亮屏幕像素)。

  2. 解决实际问题:定制硬件支持(如为嵌入式设备编写专用驱动)。

  3. 职业竞争力:内核开发、IoT、自动驾驶等领域对底层能力要求极高。

1.3 设备驱动的分类
类型特点典型设备用户接口示例
字符设备按字节流访问,支持read()/write()键盘、串口/dev/ttyS0
块设备按数据块访问,用于存储设备硬盘、SSD/dev/sda
网络接口处理数据包,无文件节点网卡、虚拟隧道eth0wlan0
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"); // 描述

操作步骤

  1. 使用vim创建一个my_driver.c文件

  2. 编写 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

  3. 编译并加载模块:

    make                # 编译
    sudo insmod my_driver.ko   # 加载模块
    dmesg | tail -n 2   # 查看内核日志输出
    sudo rmmod my_driver      # 卸载模块

当加载模块后通过dmesg可以看见我们驱动运行时打印的信息 。

现在自己也在学习Linux驱动开发中也欢迎各位同学和大佬跟我交流~

相关文章:

Linux驱动开发(1.基础创建)

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

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部分核心概念&#xff1a; 聊天模型【Chat models】&#xff1a;通过聊天 API 暴露的大语言模型&#xff08;LLMs&#xff09;&#xff0c;将消息序列作为输入&#xff0c;并输出一条消息。消息【Messages】&#xff1a;聊天模型中的通信单元&#xff0c;…...

阿里巴巴全新推理模型QwQ-32B:性能比肩DeepSeek-R1,开源引领未来

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

使用Arduino和ESP8266进行基于物联网的垃圾箱监控

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

【Python爬虫】爬取公共交通路网数据

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

基于Matlab的人脸识别的二维PCA

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

SSM架构 +Nginx+FFmpeg实现rtsp流转hls流,在前端html上实现视频播放

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

【实战ES】实战 Elasticsearch:快速上手与深度实践-3.2.3 案例:新闻搜索引擎的相关性优化

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch新闻搜索引擎相关性优化实战3.2.3 案例&#xff1a;新闻搜索引擎的相关性优化项目背景1. 相关性问题诊断与分析1.1 初始查询DSL示例1.2 问题诊断矩阵1.3 性能基…...

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; 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是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建一个智能终端设备操作系统…...

【C++】:STL详解 —— 红黑树

目录 平衡二叉查找树 红黑树的概念 红黑树的五大性质 红黑树的效率 红黑树和AVL树的比较 插入与删除操作 内存与实现复杂度 经典性能数据对比 总结 对旋转的基本理解 旋转的作用 左旋&#xff08;Left Rotation&#xff09; 右旋&#xff08;Right Rotation&#xf…...

蓝桥试题:蓝桥勇士(LIS)

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

Trae IDE新建C#工程

目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说&#xff0c;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.概述&#xff1a;static是一个静态关键字 2.使用&#xff1a; a.修饰一个成员变量&#xff1a; static 数据类型 变量名 b.修饰一个方法&#xff1a; 修饰符 static 返回值类型 方法名&#xff08;形参&#xff09;{…...

qt ui相关的第三方库插件库

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

详解动态规划算法

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

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 现在是已经到了课程的第十章了&#xff0c;开始进行配置项目环境了。现在要完成的任务是项目可以正常运行&#xff0c;而且可以自由切换配置&#xff0c;开发/测试。 下面是当前的目录结构图&#xff1a; 现在来解释一…...

从RS-485到MQTT:手把手教你为BMS Modbus设备搭建物联网网关(Node-RED实战)

从RS-485到MQTT&#xff1a;手把手教你为BMS Modbus设备搭建物联网网关&#xff08;Node-RED实战&#xff09; 当工业现场的BMS设备还在使用Modbus-RTU协议时&#xff0c;如何让这些"信息孤岛"融入现代物联网架构&#xff1f;这个问题困扰着许多能源管理系统工程师。…...

WeChatExporter:免费开源工具,轻松备份你的微信聊天记录到电脑

WeChatExporter&#xff1a;免费开源工具&#xff0c;轻松备份你的微信聊天记录到电脑 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经担心过手机丢失、系统崩…...

Java面试高频:阿里真实面试题——Redis分布式锁实现(3分钟速通,不会直接挂)

一、真实面试场景&#xff08;代入感拉满&#xff09; 上周&#xff0c;一个候选人来面试阿里P6。 技术面已经过了两轮&#xff0c;表现都不错。 最后一轮&#xff0c;面试官只问了一个问题&#xff1a; “你们项目里用过Redis分布式锁吗&#xff1f;怎么实现的&#xff1f;…...

Madgwick算法详解:9轴IMU嵌入式姿态解算实战

1. Madgwick姿态解算算法库深度解析&#xff1a;面向9轴IMU的嵌入式实时姿态估计实现1.1 算法背景与工程定位Madgwick姿态解算算法由Sebastian Madgwick于2010年提出&#xff0c;是一种基于梯度下降优化的互补滤波器&#xff08;Complementary Filter&#xff09;&#xff0c;专…...

Flask-AppBuilder表单验证终极指南:构建企业级安全应用的10个核心技巧

Flask-AppBuilder表单验证终极指南&#xff1a;构建企业级安全应用的10个核心技巧 【免费下载链接】Flask-AppBuilder Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, googl…...

MedGemma 1.5企业应用:三甲医院科研组如何用其加速文献摘要与机制推演

MedGemma 1.5企业应用&#xff1a;三甲医院科研组如何用其加速文献摘要与机制推演 1. 引言&#xff1a;当科研遇上AI助手 想象一下这个场景&#xff1a;深夜的医院科研办公室里&#xff0c;桌上堆满了待读的医学文献&#xff0c;电脑屏幕上同时打开了十几篇PDF。一位研究员正…...

AI头像生成器新手教程:5个常用风格关键词+3类背景模板Prompt速查表

AI头像生成器新手教程&#xff1a;5个常用风格关键词3类背景模板Prompt速查表 1. 快速了解AI头像生成器 AI头像生成器是一个帮你设计专属头像创意的智能工具。你只需要简单描述想要的头像风格&#xff0c;它就能生成详细的描述文案&#xff0c;这些文案可以直接用在Midjourne…...

Android设备性能优化:Universal Android Debloater的技术实现与应用指南

Android设备性能优化&#xff1a;Universal Android Debloater的技术实现与应用指南 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery li…...

macOS下OpenClaw调试技巧:GLM-4.7-Flash接口连接问题排查

macOS下OpenClaw调试技巧&#xff1a;GLM-4.7-Flash接口连接问题排查 1. 问题背景与前期准备 上周在尝试将本地部署的GLM-4.7-Flash模型接入OpenClaw时&#xff0c;我遇到了三个典型问题&#xff1a;网关端口被占用、模型地址配置错误、以及Token消耗异常。这些问题导致自动化…...

【Python 面试突击 · 05】大厂高频面试题:从数据结构到并发编程深度解析

目录 1. 简述下 Python 中的字符串、列表、元组和字典 2. 深拷贝和浅拷贝概念理解 3. 为什么其他语言还要保留红黑树&#xff1f;不都直接用 hashTable&#xff1f; 4. 在 Python 中&#xff0c;进程和线程的区别&#xff1f; 5. Python 数据处理的库有哪些&#xff1f;用…...