5.3 I/O设备驱动程序
什么是设备驱动程序?
设备处理程序通常又称为设备驱动程序,它是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,文件系统把这些请求转换为具体要求后,发送给设备控制器,启动设备去执行;
反之,它也将由设备控制器发来的信号传送给上层软件。
思考一下为何不同的设备需要不同的设备驱动程序?
由于驱动程序与硬件密切相关,故通常应为每一类设备配置一种驱动程序。
例如,打印机和显示器需要不同的驱动程序。
不同设备的内部硬件特性也不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。
设备驱动程序的功能
实现I/O进程与设备控制器之间的通信,设备驱动程序应具有以下功能
接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列。 例如,将磁盘块号转换为磁盘的盘面、磁道号及扇区号。
检查用户I/O请求的合法性,了解I/O设备的工作状态,传递与I/O设备操作有关的参数,设置设备的工作方式。
发出I/O命令,如果设备空闲,立即启动I/O设备,完成指定I/O操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待。
及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。
设备驱动程序的特点
设备驱动程序属于低级的系统例程,它与一般的应用程序及系统程序之间有下述明显差异。
驱动程序主要是指在请求I/O的进程与设备控制器之间的一个通信和转换程序。 它将进程的I/O请求经过转换后,传送给控制器;又把控制器中所记录的设备状态和I/O操作完成情况及时的反应给请求I/O的进程。
驱动程序与设备控制器和I/O设备的硬件特性紧密相关,因而对不同类型的设备应配置不同的驱动程序。 例如,可以为相同的多个终端设置一个终端驱动程序,但有时即使是同一类型的设备,由于其生产厂家不同,他们也可能并不完全兼容,此时也需为它们配置不同的驱动程序。
驱动程序与I/O设备所采用的I/O控制方式紧密相关。 常用的I/O控制方式是中断驱动和DMA方式,这两种方式的驱动程序明显不同,后者是按数组方式启动设备及进行中断处理。
由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言编写。目前有很多驱动程序的基本部分,已经固化在ROM中。
驱动程序应允许可重入。一个正在运行的驱动程序常会在一次调用完成前被再次调用。
例如,网络驱动程序正在处理一个到来的数据包时,另一个数据包可能已经到达。
设备驱动程序的处理过程
不同类型的设备应有不同的设备驱动程序,但大体上它们都可以分成两部分:
能够驱动I/O设备工作的驱动程序
设备中断处理程序(处理I/O完成后的工作)。
设备驱动程序的主要任务是启动指定设备。但在启动之前,还必须完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,才向设备控制器发送一条启动命令。以下是设备驱动程序的处理过程:
- 将抽象要求转换为具体要求
由于用户及上层软件对设备控制器的具体情况毫无了解,因而只能向它发出抽象的要求(命令),但这些命令无法传送给设备控制器。因此就需要将这些抽象要求转换为具体要求。这一转换工作只能由驱动程序来完成,因为在OS中只有驱动程序才同时了解抽象要求和设备控制器中的寄存器情况;也只有它才知道命令、参数和数据应分别送往哪个寄存器。
如:将逻辑盘块号转换为具体的盘面、磁道和扇区
- 检查I/O请求的合法性
如:打印机请求读, 以读方式打开磁盘后请求写
- 读出和检查设备的状态
如:读出并检查状态是否为就绪, 确定启动控制器或等待
- 传送必要的参数
对于许多设备,特别是块设备,除必须向其控制器发送启动命令外,还需传送必要的参数。例如在启动磁盘进行读/写之前,应先将本次要传送的字节数和数据应到达的主存始址,送入控制器的相应寄存器中。
- 工作方式的设置
如:异步通信, 先设置波特率、校验方式、停止位等
- 启动I/O设备
驱动程序发出I/O命令后,基本的I/O操作是在设备控制器的控制下进行的。通常,I/O操作所要完成的工作较多,需要一定的时间,如读/写一个盘块中的数据,此时驱动(程序)进程把自己阻塞起来,直到中断到来时才将它唤醒。
当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根
据中断信号类型找到相应的中断处理程序并执行。中断处理程序的处理流程如下:
I/O控制方式
设备管理的主要任务之一是控制设备和内存或处理机之间的数据传送。对I/O设备的控制,随着软硬件的发展前后出现过如下的控制方式:使用轮询的可编程I/O方式,使用中断的可编程I/O方式,直接存储器访问(DMA)方式,I/O通道控制方式.
前两种是以字节为单位进行数据传递,后两种是以数据块为单位进行数据传递。
下面对这些方式进行介绍。
程序直接控制方式
该图是展示了程序I/O方式的流程。
以完成一次读操作为例程序直接控制的流程:
CPU通过控制线向I/O控制器发出一个读指令,I/O控制器会根据CPU的要求启动相应的设备,并将这个设备相应的状态设置为1,表示设备忙碌(未就绪)。
接下来设备就准备CPU想要读入的数据,但是由于设备和CPU处理速度的差异,所以在设备还没有完成I/O之前,CPU会一直不断的轮询检查设备的状态,即状态寄存器的值。其实就是在不在的执行程序的循环,若状态为一直是1,说明设备还没有准备好要输入的数据,于是CPU会不断轮询。
如果设备已经准备好了输入的数据,设备会向I/O控制器传送要输入的数据,并且报告自身的状态是已就绪状态。
之后I/O控制器将要输入的数据放到数据寄存器中,并且将状态寄存器的值改为0(已就绪)。
在状态寄存器改为0时,CPU轮询检查到了数据已经准备好了,设备已就绪,即可将数据寄存器中的内容读入CPU自己的寄存器中,再把寄存器的内容放入内存(数据从设备到内存需要经过CPU)。这样就完成了一次读操作。
由于CPU速度远远快于I/O设备,因此CPU需要不断地测试I/O设备,这种控制方式又称为轮询或忙等。
可以看出,缺点是CPU利用率相当低,由于CPU速度远远快于I/O设备,致使绝大部分时间都在测试I/O设备是否已经完成数据传输,从而造成CPU的极大浪费。
另外,每个字的读/写都需要CPU的帮忙。
中断控制方式
该图是展示中断驱动I/O方式的流程。
引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命
令后,可将等待I/0的进程阻塞,先切换到别的进程执行。
以数据输入为例,当用户进程需要输入数据时,由处理器向设备控制器发出一条I/O指令启动设备进行输入。在输入数据的同时,CPU可以做其他工作。当输入完成时,设备管理器向CPU发出一个中断信号,CPU接收到中断信号以后,转去执行设备中断处理程序。设备终中断处理程序将输入数据寄存器中的数据传送到内存的指定单元中,供要求输入的进程使用,然后再启动设备去读下一个数据。
优点:有了中断硬件的支持后,CPU与I/O设备之间可以并行工作,CPU只需要收到中断后处理即可,大大提高了CPU利用率。
缺点:如果每台设备每输入/输出一个数据,都要求中断CPU,这样在一次数据传送过程中的中断次数太多,从而耗费大量CPU时间。设备与CPU之间的数据交换仍以字(节)为单位。
直接存储器访问(DMA)方式
DMA方式的进入:为了适应一次传送大量数据的应用要求,以及尽量减少CPU对高速外设的干预。
与“中断驱动方式”相比,DMA(Direct Memory Access,直接存储器存取。主要用于块设备的I/O控制)有这样几个改进:
- 数据传送的单位是块,不再是一个字一个字的传送。
- 数据的流向是从设备直接放入内存,或者直接从内存到设备,不再需要CPU干预。
- 仅在一个块或多个块的开始和结束时,才需要CPU干预。
DMA控制器的组成
DMA控制器组成:主机(CPU)—控制块的接口、I/O控制逻辑、块设备—控制器接口。
命令/状态寄存器CR:
用于存放CPU发来的I/O命令,或设备的状态信息。
内存地址寄存器MAR:
在设备向内存输入数据时,MAR表示输入的数据应该存放到内存的什么位置,在内存向设备输出数据时,MAR表示要输出的数据放在内存的什么位置。
数据寄存器DR:
暂存从设备到内存,或者从内存到设备的数据。
数据计数器DC:
表示剩余要读/写的字节数。
DMA工作过程
该图就是DMA工作过程。
以数据输入为例,当用户进程需要输入数据时,CPU将准备存放数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器中,并启动设备开始进行输入。
在输入数据的同时,CPU可以去做其他事情,输入设备不断地挪用CPU工作周期,将数据寄存器中的数据源源不断地写入内存,直到要求传送的数据全部传输完毕。
DMA控制器在传输完毕时向CPU发送一个中断信号,CPU收到中断信号后转中断处理程序,中断结束后返回被中断程序。
DMA控制方式的特点为:数据传输的基本单位是数据块,而且数据是单向传输,从设备到内存或者相反。仅在传送一个数据块的开始和结束时,才需要CPU干预,整块数据的传送是在控制器的控制下完成。
优点:设备和CPU可以并行工作,同时设备与内存的数据交换速度更快,并且不需要CPU干预。
缺点:数据传送的方向、存放输入数据的内存起始地址及传送数据的长度等都由CPU控制,并且每台设备都需要一个DMA控制器,当设备增加时,多个DMA控制器的使用也不经济。
I/O通道控制方式
为了进一步减少CPU对I/O操作的干预,引入了通道。
通道控制方式与DMA类似,也是一种以内存为中心,实现设备与内存直接数据交换的控制方式。与DMA相比,通道需要的CPU干预更少,即把对一个数据块的读写为单位的干预减少为对一组数据块读写为单位的干预,而且可以做到一个通道控制多台设备。
通道本质上是一个简单的处理器,它独立于CPU,有运算和逻辑,有自己的指令系统,也在程序控制下工作,专门负责输入、输出控制,具有执行I/O指令的能力,并通过执行通道I/O程序来控制I/O操作。通道的指令系统比较简单,一般只有数据传送指令、设备控制指令等。
在通道控制方式中,CPU只需要发出启动指令,指出要求通道执行的操作和使用的I/O设备,该指令就可以启动通道并使该通道从内存中调出相应的通道程序执行。
通道控制工作方式
以数据输入为例,当用户进程需要输入数据时,CPU发出启动指令指明要执行的I/O操作、所使用的设备和通道。
当对应通道接收到CPU发来的启动指令后,把存放在内存中的通道程序读出,并执行通道程序,控制设备将数据传送到内存中指定的区域。在设备进行输入的同时,CPU可以去做其他事情。
当数据传送结束后时,设备控制器向CPU发送一个中断请求,CPU收到中断信号后转中断处理程序,中断结束后返回被中断程序。
优点:解决了I/O操作的独立性和各部件工作的并行性。不仅能实现CPU与通道的并行操作,而且通道与通道之间也能实现并行操作,各个通道上的外设也能实现并行操作,从而提高了整个系统效率。
缺点:需要更多硬件(通道处理器),成本较高,常用于大型数据交互的场合。