【概述】
设备驱动程序是 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 操作
- 不设置专门的设备处理进程,只为各类设备设置相应的设备驱动程序,供用户或系统进程调用
【设备驱动程序处理过程】
设备驱动程序的主要任务是启动指定设备,完成上层指定的 I/O 工作,但在启动前,应先完成必要的准备工作。在完成所有的准备工作后,才向设备控制器发送一条启动命令
设备驱动程序的处理过程如下:
- 将抽象要求转换为具体要求
- 对服务请求进行校验
- 检查设备状态
- 传送必要参数
- 启动 I/O 设备
【对 I/O 设备的控制方式】
轮询的可编程 I/O 方式
轮询的可编程 I/O 方式,又称忙-等待方式或程序 I/O 方式,其处理过程如下:
- 处理机向控制器发送一条 I/O 指令,启动输入设备输入数据,同时将状态寄存器置
busy=1
- 不断循环测试 busy 标志
busy=1
时,表示输入机尚未输完一个字,CPU 继续对该标志测试busy=0
时,表示数据已输入控制器数据寄存器中
- 将 CPU 存取控制器中的数据送入内存单元,完成一个字的 I/O
在程序 I/O 方式中,CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,造成了对 CPU 的极大浪费,这是因为在 CPU 中无中断机构,使 I/O 设备无法向 CPU 报告其已完成了一个字符的输入
使用中断的可编程 I/O 方式
该方式利用设备控制器来完成对 I/O 设备的控制,其过程如下:
- CPU 向相应的设备控制器发送一条 I/O 命令
- 立即返回继续执行原来的任务
- 设备控制器按照命令控制指定 I/O 设备,此时 CPU 与 I/O 设备并行运行
在 I/O 设备输入每个数据的过程中,可使 CPU 与 I/O 设备并行工作,仅当输完一个数据时,才需要 CPU 花费极短的时间去做中断处理
这样使得 CPU 和 I/O 都处于忙碌状态,从而提高了整个系统的资源利用率与吞吐量
直接存储器访问方式
该方式借助 DMA 控制器完成对 I/O 设备的控制,因此又称为 DMA 方式
该方式的数据传输基本单位是数据块,所传送的数据从设备直接送入内存,或直接从内存进设备,整块数据的传送是在 DMA 控制器的控制下完成的,不需要 CPU 操作,即 CPU 干预进一步减少,仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预
DMA 控制器由三部分组成:主机与 DMA 控制器的接口、DMA 控制器与块设备的接口、I/O 控制逻辑
为实现主机与控制器之间块数据的直接交换,必须设置如下四类寄存器:
- 数据寄存器
DR
:暂存设备到内存或从内存到设备的数据 - 内存地址寄存器
MAR
:存放把数据从设备传送到内存的起始的目标地址或内存原地址 - 数据计数器
DC
:存放本次 CPU 要读或写的字数 - 命令/状态寄存器
CR
:用于接收从 CPU 发来的 I/O 命令或有关控制和状态信息
DMA 方式的工作过程如下:
- CPU 向磁盘控制器发送一条读命令,同时发送数据读入到内存的起始地址
- 命令被送到命令寄存器
CR
中,地址被送入内存地址寄存器MAR
中,要读数据的字数则送入数据计数器DC
中 - 将磁盘中的数据原地址直接送入 DMA 控制器的 I/O 控制逻辑上,按设备状态启动磁头到相应位置
- 启动 DMA 控制器控制逻辑开始进行数据传送:
- DMA 控制器读入一个数据到数据寄存器
DR
中,然后传到内存MAR
地址中 - 接着
MAR+1
,DC-1
- 判断
DC
状态- 若
DC=0
,控制器发送中断请求,传送完毕 - 若
DC=1
,继续传送
- 若
- DMA 控制器读入一个数据到数据寄存器
I/O 通道控制方式
DMA适用于读一个连续的数据块,若一次读多个数据块到内存的不同区域,那么须由 CPU 分别发送多条 I/O 指令、进行多次 DMA 中断处理
为进一步减少 CPU 的干预,引入了通道方式,CPU 只需发一条 I/O 指令,给出通道程序的首地址及要访问设备即可,这使得 CPU、通道和 I/O 设备三者并行操作,提高整个系统的资源利用率
通道,是一种通过执行通道程序管理 I/O 操作的控制器,它使 CPU、内存与 I/O 操作之间达到更高的并行程度,由于它的任务是管理实现 I/O 操作,提供了一种传送通道,所以将这种部件称作通道
通道,通过执行通道程序,与设备控制器共同实现对 I/O 设备的控制,简单来说,CPU 指令经过设备驱动程序解读后,送往通道程序,通过通道程序的执行来完成通道操作,通道程序由一系列通道指令构成
通道指令一般包含下述信息:
- 操作码:规定指令所执行的操作
- 内存地址:标明字符送入内存、从内存取出时的内存首址
- 计数:表示本指令所要操作的字节数
- 通道程序结束位
P
:表示程序是否结束,P=1
表示本条指令是通道程序的最后一条指令 - 记录结束标志
R
:表示该指令是否与下条指令有关,R=0
表示本通道指令与下一条指令同属一记录;R=1
表示是处理某记录的最后一条指令