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地址空间解析图

二、虚拟地址空间分配及其与物理内存对应图

相关推荐
方竞28 分钟前
Linux空口抓包方法
linux·空口抓包
海岛日记1 小时前
centos一键卸载docker脚本
linux·docker·centos
AttackingLin2 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
学Linux的语莫3 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
踏雪Vernon3 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
学Linux的语莫4 小时前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器
legend_jz4 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py4 小时前
【Linux】-学习笔记04
linux·笔记·学习
黑牛先生4 小时前
【Linux】进程-PCB
linux·运维·服务器