一.概览
二.设备驱动程序的过程
2.1.设备驱动程序概念
设备处理程序通常又称为设备驱动程序,它是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,再把它转换为具体的要求后,发送给设备控制器,启动设备去执行:反之,它也将由设备控制器发来的信号传送给上层软件。由于设备驱动程序与硬件密切相关,故通常应为每一类设备配置一种驱动程序。例如,打印机和显示器需要不同的驱动程序。
2.2.设备驱动程序的功能
(1)接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为具体要求,例如,将磁盘块号转换为磁盘的盘面、磁道号及扇区号。
(2)检查用户I/O请求的合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式。
(3)发出I/O命令。如果设备空闲,便立即启动I/O设备去完成指定的I/O操作;如果设备处于忙碌状态,则将请求者的请求块挂在设备队列上等待。
(4)及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。
2.3.设备驱动程序的特点
(1)驱动程序是实现在与设备无关的软件和设备控制器之间通信和转换的程序。它将抽象的I/O请求转换成具体的I/O操作后传送给控制器;又把控制器中所记录的设备状态和I/O操作完成情况,及时地反映给请求I/O的进程。
(2)驱动程序与设备控制器和I/O设备的硬件特性紧密相关,对不同类型的设备应配置不同的驱动程序。
(3)驱动程序与I/O设备所采用的I/O控制方式紧密相关。常用的I/O控制方式是中断驱动和DMA方式。
(4)由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言编写。
(5)驱动程序应允许可重入。
3,设备处理方式(不同的操作系统中,所采用的设备处理方式并不完全相同)
(1)为每一类设备设置一个进程,专门用于执行这类设备的I/O操作。比如,为所有的交互式终端设置一个交互式终端进程;又如,为同一类型的打印机设置一个打印进程。
(2)在整个系统中设置一个I/O进程,专门用于执行系统中所有各类设备的I/O操作。也可以设置一个输入进程和一个输出进程,分别处理系统中所有各类设备的输入或输出操作。
(3)不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块),供用户进程或系统进程调用。
2.4.对I/O设备的控制方式
1,使用轮询的可编程I/O方式:CPU忙等待方式(查询方式)
2,使用中断的可编程I/O方式:CPU与外设并行操作,适用于慢速设备
无中断机构:由于CPU的高速性和I/O设备的低速性,致使CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中,造成对CPU的极大浪费。
3,DMA(直接存储访问)方式:CPU与块设备并行操作
(1)接存储器访问方式的引入:虽然中断驱动I/O比程序I/O方式更有效,但它仍以字(节)为单位进行I/O的。每当完成一个字(节)的I/O时,控制器便向CPU请求一次中断。换而言之,采用中断驱动I/O方式时的CPU,是以字(节)为单位进行干预的。如果将这种方式用于块设备的I/O时,显然是极其低效的。
>数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次传送至少一个数据块;
>所传送的数据是从设备直接送入内存的,或者相反;
>仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。
可见,DMA方式较之中断驱动方式,又是成百倍地减少了CPU对I/O的干预,进一步提高了CPU与I/O设备的并行操作程度。(2)DMA控制器的组成:DMA控制器由三部分组成:主机与DMA控制器的接口;DMA控制器与块设备的接口;I/O控制逻辑。
为了实现在主机与控制器之间成块数据的直接交换,必须在DMA控制器中设置如下四类寄存器:
>命令/状态寄存器(CR)。用于接收从CPU发来的I/O命令,或有关控制信息,或设备的状态。
>内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输>出时,它存放由内存到设备的内存源地址。
>数据寄存器(DR)。用于暂存从设备到内存,或从内存到设备的数据。
>数据计数器(DC)。存放本次CPU要读或写的字(节)数。
(3)DMA工作过程:当CPU要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令。该命令被送到其中的命令寄存器(CR)中。同时,还须发送本次要将数据读入的内存起始目标地址,该地址被送入内存地址寄存器(MAR)中;本次要读数据的字(节)数则送入数据计数器(DC)中,还须将磁盘中的源地址直接送至DMA控制器的I/O控制逻辑上。然后,启动DMA控制器进行数据传送,以后,CPU便可去处理其它任务。此后,整个数据传送过程便由DMA控制器进行控制。当DMA控制器已从磁盘中读入一个字(节)的数据并送入数据寄存器(DR)后,再挪用一个存储器周期,将该字(节)传送到MAR所指示的内存单元中。接着便对MAR内容加1,将DC内容减1。若减1后DC内容不为0,表示传送未完,便继续传送下一个字(节);否则,由DMA控制器发出中断请求。 如下是DMA方式的工作流程。
4,I/O通道控制方式(考纲中已经被删)
通道:通过执行通道程序,与设备控制器共同实现对I/O设备的控制。可实现CPU、通道和I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
当CPU要完成一组相关的读(或写)操作及有关控制时,只需向I/O通道发送一条I/O指令,以给出其所要执行的通道程序的首址和要访问的I/O设备,通道接到该指令后,通过执行通道程序便可完成CPU指定的I/O任务。
通道指令与一般的机器指令不同,在它的每条指令中都包含以下信息:
(1)操作码 规定了指令所执行的操作。
(2)内存地址 表明字符送入内存(读操作)和从内存取出(写操作)时的内存首址。
(3)计数 该信息表示本条指令所要读(或写)数据的字节数。
(4)通道程序结束位P 表示通道程序是否结束。
(5)记录结束标志R。R=0,表示与下一条指令处理的数据属于一个记录;R=1,表示是处理某记录的最后一条指令。
三.设备独立性的I/O软件
1.以物理设备名使用设备
在早期OS中,应用程序再使用I/O设备时,都使用设备的物理名称,这就使得应用程序与系统中的物理设备直接相关。当应用进程运行时,如果所请求的物理设备(独占设备类型)已分配给其他进程,而此时尽管还有几台其他的相同设备空闲可用,但系统只能根据设备的物理名来分配,无法将另外相同的设备(但具有不同的物理设备名)分配给它,致使该应用进程请求I/O失败被阻塞。当应用程序所需要的设备在系统中已经被更新时,该应用程序将再也无法在该系统上运行。可见,应用程序直接与物理设备相关时非常不灵活的,给用户带来了很大的方便,且对提高I/O设备利用率也很不顺利。
2.引入了逻辑设备名
为了实现与设备的无关性而引入逻辑设备和物理设备两个概念。逻辑设备是抽象设备名,如/dev/printer,该设备名只是,说明用户需要使用打印机来打印输出,但并没有指定具体是哪一台打印机。这样,如果在应用程序中,使用逻辑设备名称请求使用某类设备,系统在对她进行设备分配时,先查找该类设备中的第一台,如果它已被分配,系统可立即去查找该类设备中的第二台,若又被分配,系统接着去找第三台,若它尚未被分配,便可将这台设备分配给进程。
与设备的无关软件还可实现I/O重定向。所谓I/O重定向,是指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。例如,我们在调试一个应用程序时,可将程序的所有输出送往屏幕显示;而在程序调试完后,如需正式将程序的运行结果打印出来,此时便须将I/O重定向的数据结构——逻辑设备表中的显示终端改为打印机,而不必修改应用程序。I/O重定向功能具有很大的实用价值,现已被广泛地引入到各类OS中。
3.逻辑设备名到物理设备名称的转换
在应用程序中,用逻辑设备名称使用设备虽然方便了用户,但系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。为了实现设备的独立性,系统必须设置一张逻辑设备表(LUT),用于将应用程序中所使用的逻辑设备名映射为物理设备名。
3.1.设备无关的软件
与设备无关的软件是I/O系统的最高层软件,在它下面的是设备驱动程序,其间的界限,因操作系统和设备的不同而有所差异。比如,对于一些本应由设备独立性软件实现的功能,却放在设备驱动程序中实现。这样的差异主要时出于对操作系统、设备独立性和设备驱动程序运行效率等多方面的权衡和考虑。总的来说,在与设备无关的软件中,包括了执行所有设备共有操作的软件。
1,设备驱动程序的统一接口:为了使所有的设备驱动程序由着统一的接口,一方面,要求每个设备驱动程序与OS之间都有着相同的接口,或者相近的接口,这样会使添加一个新的设备驱动程序变得很容易。另一方面,要将抽象的设备名映射到适当的驱动程序上,或者说,将抽象的设备名转换为具体的物理设备名,并进一步可以找到相应物理设备的驱动程序入口。此外,还要对设备进行保护,禁止用户直接访问设备,以防止无权访问的用户使用。
2,缓冲管理:即对字符设备和块设备的缓冲区进行有效的管理,以提高I/O的效率;
3,差错控制。由于在I/O操作中的绝大多数错误都与设备无关,故主要由设备驱动程序处理,而设备独立性软件只处理那些设备驱动程序无法处理的错误;
(1)暂时性错误:因发生暂时性事件引起的,如电源的波动。(2)持久性错误:由持久性故障引起的,如电源掉电。
4,对独立设备的分配与回收:在系统中有两类设备:独占设备和共享设备。对于独占设备,为了避免诸进程对独占设备的争夺,必须由系统统一分配,不允许进程自由使用。每当进程需要使用某(独占)设备时,必须先提出申请。OS接到对设备的请求后,先对进程所请求的独占设备进行检查,看该设备是否空闲。若空闲,才把该设备分配给请求进程。否则,进程将被阻塞,放入该设备的请求队列中等待。等到其他进程释放该设备时,再将队列中的第一个进程唤醒,该进程获得到设备后继续运行。
5,独立于设备的逻辑数据块:不同类型的设备,其数据交换单位是不同的,读取和传输速率也各不相同,如字符型设备以单个字符(字)为单位,块设备是以一个数据块为单位。即使同一类型的设备,其数据交换单位也是由差异的,如不同磁盘由于扇区大小的不同,可能造成数据块大小的不一致。设备独立性软件应能够隐藏这些差异而被逻辑设备使用,并向高层软件提供大小统一的逻辑数据库。
3.2.设备分配
系统借助SDT,COCT,CHCT,DCT四种表格得知当前各部件的使用情况,并对其进行管理。
1,设备分配的数据结构
DCT(Device Control Table):设备控制表,每台设备一张,记录设备使用情况。
设备队列队首指针。凡因请求本设备而等待的进程,其PCB都按照一定的策略排成一个队列,称该队列为设备请求队列或简称设备队列。其队首指针指向队首PCB。在有的系统中还设置了队尾指针。
设备状态。当设备自身正处于使用状态时,应将设备的忙/闲标志置“1”。若与该设备相连接的控制器或通道正忙,也不能启动该设备,此时则应将设备的等待标志置“1”。
与设备连接的控制器表指针。该指针指向该设备所连接的控制器的控制表。在设备到主机之间具有多条通路的情况下,一个设备将与多个控制器相连接。此时,在DCT中还应设置多个控制器表指针。
重复执行次数。由于外部设备在传送数据时,较易发生数据传送错误,因而在许多系统中,如果发生传送错误,并不立即认为传送失败,而是令它重新传送,并由系统规定设备在工作中发生错误时应重复执行的次数。在重复执行时,若能恢复正常传送,则仍认为传送成功。仅当屡次失败,致使重复执行次数达到最大值而传送仍不成功时,才认为传送失败。
COCT(Controller Control Table):控制器控制表,每个控制器一张,记录控制器使用情况。
CHCT(CHannel Control Table):通道控制表,每个通道一张,记录通道使用情况。
SDT(System Devices Table):系统设备表,整个系统一张,记录系统拥有的全部设备。
2,设备分配时应考虑的因素
(1)设备的固有属性:独占设备:考虑分配安全性,并采用独占分配策略。共享设备:可同时分给多个进程,对进程的访问次序进行合理调度。虚拟设备:可同时分给多个进程,对进程访问该设备的先后次序进行合理调度。
(2)设备的分配算法:先请求先服务:请求进程依次排入设备请求队列。优先级高者优先:请求进程按优先级排入设备请求队列。
(3)设备分配中的安全性:安全分配方式:每当进程发出I/O请求后,便进入阻塞状态,直到其I/O操作完成时才被唤醒。不安全分配方式 进程在发出I/O请求后仍继续运行,需要时又发出第二个I/O请求,第三个I/O请求等。此时增加功能,对本次的设备分配是否会发生死锁进行安全性计算。
3.3.逻辑设备名到物理设备名映射的实现
为了实现与设备的无关性,当应用程序请求使用I/O设备时,应当用逻辑设备名。但系统识别只识别物理设备名,因此在系统中需要配置一张逻辑表,用于将逻辑设备名映射为物理设备名。
1,逻辑设备表LUT(Logical Unit Table)
在逻辑设备表的每个表目中包含了三项:逻辑设备名、物理设备名和设备驱动程序的入口地址。
2,逻辑设备表的设置问题
(1)第一种方式,在整个系统中只设置一个LUT。逻辑设备不允许有重名;主要应用于单用户系统;
(2)第二种方式,为每个用户设置一张LUT,并将该表放入用户进程的PCB中。其表项指向系统设备表的表目。设置系统设备表;不同进程的逻辑设备可重名;主要应用于多用户系统;