1. Linux驱动简介
在介绍Linux驱动之前,我们首先来看Linux系统分层关系:

Linux驱动主要具有如下几点作用:
- 系统调用是应用程序和内核之间的接口,驱动程序是内核和硬件之间的接口;
- 驱动程序接受上层软件(应用程序、内核)的请求,完成对硬件的操作,屏蔽了硬件的细节;
- 驱动程序将硬件设备抽象成一个文件,应用程序操作文件即操作硬件,符合Linux“一切皆文件”的思想。
2. 驱动的分类及特点
计算机硬件系统有CPU、存储器以及外设组成,Linux驱动针对的对象是存储器和外设;Linux将驱动分为三大类:字符设备驱动、块设备驱动以及网络设备驱动。
- 字符设备驱动:顾名思义,应用程序与驱动程序之间的数据交互是以字符(字节)为单位的,字符设备通常没有中间缓存。常见的字符设备有:led、key、camera、显卡、串口等
- 块设备驱动:顾名思义,应用程序与驱动程序之间的数据交互是以块为单位的,主要针对的是存储设备,通常设有中间缓存,并且带有文件系统,可以任意位置访问。常见的块设备有:U盘、eMMC、SD卡等
- 网络设备驱动:网络设备面向数据包的发送而设计,它并不对应于文件系统的节点。即不对应 /dev 目录下的设备文件,应用程序最终通过套接字 socket 完成与网络设备的数据交互。常见的网络设备有网卡(无线网卡、有线网卡)。
Linux驱动有两种存在形式,一种是编译进内核;另一种编译成模块,通过insmod方式安装的。不管是哪一种方式,除了网络设备之外,字符设备驱动和块设备驱动的安装都会在Linux根文件系统的 /dev 目录下创建相对应的设备文件(块设备比较特殊,除了创建设备文件外,还会在根文件系统的某个目录下挂载文件系统),应用程序可以通过 open()、write()、read()、ioctl()、close()系统调用接口访问设备。