目录
1、什么是驱动?
2、应用程序调用驱动基本流程
3、file_operations 结构体
4、驱动的分类
1、什么是驱动?
驱动就是一段程序,能够获取外设或者传感器数据、控制外设。驱动获取到的数据会提交给应用程序。
在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“ /dev/xxx ”的文件进行相应的操作即可实现对硬件的操作。比如 /dev/ttyS2 表示串口设备,应用程序可以调用 read 函数从设备中读取数据,可以调用write函数向设备写入数据。
表面上是应用程序在操作设备,实际上这个过程中有驱动的参与。
2、应用程序调用驱动基本流程
应用程序运行在用户空间,而驱动是被加载到内核的,运行在内核空间,正常情况下,应用程序无法直接访问内核,内核给用户层提供了API接口来访问内核。这些API接口我们称为“ 系统调用 ”。
应用程序调用驱动的基本流程如下。我们会发现应用程序调用 open 函数以后,先进入到内核,然后会调用内核中的 open 函数,这里的 open 函数才是真正操作硬件的执行人。因此,编写驱动实际就是在完善内核中的 open、close、read等函数。
上层应用层的每一个系统调用函数,在内核都会有与之对应的函数。
应用层 | 内核 |
open | open |
read | read |
close | release |
3、file_operations 结构体
问:上面说到,编写驱动其实就是在完善内核中的 open、close、read等函数,那么这些函数是自己设计还是有现成的呢?
答:
前人已经设计出了一套完整的框架,这个框架已经包含了我们所需的大部分函数声明,所以无需我们自己设计,我们只要继续沿用前人的声明即可。
内核源码中有个 include/linux/fs.h 文件,这个文件定义了一个 file_operations 结构体,该结构体中就包含了今后要实现的函数声明。
4、驱动的分类
设备不同,实际操作的方式也会不同,因此根据设备的种类,驱动可以大致分为三类:
字符型设备驱动:
只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序。常见的字符设备有鼠标、键盘、串口、控制台和LED设备。
块设备驱动:
可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等存储类设备。
网络设备驱动:
负责读写来自网络的数据。常见的网络设备有网卡(有线、无线)。