定义
驱动是 Linux 系统中设备和用户之间的桥梁,Linux 系统中,访问设备必须通过设备驱动进行操作,用户程序是不能直接操作设备的。Linux 系统中硬件、驱动和用户程序的关系如下图。
驱动程序运行与内核空间,用户程序只能通过内核提供的系统调用,由经 VFS 以及驱动程序才能访问和操作硬件,硬件设备传递的数据也必须经过驱动、VFS 和系统调用才能被用户程序接收。所以说,设备驱动是应用程序访问系统设备以及进行数据传递的桥梁和通道。
驱动的基本要素
Linux 设备驱动是具有入口和出口的一组方法的集合,各方法之间相互独立。驱动内部逻辑结构如下图。
Linux 设备在内核中是用设备号进行区分的,而决定这些设备号的正是设备驱动程序。另外,在用户空间如何管理这些设备,这也是与驱动程序息息相关的。一个完整的设备驱动必须具备以下基本要素:
1) 驱动的入口和出口。驱动入口和出口部分的代码,并不与应用程序直接交互,仅仅只与内核模块管理子系统有交互。在加载内核的时候执行入口代码,卸载的时候执行出口代码。这部分代码与内核版本关系较大,严重依赖于驱动子系统的架构和实现。
*2) 操作设备的各种方法。驱动程序实现了各种用于系统服务的各种方法,但是这些方法并不能主动执行,发挥相应的功能,只能被动的等待应用程序的系统调用,只有经过相应的系统调用,各方法才能发挥相应的功能,如应用程序执行 read()系统调用,内核才能执行驱动 xxx_read()方法的代码。这部分代码主要与硬件和所需要实现的操作相关。
3) 提供设备管理方法支持。包括设备号的分配和设备的注册等。这部分代码与内核版本以及最终所采用的设备管理方法相关系,如采用 udev,则驱动必须提供相应的支持代码。
驱动的核心思想
核心思想就是框架
- 字符设备
- 混杂设备
- 输入子系统
- 平台设备驱动
- I2C模型
…