一、驱动概念
驱动与底层硬件直接交互,充当了硬件与应用软件中的的桥梁。
具体任务
- 读写设备寄存器(实现控制的方式);
- 完成设备的轮询、中断处理、DMA通信(CPU与外设通信的方式)
- 进行物理内存向虚拟内存的映射(在开启硬件MMU的情况下)
说明:设备驱动的两个任务方向
- 操作硬件(向下)
- 将驱动程序通入内核,实现面向操作系统内的接口内容,接口由操作系统实现(向上)
驱动程序按照操作系统给出的独立与设备的接口设计,应用程序使用操作系统统一的系统调用接口来访问设备。
Linux系统主要部分:内核、shell、文件系统、应用程序
- 内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统;
- 分成设计的思想让程序见松耦合,有助于适配各种平台;
- 驱动的上面是系统调用,下面是硬件。
二、驱动分类
Linux驱动分为三个基础大类:字符设备驱动,块设备驱动,网络设备驱动。
1.字符设备(Char Device)
字符(char)设备是个能够像字节流(类似文件)一样被访问的设备;
对字符设备发出读/写请求时,实际的硬件I/O操作一般紧接着发生;
字符设备驱动程序通常至少要实现open,close,read和write系统调用;
比如我们常见的lcd、触摸屏、键盘、led、串口等等,他们一般对于具体的硬件都是进行数据的采集、处理、传输。
2.块设备(Block Device)
一个设备驱动程序主要通过传输固定大小的数据(一般为512或1K)来访问设备;
块设备通过buffer cache(内存缓冲区)访问,可以随机存取,即:任何块都可以读写,不必考虑它在设备的什么地方。
块设备可以通过它们的设备特殊文件访问,但是更常见的是通过文件系统进行访问。
比如我们常见的电脑硬盘、SD卡、U盘、光盘等。
3.网络设备(Net Device)
任何网络事务都经过一个网络接口形成,即一个能够和其他主机交换数据的设备;
访问网络接口的方法仍然是它们分配一个唯一的名字(比如echo0),但这个名字在文件系统中不存在对应的节点;
内核和网络设备驱动程序间的通信,完成不同于内核和字符以及块驱动程序之间的通信,内核调用一套和数据包传输相关的函数(socket)而不是read、write等;
比如我们常见的网卡设备、蓝牙设备。
三、驱动程序的功能
1.对设备初始化和释放;
2.把数据从内核传送到硬件和从硬件读取数据;
3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据;
4.检测和处理设备出现的错误。