一、设备驱动的作用
任何一个计算机系统的运转都是系统中软硬件共同努力的结果。
对设备驱动最通俗的解释就是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA 通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。
由此可见,设备驱动充当了硬件和应用软件之间的纽带,应用软件时只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。
二、无操作系统时的设备驱动
在没有操作系统的情况下,设备驱动的接口被直接提交给应用软件工程师,应用软件没有跨越任何层次就直接访问设备驱动的接口。
驱动包含的接口函数也与硬件的功能直接吻合,没有任何附加功能。
三、有操作系统时的设备驱动
当系统中存在操作系统的时候,驱动变成了连接硬件和内核的桥梁。
操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块,它对外呈现为操作系统的 API,不再给应用软件工程师直接提供接口。
四、Linux设备驱动
1. 设备驱动的分类及特点
设备驱动针对的对象是存储器和外设(包括 CPU 内部集成的存储器和外设),而不是针对CPU 内核。
Linux 将存储器和外设分为 3 个基础大类。
- 字符设备:必须以串行顺序依次进行访问的设备。
- 块设备:可以按任意顺序进行访问,以块为单位进行操作的设备。
- 网络设备:面向数据包的接收和发送而设计。
2. 设备驱动与系统的关系
在Linux系统中,所有设备都被映射到 Linux 文件系统的文件和目录,
通过文件系统的系统调用接口 open()、write()、read()、close() 等访问。所有字符设备和块设备都统一呈现给用户。
3. 设备驱动的重点、难点
- 编写 Linux 设备驱动要求工程师有非常好的硬件基础。
- 编写 Linux 设备驱动要求工程师有非常好的 C 语言基础。
- 编写 Linux 设备驱动要求工程师有一定的 Linux 内核基础。
- 编写 Linux 设备驱动要求工程师有非常好的多任务并发控制和同步的基础。