第一天 Linux驱动程序简介

目录

一、驱动的作用

二、裸机驱动 VS linux驱动

1、裸机驱动

2、linux驱动

三、linux驱动位于哪里?

四、应用编程 VS 内核编程

1、共同点

2、不同点

五、linux驱动分类

1、字符设备

2、块设备

3、网络设备

六、Linux驱动学习难点与误区

1、学习难点

2、学习误区


 一、驱动的作用

相信学过os的同学,对上面的图应该不陌生,操作系统位于应用层和硬件之间,向下管理着各种硬件资源,向上屏蔽硬件细节,提供统一操作接口。当应用层需要操作硬件时,通过各种系统调用向操作系统发出请求,操作系统根据传入的参数,找到对应硬件的驱动,驱动再根据需求,操作硬件,完成请求。

二、裸机驱动 VS linux驱动

下面以最简单的“点灯”实验,来看裸机驱动和linux驱动的差别:

硬件电路图如下:

当GPIO输出高电平时,LED灯亮

当GPIO输出低电平时,LED灯灭

1、裸机驱动

应用层:在while循环里,调用gpio_init()对gpio做初始化,调用Led_on()/Led_off()来控制LED亮灭

驱动层:需要用到两个moudle:gpio和Led,其中gpio提供gpio操作函数集,如gpio_init(),gpio_output()等等,Led则提供led_init(),led_on()和led_off() ,led_on()调用gpio_ouput(1),让GPIO输出高电平,从而点亮led,同理,led_off()调用gpio_ouput(0),让GPIO输出低电平,从而熄灭led

2、linux驱动

首先linux驱动都是以module的形式来写的,其次Led属于字符设备,所以需要注册一个字符设备,要向linux内核注册一个字符设备,需要满足三要素:分配设备号,实现file_operation操作集,动态分配并add一个cdev。操作gpio的操作可以包含在file_operation操作集里write函数中

你可能会疑惑:为什么linux驱动要这么复杂呢?其实一切都是为了实现“一切皆文件”的思想,这样操作硬件就可以像操作文本文件一样简单啦

三、linux驱动位于哪里?

来一张linux系统全景图:

为了提升系统的安全性,操作系统利用处理器的特权模式,将进程的地址空间分成了两部分:用户空间和内核空间,从上图可以看出,驱动位于内核空间,所以驱动开发属于内核编程范畴。

 四、应用编程 VS 内核编程

1、共同点

1)无论应用编程,还是内核编程,都是编程,编程就是写程序,而程序 = 数据结构 + 算法,所以常用数据结构和算法是编程的基石! 

2)熟悉相应的API及其用法,应用编程需要和内核交互,比如在linux系统中操作文件,首先要open文件,open函数需要两个参数,一个是路径,一个是flag。linux驱动同样需要与linux内核交互,比如创建一个字符设备需要先分配cdev结构体,再cdev_init,最后cdev_add

2、不同点

1)应用程序执行任务,从开始到结束,内核模块将自己注册到内核中,在module_init中做些初始化操作后,等待被调用

2)并非所有应用程序都是事件驱动类型,但所有内核模块都是事件驱动类型

3)应用程序可以选择偷懒不去释放资源,由OS来统一回收,内核模块卸载函数需要做init里相反的操作,否则资源一直被占用,直到系统重启

4)应用程序可以使用C库,但内核模块只能使用内核export出来的符号表

5)处理错误的方式不同:应用程序一般会出现段错误,可以使用gdb直接调试,内核模块可能会使系统panic,或者重启

五、linux驱动分类

根据设备操作的特点,分为字符设备驱动,块设备驱动和网络设备驱动

1、字符设备

  • 字节流

  • 一般顺序访问

  • 存在特殊的字符设备,允许lseek,mmap等操作

2、块设备

  • 以块大小(512 byte)进行传输

  • 任意顺序访问

  • 可以安装文件系统

3、网络设备

  • 使用套接字,处理网络事务

工作中遇到绝大多数的设备为字符设备,比如串口,LCD,触摸屏,platform设备等等都是字符设备。

六、Linux驱动学习难点与误区

1、学习难点

1)linux驱动开发属于内核编程,需要经常与内核其他子系统交互,因此需要熟悉linux内核

2)linux驱动需要处理并发,尤其如今已属于SMP的天下

3)linux驱动的鲁棒性要求高,否则会导致kernel panic

2、学习误区

1)没有硬件知识,看不懂原理图,就不能做驱动开发

解释:并非所有驱动都依赖对原理图的理解,在实际工作中,驱动分为外设驱动和bsp驱动,其中bsp驱动,如pinctrl驱动,gpio驱动,clk驱动,regulator驱动,这些只依赖Soc的设计,和原理图无关。

2)没有开发板,就没法学习linux驱动

解释:如果要开发的驱动不涉及具体硬件,优先选择qemu环境进行驱动开发

3)看书和看培训视频就行,不需要自己动手

解释:20%理论 + 80%实践,多动手,多实践,方能事半功倍!!

4)抱着经典书狂啃就够了

解释:其实最好的学习资料是源代码,经典书虽然经典,但其中内容早已过时,阅读经典书重要的是把握其中的设计思想,阅读最新的linux内核源代码才知晓具体实现细节

