1 驱动程序,操作系统,文件系统和应用程序之间的关系
字符设备和块设备映射到操作系统中的文件系统,由文件系统向上提供给应用程序统一的接口用以访问设备。
Linux把设备视为文件,称为设备文件,通过对设备文件的读写操作实现对真实外设的操作。
从驱动程序的角度来从下到上看层次结构,包含了硬件设备,设备驱动程序(中断处理程序,设备服务程序),文件系统和用户进程四个层次:
需要知道的两个概念:
设备号:
- 主设备号:标识同一类设备,对应一个驱动程序
- 从设备号:标识一个设备实例,从设备号使得不同的物理设备使用同一个驱动程序。
设备文件:存在硬盘上的实际存在的文件,包括设备的名字,类型,设备号
需要知道的三个关于驱动操作的数据结构:
- file_operations:文件操作,每个进程对设备的访问都会转换为对file_operations的访问,调用里面的操作函数指针;
- file:打开的文件
- inode:由内核在文件系统中表示文件
2 字符设备的注册
至此,设备驱动注册完成,有相应的设备驱动程序和设备号与之对应。
3 设备的打开
设备注册完成后,可以打开一个设备,这时候调用系统调用open()函数,经过一系列的调用,最后会调用chrdev_open()函数进行实际的打开操作,其主要流程为:
设备注册打开完成后,需要对其进行各种操作,外部设备的操作有一个特点就是操作时间较长,且操作时间不确定。
处理外部设备运作时,主要有两种方式:轮询和中断。
下面主要用介绍用中断的模式等待外设完成操作,其主要流程为:
4 小结
这里简单总结了一下Linux处理外部设备的主要流程,主要包括了外部设备的注册,打开和通常的操作。
需要注意的知识点就是驱动设备模型的概念,在字符设备中位cdev。所有对设备的操作,都是在cdev的ops字段寻找处理程序,之前将cdev映射道inode的i_cedv中,cdev的ops字段映射到设备文件file的f_op字段,这样对设备文件的操作就等同于对设备的操作,这正是本文开头所说明的设备文件映射到文件系统的实质。
在外部设备的操作流程中,涉及到中断处理流程,主要指的是软中断,会在中断一章详细讨论。
参考:
Linux操作系统分析PPT:驱动程序编写基础