Linux 驱动认知

驱动的引入介绍

  用户空间分为APP 和 C library;我们之前写的cp 指令,ftp云盘都是属于写APP相关的开发,然后我们讲了APP 相关开发需要两部分C语言基础和C的库。
  那我们前面讲了那些库呢?1.文件 2.进程 3.进程间通信 4.线程 5.网络
  也就是我们讲的 open read write fork pthread socket 在C库封装实现,目的是给上层我们写的应用程序调用。而C库里的各种API 它是调用内核态去支配内核干活,所以我们说C库提供了APP 支配内核干活的接口。所以对一个App 工程师来说他不需要懂内核底层发生了什么事,不管是内核底层的进程、内存、线程、网络还是我们今天要讲的设备驱动都不需要上层开发者去关心是不是?要用线程去调fork,要用线程去调pthread,驱动我们在树莓派上用的什么?用的wiringPi,我们今天的内容就是自己去实现wiringPi库。而 open read write fork pthread socket 这些是Linux 的标准库,只要能运行Linux 就一定有。C库是一定有的但是wiringPi 不同的平台,厂家不一定会提供,那么开发者必须要学会自己开发。我们以后去做 嵌入式工程师做产品肯定是做App,如:公交刷卡机,KTV点歌机是不是大家看到的都是App 类的都是用C语言配合C库去操作的,然后跟硬件有关的会用到wiringPi库,有的公司不提供wiringPi 那我们就只有自己实现了。
  所以我们从Linux 高阶开发课程,从交叉编译链的安装一直到这节课程主要目的就是实现wiringPi 库,因为大家学到这个时候C语言编程能力已经不错了,C库也了解了不少,剩下的东西用wiringPi 你都能实现,那问题是厂家不给你提供wiringPi 这一块的能力就需要大家加强。而且这是是属于嵌入式里面比较高级的技术。讲到这里其实大家心心念念的智能家具项目已经能做了,不需要学习内核里面的东西,不需要了解驱动,智能家居项目不过是基于FTP 项目的一个变更。
  那为什么要学习驱动呢?是为了大家把wiringPi 库玩明白,以后在未来换一块板也能做智能家居
在这里插入图片描述

用户空间的App 与底层驱动之间的关系

  我们有一句话啊,Linux非常经典的话:“一切皆文件”,什么意思呢?在Linux 中文件、设备(鼠标、键盘、LED)、flash、内存、网卡等,都是以文件的形式存在的。
在这里插入图片描述
  而对于文件的操作在用户空间我们能学到的C库操作就只有几种(open、read、write),问题是你的open 为什么能够区分得了你打开得是键盘还是鼠标,为什么能区分得了是LED 还是屏幕?是如何区分得?网卡、flash等设备需不需要驱动?驱动又在那个位置?这都是我们需要了解的。
  首先驱动是必须要有的百分之一百,比如说我们树莓派的插针引脚(pin4,pin5),磁盘中的某个文件这些都是有驱动的,那这些驱动哪里来呢?肯定是我们来写,所以在后面的课程我们会在内核空间里的内核源码里去添加我们写的驱动。
  问题回到我们的open 能够找到这个驱动,比如说我们打开引脚4 open(“/dev/pin4”,***),从上图看得到没有pin4 相关俄文件,当我们未来写好pin4 相关的驱动后肯定会在dev 底下。我们去open 引脚4 肯定是去打开引脚4 的驱动,对不对,所以这边一个很重要的东西一定要有一个区分如何去找到相关的驱动,有两个1.文件名(当然也有一种基于驱动框架的不需要文件名,但如果是最初级的那种驱动框架一定要有文件名) 2.设备号
在这里插入图片描述
  Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件(即 open,read,write 操作),完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。(如:苹果手机,华为手机为主设备号;苹果的苹果12、苹果13为苹果的次设备号,华为的mate30、mate40是华为的此设备号)主设备号和次设备号除了这个作用在代码中也起很大作用。
  其实我们写驱动代码,内核里面有一个叫做驱动链表回去管理所有设备的驱动。这所谓的管理有两个层次的概念:第一个是添加,第二个是查找;添加发生在我们编写完驱动程序,加载到内核里;查找发生在调用驱动程序,用户空间去open。所以上面我们说到open pin4 打开的为什么是引脚4 的驱动就是因为设备号在管理。
  然后我们说有一个驱动链表,假设驱动链表为下图所示
在这里插入图片描述
驱动插入链表的顺序由设备号检索,由这个编号来检索你这个驱动应该插到链表的那个位置。所以说主设备号次设备号除了能区分品牌和设备以外,还能起到把驱动程序串到链表的某个位置。
  然后我们对驱动的开发无非就两件事:1.添加驱动 2.调用驱动

整体的调用过程

  C语言上层调用open 函数 open(“/dev/pin4”,O_RDWR); /dev下的pin4 以可读可写的方式打开,这个open会调用什么呢?会调用内核里面的 system call interface(sys_call),然后会调到 vfs(虚拟文件系统)因为你磁盘的的分区跟引脚的分区肯定不一样,为了实现上层统一化所以来到 VFS,然后调用这边的sys_open。对于内核,我们上层调用open 会触发一个中断异常进入到内核它是一个软中断,中断号是0x80(0x80 表示发生了一个系统调用,这个中断号存放的就是系统调用的东西);从用户空间进入到内核空间,open 函数回去调用sys_call(内核中是汇编写的),sys_call去找出你的设备根据设备名去找到设备号会去调用 VFS 中的sys_open ,sys_open 会找到引脚4 驱动程序中的open 函数,是这样一个流程。然后我们在引脚4里的open肯定是对寄存器的操作。

总结:我们上层调用open 会产生一个软中断,然后会来到sys_call,sys_call会调用sys_open ,sys_open 根据主设备号和次设备号去找到驱动链表中你想要用的那个驱动程序中的open。

  我们写驱动无非就是把驱动加到内核里面相应驱动位置的open。添加驱动要做这几件事:1.设备名 2.设备号 3.设备驱动函数(操作寄存器来驱动IO 口)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值