参考资料:《LDD3》

                  《linux设备驱动开发详解,基于4.0内核》

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

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

相关文章

PaddleX产线集成功能的使用整理

一、环境搭建 1.1 安装paddle-gpu 需要根据安装机器的cuda的版本,选择合适的版本进行安装 #安装paddle-gpu 官网链接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库

1、找一个文件夹,比如 E:\zqy\file\mysql,cd到这个目录下创建文件docker-compose.yml 2、将下面的代码块复制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’ 在构建 Spring 源码或其他基于 Gradle 的项目时,可能会遇到如下错误: Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…

mcp 接freecad画齿轮

from mcp.server.fastmcp import FastMCP import freecad.gears.commands import os from freecad import app from freecad import part mcp FastMCP("Demo")mcp.tool() def create_gear(num_teeth20,height10,double_helix True):"""创建一个渐开线…

【大前端系列19】JavaScript核心:Promise异步编程与async/await实践

JavaScript核心:Promise异步编程与async/await实践 系列: 「全栈进化:大前端开发完全指南」系列第19篇 核心: 深入理解Promise机制与async/await语法,掌握现代异步编程技术 📌 引言 在JavaScript的世界中,异步编程是无…

如何排查java程序的宕机和oom?如何解决宕机和oom?

排查oom 用jmap生成我们的堆空间的快照Heap Dump(堆转储文件),来分析我们的内存占用 用可视化工具,例如java中的jhat分析Heap Dump文件 ,它分析完会通过一个浏览器打开一个可视化页面展示分析结果 根据oom的类型来调…

什么是 OLAP 数据库?企业如何选择适合自己的分析工具

引言:为什么企业需要 OLAP 数据库? 你是否曾经经历过这样的场景: 市场部门急需一份用户行为分析报告,数据团队告诉你:“数据太大了,报表要跑 4 个小时”;业务负责人在会议中提出一个临时性分析…

测试:认识Bug

目录 一、软件测试的生命周期 二、bug 一、软件测试的生命周期 软件测试贯穿于软件的生命周期。 需求分析: ⽤⼾⻆度:软件需求是否合理 技术⻆度:技术上是否可⾏,是否还有优化空间 测试⻆度:是否存在业务逻辑错误、…

综合实验2

1、sw1和sw2之间互为备份 [sw1]interface Eth-Trunk 0 (创建聚合接口) [sw1-Eth-Trunk0]trunkport g0/0/1 (将物理接口划入到聚合接口中) [sw1-Eth-Trunk0]trunkport g0/0/2 [sw2]interface Eth-Trunk 0 [sw2-Eth-T…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

Django之旅:第五节--Mysql数据库操作(一)

Django开发操作数据库更简单,内部提供了ORM框架 一、安装第三方模块 pip install mysqlclient注:最新的django框架需要使用mysqlclient模块,之前pymysql模块与django框架有编码兼容问题。 二、ORM 1、ORM可以帮助我们做两件事:…

docker部署mongodb数据库

1、下载 MongoDB 镜像 使用Docker部署MongoDB 之前,我们需要从 Docker Hub 上下载 MongoDB 镜像。这里我们下载最新版本的 MongoDB 镜像,使用以下命令进行下载: docker pull mongo:latest 下载完成后,我们就拥有了最新版本的 Mon…

Enhanced PEC-YOLO:电力施工场景安全装备检测的轻量化算法解析

目录 一、核心概述 二、核心创新点 1. ​C2F_Faster_EMA模块 2. ​SPPF_CPCA多尺度模块 3. ​BiFPN颈部网络

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…

RTMP推流服务器nginx在linux上的编译部署

RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…

PyQt6实例_批量下载pdf工具_主线程停止线程池

目录 前置: 代码: 视频: 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点: 线程池:QThreadPool,QRunnable; 信号与…

Tomcat生产服务器性能优化

试想以下这个情景:你已经开发好了一个程序,这个程序的排版很不错,而且有着最前沿的功能和其他一些让你这程序增添不少色彩的元素。可惜的是,程序的性能不怎么地。你也十分清楚,若现在把这款产品退出市场,肯…

正则表达式-笔记

文章目录 一、正则表达式二、正则表达式的基本语法字符类普通字符非打印字符特殊字符 量词限定符锚点修饰符(标记) 三、在 Python 中使用正则表达式简单搜索提取信息替换文本 参考 从验证用户输入,到从大量文本中提取特定信息,再到…

Qwen-0.5b linux部署

参考链接 https://blog.csdn.net/imwaters/article/details/145489543 https://modelscope.cn/models/modelscope/ollama-linux 1. ollama安装 # 安装ModelScope工具包,用于下载和管理AI模型 pip install modelscope# 下载Ollama的Linux版本安装包 # --model 指定…

【深度学习】GAN生成对抗网络:原理、应用与发展

GAN生成对抗网络:原理、应用与发展 文章目录 GAN生成对抗网络:原理、应用与发展1. 引言2. GAN的基本原理2.1 核心思想2.2 数学表达2.3 训练过程 3. GAN的主要变体3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…