Skip to content

LV005-驱动简介

一、操作系统

计算机出现的时候,就是它只能执行一个任务,执行一个进程,也可以叫“裸跑”。向我们最开始接触的 51 单片机。

可以拿的手机来比喻,裸机的话,就是我们玩王者荣耀的时候,有人打电话进来的话,王者荣耀是要被终止的。后来就有了操作系统,操作系统可以保证多任务执行,同样的 CPU 芯片,有了操作系统,我可以开微信,QQ ,还同时做其他很多事情。

所以就出来了很多操作系统,操作系统可以 分为实时操作系统和通用操作系统

时操作系统(RTOS 全称 Real Time Operating System)可以理解为对时间要求非常苛刻,可以用一个词“必须”来理解,就是在某个时间段之内必须要做某件事情。

通用操作系统很常见,比如电脑 windows,Android 手机,ios 手机等,Linux 也可以认为是通用 OS, 因为他们对时间要求不是很严苛。

Linux 可以通过配置某个宏定义变成实时操作系统,但是我们使用 Linux 主要是针对他的通用 OS,多用户,多任务等特别突出的性能。

二、什么是驱动?

1. 驱动

照字面意思就是给一个东西动力,让它动起来,至于物体怎么动是有一定的逻辑规律在里面的;对于电学中的硬件驱动来说,电力提供了动力,但是驱动程序提供了操作物体的逻辑方法

比如我们的 LED 路灯照明,电让我们的 LED 灯亮起来,但是里面的程序检测到时间的变化控制电路的导通和断开,这里面的驱动程序就叫 LED Driver。

2. linux 驱动

linux 驱动是 linux 内核驱动的全称。广义上是指操作硬件,让硬件工作起来的程序代码,这段代码就叫做硬件的驱动程序。但是在裸机开发中我们也经常会听到裸机驱动,其实严格意义上来说,没有操作系统是没有驱动概念的,如果非要说裸机驱动的话,也是指裸机中操作硬件的那部分程序。

linux 驱动狭义上是指操作系统中用来控制硬件的逻辑方法的那部分代码。

对于这个定义我们可以从以下两方面去进行理解:

(1)操作系统有很多种,windows 有 windows 驱动,ios 有 ios 驱动,android 有 android 驱动,而我们学习的 linux 驱动则是针对 linux 操作系统平台。

(2)linux 驱动只是内核中的一部分,除了用来控制硬件的这部分外,还有文件系统,内存管理,内核调度等内容。

三、驱动程序分类

Linux 驱动分为三个基础大类:字符设备驱动,块设备驱动,网络设备驱动

1. 三类驱动程序

1.1 字符设备

准确的说应该叫“字节设备”,指应用程序按字节/字符来读写数据的设备。 这些设备节点通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务, 它通常不支持随机存取数据。字符设备在实现时,大多不使用缓存器。

系统直接从设备读取/写入每一个字符。 例如,键盘这种设备提供的就是一个数据流,当我们敲入“cnblogs”这个字符串时, 键盘驱动程序会按照和输入完全相同的顺序返回这个由七个字符组成的数据流。它们是顺序的,先返回 c,最后是 s。

对字符设备发出读/写请求时,实际的硬件 I/O 操作一般紧接着发生。字符设备驱动程序通常至少要实现 open、close、read 和 write 系统调用。比如我们常见的 lcd、触摸屏、键盘、led、串口等等,他们一般对应具体的硬件都是进行出具的采集、处理、传输。

1.2 块设备

块设备被应用程序操作时是以块(多个字节构成的一个单位)为单位的。通常支持随机存取和寻址,并使用缓存器。 操作系统为输入输出分配了缓存,以存储一块数据。当程序向设备发送了读取或者写入数据的请求时, 系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走), 而后系统清空缓存。

它与字符设备不同之处就是,是否支持随机存储。字符型是流形式,逐一存储。 典型的块设备有硬盘、SD 卡、闪存等,应用程序可以寻址磁盘上的任何位置,并由此读取数据。 此外,数据的读写只能以块的倍数进行。

设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。

1.3 网络设备

一种特殊设备,它并不存在于/dev 下面,主要用于网络数据的收发。任何网络事务都经过一个网络接口形成,即一个能够和其他主机交换数据的设备。

访问网络接口的方法仍然是给它们分配一个唯一的名字(比如 eth0),但这个名字在文件系统中不存在对应的节点。

内核和网络设备驱动程序间的通信,完全不同于内核和字符以及块驱动程序之间的通信,内核调用一套和数据包传输相关的函(socket 函数)而不是 read、write 等。

哪些是网络设备?比如我们常见的网卡设备、蓝牙设备。

2. 三个对象

Linux 内核中处处体现面向对象的设计思想,为了统一形形色色的设备,Linux 系统将设备分别抽象为 struct cdev, struct block_device, struct net_devce 三个对象,具体的设备都可以包含着三种对象从而继承和三种对象属性和操作, 并通过各自的对象添加到相应的驱动模型中,从而进行统一的管理和操作。

后续我们再详细的去学习这三类驱动程序。