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

Linux驱动.之驱动开发思维,设备,驱动,总线分析思想,驱动的分类(字符设备,块设备,网络设备)

在stm32,裸机开发时,偏底层,跟寄存器打交道,有些MCU提供了库,库也还是操作寄存器的,通过配置寄存器,
配置各种工作模式,时钟,等等,交换数据等等。

Linux下驱动开发直接操作寄存器不现实。一个soc的资源比较庞大,寄存器比较多,不肯能,所有设备,都直接操作寄存器。

Linux下,驱动开发,是根据Linux下的各种驱动框架进行开发。一定要满足框架,也就是Linux下各种驱动框架的掌握,完善框架。添加修改不同设备的属性,比如gpio,配置输入输出模式,高低电平等等,直接调用内核,提供的api,来进行操作。比如iic,spi,都是通过api来操作。将设备,驱动,进行了分离。驱动由厂商提供完善,总线由内核完善,设备的一部分由soc厂商完善,剩下一些配置等,由驱动开发者,进行修改移植。

驱动最终表现就是/dev/xxx文件。打开、关闭、读写、。。。

现在新的内核支持设备树,这个一个.dts文件,此文件 描述了板子的设备信息。比如要操作i2c一个外设,就要知道外设的地址,将设备信息,添加到设备树,板卡所有的信息,都添加到设备树,来告诉内核,板卡有什么资源,启动时,就会根据设备,去寻找驱动,进行匹配。

linux驱动分为三大类

1、字符设备驱动,最多的。字符设备,就是一个个字节,按字节流的方式,读写操作设备
2、块设备驱动,存储类设备,按块,读写数据,如sd卡都是一个块,页读写数据的
3、网络设备驱动,和网络相关的,就是网络设备
一个设备不说是一定只属于某一个类型。比如USB WIFI,SDIO WIFI,属于网络设备驱动,因为他又有USB和SDIO,因此也属于字符设备驱动。

在这里插入图片描述

应用程序和驱动的交互原理

1、驱动就是获取外设、或者传感器数据,控制外设。数据会提交给应用程序。Linux驱动编译既要编写一个驱动,还要我们编写一个简单的测试应用程序,APP。单片机下驱动和应用都是放到一个文件里面,也就是杂糅到一起。Linux下驱动和应用是完全分开的。

用户空间(用户态)和内核空间(内核态):
Linux操作系统内核和驱动程序运行在内核空间、应用程序运行在用户空间。

应用程序想要访问内核资源,怎么办,有三种方法:系统调用、异常(中断)和陷入

应用程序不会直接调用系统调用,而是通过API函数来间接的调用系统调用,比如POSIX、API和C库等。unix类操作系统中最常用的编程接口就是POSIX。

应用 程序使用open函数 打开一个设备文件。
每个系统调用都有一个系统调用号。
系统调用处于内核空间,应用程序无法直接访问,因此需要“陷入“到内核,方法就是软中断。陷入内核以后还要指定系统调用号。

在这里插入图片描述

关于虚拟内存有三点需要注意:

4G的进程地址空间被人为的分为两个部分–用户空间与内核空间。用户空间从0到3G(0xc0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。例外情况只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。
用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。
每个进程的用户空间都是完全独立、互不相干的。
一、4G地址空间解析图
在这里插入图片描述

二、虚拟地址空间分配及其与物理内存对应图
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 降低安全违规行为发生率,节省人工监管成本的智慧园区开源了
  • iOS面试:如何手动触发一个value的KVO?
  • Qt-桌面服务和托盘
  • GPU环境配置:1.CUDA、Anaconda、Pytorch
  • 备份还原 本地所有的Docker 镜像并且在另一台机器上还原
  • bios中启动模式uefi是什么意思_uefi相关知识史上最全介绍
  • 超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)
  • [米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-39 HDMI视频输入测试
  • 我司使用了两年的高效日志打印工具,非常牛逼!
  • 【C++】优化函数对象:提升性能和内存效率
  • 第十六篇:走入计算机网络的传输层--传输层概述
  • 【Linux 运维知识】Linux 编译后的内核镜像大小
  • elementplus表单位置居中
  • SSH免秘钥问题
  • mac 安装brew并配置国内源
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【译】理解JavaScript:new 关键字
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • js正则,这点儿就够用了
  • Mocha测试初探
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue:响应原理
  • 编写高质量JavaScript代码之并发
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于axios的vue插件,让http请求更简单
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一个项目push到多个远程Git仓库
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 源码安装memcached和php memcache扩展
  • Hibernate主键生成策略及选择
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #知识分享#笔记#学习方法
  • (13)Hive调优——动态分区导致的小文件问题
  • (33)STM32——485实验笔记
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (SERIES12)DM性能优化
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (四)c52学习之旅-流水LED灯
  • (一)基于IDEA的JAVA基础10
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)nsfocus-绿盟科技笔试题目
  • (转)视频码率,帧率和分辨率的联系与区别
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • . Flume面试题
  • .“空心村”成因分析及解决对策122344
  • .NET Core跨平台微服务学习资源
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [android学习笔记]学习jni编程
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#] 如何调用Python脚本程序
  • [C#]DataTable常用操作总结【转】