其中,设备驱动程序和中断处理程序是直接和硬件打交道的。
- 中断处理程序
- 设备驱动程序:
- 几个要点:
- 设备驱动程序主要任务就是接收上层软件发来的抽象I/O请求(如read/write命令),把它们转换为具体要求后发给设备控制器(即I/O接口),进而使其启动设备去执行任务;反之,它也会将设备控制器发来的信号传送给上层软件
- 由于设备驱动程序与硬件密切相关,故通常会为每类设备配置一种设备驱动程序(如打印机和显示器就需要不同的驱动程序),可以为相同的多个I/O设备设置一个设备驱动程序
- 设备驱动程序与I/O设备所采用的I/O控制方式紧密相关(常用的I/O控制方式是中断驱动I/O方式和DMA方式)
- 由于设备驱动程序与硬件紧密相关,因此其中一部分必须由汇编语言书写。目前有很多设备驱动程序的基本部分都已固化在ROM中
- 设备驱动程序应允许可重入,一个正在运行的设备驱动程序常会在一次调用完成前被再次调用
- 设备刚接入计算机时,设备的初始化由驱动程序控制完成(想象一个新键盘接入计算机,会弹出“正在安装驱动程序”的消息)。初始化内容包括为管理设备而分配的数据结构、设备的请求队列等、将设备驱动程序的地址登记在设备表的相应表项中,经登记后,只要知道设备的主设备号,就可以找到该类设备的各种驱动函数。
- 设备驱动程序的执行过程(可与DMA方式的具体过程进行对比):
- 将抽象要求转换为具体要求:如将抽象要求中的盘块号转换为磁盘的盘面号、磁道号、扇区号。因为OS中只有设备驱动程序是同时了解抽象要求和设备控制器中的寄存器情况的,也只有它才知道命令、数据和参数应分别送往哪个寄存器
- 校验服务请求:设备驱动程序在启动I/O设备之前必须先检查该用户的I/O请求是否合法(如某用户试图请求从一台打印机读入数据就是非法的、某些设备如磁盘在打开时规定的事只读,则写命令就是非法的),非法的话就向I/O系统报告I/O请求出错,I/O系统进而做出相应的决定
- 检查设备的状态:设备驱动程序在启动I/O设备之前,要先将状态寄存器中的内容读入CPU的某个寄存器中,检查其接收就绪的状态位,判断其是否处于接收就绪状态。仅当它处于接收就绪状态时,才能启动该设备的设备控制器,否则只能等待
- 传送必要的参数:确定设备处于接收(发送)就绪状态后,便可向设备控制器的相应寄存器传送数据以及同控制本次数据传送有关的参数
- 设备控制器中的寄存器:最基本的有两个:数据寄存器、控制/状态寄存器。实际中不太相同,如某种设备控制器中设置了两个控制寄存器,一个是命令寄存器(用于存放CPU发来的各种控制命令),一个是方式寄存器(用于存放本次传送数据的速率、发送的字符长度等数据)。对于较为复杂的块设备,除了必须向其设备控制器发出启动命令外,还需传送更多的参数
- 启动I/O设备:完成上述准备工作后,驱动程序便可向设备控制器中的命令寄存器传送相应的控制命令。多道程序系统中,设备驱动程序一旦发出I/O命令、启动一个I/O操作后,就会把控制权返回给I/O系统,把自己阻塞起来,直到中断到来时再被唤醒。具体的I/O操作是在设备控制器的控制下进行的,此时CPU可去干其他事情
- 几个要点:
- 设备无关软件(是I/O系统的最高层软件)
- 逻辑设备名-物理设备名
- 与设备无关软件的共有操作
- 提供设备驱动程序的统一接口
- 缓冲管理:单缓冲区、双缓冲区、环形缓冲区、缓冲池等
- 差错控制:
- 如网络传输软件检测到数据包丢失或延误,可通过重新传送来纠正错误;如磁盘传送发生错误,会先令磁盘重传
- 如磁盘上的少数盘块遭到破坏而失效,就将它们作为坏盘块记录下来,并放入一张坏盘块表中,以后不再使用即可
- 独占设备的分配与回收:对于独占设备,必须由系统来统一分配,每当进程要使用独占设备,必须先提出申请。系统根据该设备是否空闲,来决定该进程是分配到该设备,还是让该进程阻塞并放入该设备的请求队列中等待
- 提供独立于设备的逻辑数据块
- 假脱机技术(SPooling)
- 用户层的I/O软件
相关题目:
3. 将系统调用参数翻译成设备操作命令的工作由()完成
A. 用户层I/O; B. 设备无关的操作系统软件;C. 中断处理;D. 设备驱动程序
选B
4. 用户程序发出磁盘I/O请求后,系统的处理流程是:用户程序->系统调用处理程序->设备驱动程序->中断处理程序。其中,计算数据所在磁盘的柱面号、磁头号、扇区号的程序是()
A. 用户程序;B. 系统调用处理程序;C. 设备驱动程序;D. 中断处理程序
选C
解析:从上到下,设备独立性软件会根据用户要读取的文件名、打开文件表中的FCB等得到文件存放的物理块号(如10110111010101)。但不能把物理块号直接抛给磁盘,因为磁盘不是通过物理块号寻址的。
正确的应该是接下来,设备驱动程序将物理块号分为磁盘设备实际访问时使用的(柱面、磁头、扇区)的形式,如(101101,11010,101)。最终磁盘设备据此找到目标盘块。
不同的磁盘,柱面、磁头、扇区的数量可能不同,因此计算这些“号”的程序应该是了解硬件细节的,应由厂家提供的“设备驱动程序”负责计算。
关于库函数和系统调用的一些混淆:
之前是想歪了,觉得到设备独立性软件那里就已经是处理系统调用,然后就搜了半天库函数到底是在哪、被谁翻译成系统调用的。但回顾了一下系统调用那节课,意识到其实系统调用是操作系统给应用程序提供的接口,库函数只是对系统调用的进一步封装(有的库函数没有使用系统调用),也就是库函数代码中,可能就直接写着write()这个系统调用。没有“将库函数翻译成系统调用”这一说,还好没问,不然出大丑。
所以系统调用就是操作系统处理的,也就是设备独立性软件那里处理的。再往下(设备驱动程序、中断处理程序)就是偏硬件了,只有软件那里(设备独立性软件)将软件层次的系统调用转换成I/O操作命令什么的,它们才能看懂。所以这题就很明了了。