一文讲解Linux内核——设备驱动程序,详细了解

----- 设备驱动程序通常又称为设备处理程序,它是I/O进程与设备控制器之间的通信程序,又由于它常以进程的形式存在,可简称之为

设备驱动进程。其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,在把它转换为具体要求后,发送给设备控制器,启动

设备去执行;此外,它也将从设备控制器发来的信号传送给上层软件。

----- 由于驱动程序与硬件密切相关,故应为每一类设备配置一种驱动程序,有时也可为非常类似的两类设备配置一个驱动程序。例如,打印机

和显示器需要不同的驱动程序,但SCSI磁盘驱动程序通常可以处理不同大小和不同速度的多个SCSI磁盘,甚至还可以处理SCSI CD-ROM。

1、设备驱动程序的功能

为了实现I/O进程与设备控制器之间的通信,设备驱动程序应具有以下功能:

-- 1)接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为具体要求。

例如,将磁盘块号转换为磁盘的盘面、磁道号及扇区号。

-- 2)检查用户I/O请求的合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式。

-- 3)发出I/O命令。

如果设备空闲,便立即启动I/O设备去完成指定的I/O操作;如果设备处于忙碌状态,则将请求者的请求块挂在设备队列上等待。

-- 4)及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。

-- 5)对于设置有通道的计算机系统,驱动程序还应能够根据用户的I/O请求,自动地构成通道程序

2、设备处理方式

在不同的操作系统中所采用的设备处理方式并不完全相同。

根据在设备处理时是否设置进程,以及设置什么样的进程而把设备处理方式分成以下三类:

---- 1)为每一类设备设置一个进程,专门用于执行这类设备的I/O操作。

比如,为所有的交互式终端设置一个交互式终端进程;为同一类型的打印机设置一个打印进程。

---- 2)在整个系统中设置一个I/O进程,专门用于执行系统中所有各类设备的I/O操作。

也可以设置一个输入进程和一个输出进程,分别处理系统中所有各类设备的输入和输出操作。

---- 3)不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块),供用户进程或系统进程调用。

3、设备驱动程序的特点

设备驱动程序属于低级的系统例程,它与一般的应用程序及系统程序之间有下述明显差异:

--- 1)驱动程序主要是指在请求I/O的进程与设备控制器之间的一个通信和转换程序。

它将进程的I/O请求经过转换后,传送给控制器;又把控制器中所记录的设备状态和I/O操作完成情况及时的反应给请求I/O的进程。

--- 2)驱动程序与设备控制器和I/O设备的硬件特性紧密相关,因而对不同类型的设备应配置不同的驱动程序。

例如,可以为相同的多个终端设置一个终端驱动程序,但有时即使是同一类型的设备,由于其生产厂家不同,他们也可能并不完全兼容,

此时也需为它们配置不同的驱动程序。

--- 3)驱动程序与I/O设备所采用的I/O控制方式紧密相关。

常用的I/O控制方式是中断驱动和DMA方式,这两种方式的驱动程序明显不同,后者是按数组方式启动设备及进行中断处理。

--- 4)由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言编写。目前有很多驱动程序的基本部分,已经固化在ROM中。

--- 5)驱动程序应允许可重入。一个正在运行的驱动程序常会在一次调用完成前被再次调用。

例如,网络驱动程序正在处理一个到来的数据包时,另一个数据包可能已经到达。

--- 6)驱动程序不允许系统调用。

但是为了满足其与内核其它部分的交互,可以允许对某些内核过程的调用。如通过调用内核过程来分配和释放内存页面作为缓冲区。

4、设备驱动程序的处理过程

不同类型的设备应有不同的设备驱动程序,但大体上它们都可以分成两部分:

--------- 能够驱动I/O设备工作的驱动程序

--------- 设备中断处理程序(处理I/O完成后的工作)。

设备驱动程序的主要任务是启动指定设备。但在启动之前,还必须完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备

工作后,才向设备控制器发送一条启动命令。以下是设备驱动程序的处理过程:

-- 1)将抽象要求转换为具体要求

由于用户及上层软件对设备控制器的具体情况毫无了解,因而只能向它发出抽象的要求(命令),但这些命令无法传送给设备控制器。因此

就需要将这些抽象要求转换为具体要求。这一转换工作只能由驱动程序来完成,因为在OS中只有驱动程序才同时了解抽象要求和设备控制器

中的寄存器情况;也只有它才知道命令、参数和数据应分别送往哪个寄存器。

-- 2)检查I/O请求的合法性

-- 3)读出和检查设备的状态

-- 4)传送必要的参数

对于许多设备,特别是块设备,除必须向其控制器发送启动命令外,还需传送必要的参数。例如在启动磁盘进行读/写之前,应先将本次要传送

的字节数和数据应到达的主存始址,送入控制器的相应寄存器中。

-- 5)工作方式的设置

-- 6)启动I/O设备

驱动程序发出I/O命令后,基本的I/O操作是在设备控制器的控制下进行的。通常,I/O操作所要完成的工作较多,需要一定的时间,如读/写一个

盘块中的数据,此时驱动(程序)进程把自己阻塞起来,直到中断到来时才将它唤醒。

你可能感兴趣的:(linux,驱动开发,运维)