首页 理论教育 软件实现的中断处理流程及错误报告

软件实现的中断处理流程及错误报告

时间:2023-11-06 理论教育 版权反馈
【摘要】:图6-12 中断处理流程I/O操作完成后,驱动程序必检查本次I/O操作中是否发生了错误,并向上层软件报告,最终向调用者报告本次I/O的执行情况。

软件实现的中断处理流程及错误报告

计算机系统中包含了众多的I/O设备,其种类繁多,硬件构造复杂,物理特性各异,与CPU速度不匹配,造成对设备的操作和管理非常复杂和琐碎,因此从系统的观点出发,采用多种技术和措施,解决外部设备与CPU速度不匹配所引起的问题,提高主机和外设的并行工作能力,提高资源的利用率,提高系统效率,成为操作系统的一个重要目标。另一方面,屏蔽设备硬件内部的低级处理过程,降低设备的操作和管理的复杂性,为用户提供一个简便易用、清晰而统一的逻辑设备接口,保证用户安全、方便地使用各类设备,也是I/O软件设计的一个重要原则,因此I/O软件设计的总体设计目标是高效率和通用性。

为了达到上述目标,通常将I/O软件组织成一种层次结构,低层软件用于实现与硬件相关的操作,并可屏蔽硬件的具体细节。高层软件则主要向用户提供一个简洁、友好和规范的接口,每一层具有一个要执行的定义明确的功能和一个与邻近层次定义明确的接口,各层的功能与接口随系统的不同而异。

6.4.1 I/O软件的设计目标和原则

I/O软件的具体设计目标如下:

(1)设备独立性。即让应用程序独立于具体使用的设备,除了直接与设备打交道的底层软件之外,其他部分的软件不依赖于硬件。对于程序员而言,写出的软件在访问不同的外围设备时应该尽可能地与设备的具体类型无关,如访问文件时不必考虑它是存储在硬盘、软盘还是CD-ROM上。对于管理软件,也无须因为I/O设备变化而重新编写涉及设备管理的程序。对于操作系统而言,应允许在不需要将整个操作系统进行重新编译的情况下,增添新的设备驱动程序,以方便新的I/O设备的安装,如在Windows中,系统可以为新I/O设备自动安装和寻找驱动程序,从而实现设备的即插即用。

(2)统一命名。它与设备独立性相关。即一个文件或一个设备的名字采取预先设计的、统一的逻辑名称进行命名,是一个简单的字符串或一个整数,而不依赖于设备,所有软件都以逻辑名称访问设备,而与具体设备无关。所有的文件和设备都使用相同的路径名进行定位

(3)出错处理。总的来说,错误应该在尽可能靠近硬件的地方处理,在低层软件能够解决的错误就不让高层软件感知,只有低层软件解决不了的错误才通知高层软件解决。

(4)设备的分配和释放。对于系统中的共享设备,如磁盘等,可以同时为多个用户服务,对于这样的设备,应该允许多个进程同时对其提出I/O请求,但对于键盘和打印机等独占设备,在某一段时间只能供一个用户使用,对其分配和释放的不当将引起混乱,甚至死锁,对于独占设备和共享设备带来的许多问题,I/O软件必须能够同时加以解决。

(5)缓冲技术。由于CPU与设备之间的速度差异,无论是块设备还是字符设备,都需要使用缓冲技术。对于不同类型的设备,其缓冲区的大小是不同的,块设备的缓冲区以数据块为单位,而字符设备的缓冲区则以字节为单位,即便是同类型的设备,其缓冲区的大小也存在差异,如不同的磁盘,其扇区的大小有可能不同,因此I/O软件应能屏蔽这种差异,向高层软件提供统一大小的数据块或字符单元,使得高层软件能够只与逻辑块大小一致的抽象设备进行交互。

(6)I/O控制方式。针对具有不同传输速率的设备,综合系统效率和系统代价等因素,合理选择I/O控制方式,如像打印机等低速设备应采用中断驱动方式,而对磁盘等高速设备则采用DMA控制方式等,以提高系统的利用率,为方便用户,I/O软件也应屏蔽这种差异,向高层软件提供统一的操作接口。

6.4.2 中断处理程序

由于中断处理与硬件紧密相关,对用户及用户程序而言,应该尽量加以屏蔽,故应该放在操作系统的底层进行中断处理,系统的其余部分尽可能少地与之发生联系。当一个进程请求I/O操作时,该进程将被挂起,直到I/O设备完成I/O操作后,设备控制器向CPU发送一中断请求,CPU响应后便转向中断处理程序,中断处理程序执行相应的处理,处理完后解除相应进程的阻塞状态。中断处理程序的处理过程如图6-12所示。

处理步骤如下:

(1)唤醒被阻塞的驱动进程。当中断处理程序开始执行时,首先去唤醒被阻塞的驱动进程。不同系统,或采用信号量PV操作,或通过执行signal操作,或发送消息唤醒进程。

(2)保护被中断进程的CPU环境。通常由硬件自动将处理机状态字PSW和程序计数器PC中的内容保存在中断保留区堆栈中,然后把被中断进程的CPU现场信息(所有的CPU寄存器内容)都压栈保留。

(3)分析中断原因,转入相应的中断处理程序。由处理机对中断源进行测试确定引起本次中断的设备,并发送一应答信号给发出中断请求的进程,使之撤销该中断请求信号,然后将相应中断处理程序的入目地址送入程序计数器PC中,处理机转向中断处理程序。

(4)中断处理。执行中断处理程序中规定的功能。

(5)恢复现场。当中断处理完成以后,从中断栈中取出中断前保留的信息并恢复到相应的部件中,使被中断的程序得以继续执行。

图6-12 中断处理流程

I/O操作完成后,驱动程序必检查本次I/O操作中是否发生了错误,并向上层软件报告,最终向调用者报告本次I/O的执行情况。

6.4.3 设备驱动程序

设备驱动程序是I/O进程与设备控制器之间的通信程序,由于它常以进程的形式存在,也可以称之为设备驱动进程。由于驱动程序与硬件密切相关,故应为每类设备配置一个驱动程序,或为非常类似的不同类别设备配置一个驱动程序。例如,打印机和显示器需要不同的驱动程序,但SCSI磁盘驱动程序通常可以处理不同大小和不同速度的多个SCSI磁盘,甚至还可以处理SCSI CD-ROM。

1.设备驱动程序的功能

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

(1)将接收到的来自它上一层的与设备无关的逻辑I/O抽象请求转换为物理I/O操作的启动和执行。例如,将磁盘块号转换为磁盘的盘面、磁道号及扇区号,设备名转化为端口地址、逻辑记录转化为物理记录、逻辑操作转化为物理操作。

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

(3)发出I/O命令,启动分配到的I/O设备去完成指定的I/O操作。

(4)及时响应控制器或通道发来的中断请求,并调用相应的中断处理程序进行处理。

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

2.设备驱动程序的处理过程

设备驱动程序的主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,在把它转换为具体要求后,发送给设备控制器,启动设备去执行。此外,它也将由设备控制器发来的信号传送给上层软件。但在启动之前,还必须完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,最后才向设备控制器发送启动命令,有些控制器一次只能接收一条命令,有些控制器可以接收一个命令链表。设备驱动程序的处理过程如下。

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

由于用户及上层软件对设备控制器的具体情况毫无了解,因而只能向它发出抽象的要求(命令),但这些命令无法传送给设备控制器。因此就需要将这些抽象要求转换为具体要求。通常在设备控制器中都含有若干个寄存器,分别用于暂存命令、数据和参数等。例如,将抽象要求中的盘块号转换为磁盘的盘面、磁道号及扇区,这一转换工作只能由驱动程序来完成,因为在OS中只有驱动程序才同时了解抽象要求和设备控制器中的寄存器情况,也只有它才知道命令、数据和参数应分别送往哪个寄存器,知道使磁盘正确操作所需要的全部参数,包括扇区、磁道、柱面、磁头、磁头臂的移动、交叉系数、步进电机、磁头定位时间等。

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

对于任何输入设备,不是只能完成一组特定的功能,若该设备不支持这次的I/O请求,则认为这次I/O请求非法。例如,用户试图请求从打印机输入数据,显然系统应以拒绝。此外还有些设备如磁盘和终端,它们都是既可读又可写的,但若在打开这些设备时规定的是读,则用户的写请求必然被拒绝。

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

在启动某个设备进行I/O操作时,其前提条件应是该设备正处于空闲状态。因此在启动设备之前,要从设备控制器的状态寄存器中读出设备的状态。例如,为了向某设备写入数据,此前应先检查该设备是否处于接收就绪状态,仅当它处于接收就绪状态时,才能启动其设备控制器,否则只能等待。

4)传送必要的参数

对于许多设备,特别是块设备,除必须向其控制器发出启动命令外,还需传送必要的参数。例如,在启动磁盘进行读/写之前,应先将本次要传送的字节数和数据应到达的主存始址送入控制器的相应寄存器中。

5)工作方式的设置

有些设备可具有多种工作方式,典型情况是利用RS-232接口进行异步通信。在启动该接口之前,应先按通信规程设定参数,如波特率奇偶校验方式、停止位数目及数据字节长度等。

6)启动I/O设备

在完成上述各项准备工作之后,驱动程序可以向控制器中的命令寄存器传送相应的控制命令。对于字符设备,若发出的是写命令,驱动程序将把一个数据传送给控制器;若发出的是读命令,则驱动程序等待接收数据,并通过从控制器中的状态寄存器读入状态字符的方法,来确定数据是否到达。

驱动程序发出I/O命令后,基本的I/O操作是在设备控制器的控制下进行的,此时系统对驱动程序有两种处理方式。多数情况下,驱动程序必须等待设备控制器完成操作,如读/写一个盘块中的数据,所以此时驱动程序把自己阻塞起来,直到中断信号到来将它解除阻塞为止。有的情况可以通过设备控制器完成操作,而驱动程序不需阻塞,如终端的滚屏操作,只要把一些字节写入控制器的寄存器中即可,驱动程序不需阻塞。上述任一种处理方式在操作完成后,都必须检查操作过程是否有错,若有错则向调用者返回报错信息,若一切正常,则将数据传输到与设备无关的软件层。之后若还有其他未完成的请求在排队,则选择一个启动执行,若队列中没有未完成的请求,则驱动程序等待下一个请求。(www.xing528.com)

6.4.4 设备独立性软件

1.设备独立性(device independence)

设备独立性,也称为设备无关性,是指应用程序独立于具体使用的物理设备,即应用程序不直接使用物理设备名,而以逻辑设备名称来请求使用某类设备。为了实现设备独立性,引入了逻辑设备和物理设备两个概念,这两个概念类似于存储器管理中介绍的逻辑地址和物理地址。在应用程序中,可使用逻辑设备名称来请求使用某类设备,而系统在实际执行时,必须使用物理设备名称。类似于在应用程序中所使用的是逻辑地址,而系统在分配和使用内存时必须使用物理地址。因此系统须具有将逻辑设备名称转换为某物理设备名称的功能。在实现了设备独立性的功能后,可带来以下两方面的好处。

1)设备分配时的灵活性

现代计算机系统常常配置了许多类型的I/O设备,同类设备又有多台,当应用程序(进程)以物理设备名称来请求使用指定的某台设备时,如果该设备已经分配给其他进程或正在检修,而此时尽管还有几台其他的相同设备正在空闲,该进程仍被阻塞。但若进程能以逻辑设备名称来请求某类设备时,系统可将该类设备中的任一台分配给进程,即便其中某台设备有故障,也不影响设备的分配,仅当所有此类设备已全部分配完毕时,进程才会阻塞。

2)易于实现I/O重定向

I/O重定向是指用于I/O操作的设备可以更换,即重定向,而不必改变应用程序。例如,我们在调试一个应用程序时,可将程序的所有输出送往屏幕显示,而在程序调试完后,如需正式将程序的运行结果打印出来,此时便须将I/O 重定向的数据结构-逻辑设备表中的显示终端改为打印机,而不必修改应用程序。

设备独立性提高了OS的可适应性和可扩展性,在现代OS中都毫无例外地实现了设备独立性。

2.设备独立性软件的功能

设备驱动程序是一个与硬件(或设备)紧密相关的软件,为了实现设备独立性,必须再在驱动程序之上设置一层软件,称为设备独立性软件。设备独立性软件和设备驱动程序之间的界限主要取决于具体系统,因为对于一些本应由设备独立性软件实现的功能,可能由于效率和其他因素,实际上设计在设备驱动程序中来实现。设备独立性软件的基本任务是实现一般设备都需要的I/O功能,并向用户层软件提供一个统一的接口。设备独立性软件的主要功能相应地分为以下两个方面:

(1)执行所有设备的公有操作。

①设备命名,并将逻辑设备名映射为物理设备名,进一步可以找到相应物理设备的驱动程序。

②独占设备的分配与回收。一些设备,如磁盘驱动器,在同一时刻只能由一个进程使用,这要求操作系统检查对该设备的使用请求,并根据设备的忙闲状况来决定是接受或拒绝此请求。一种简单的处理方法是通过直接用OPEN打开相应的设备文件来进行申请。若设备不可用,则OPEN失败。关闭独占设备的同时将释放该设备。

③设备保护。检查用户是否有权访问申请的设备。多数个人计算机系统根本就不提供任何保护;多数大型主机系统中,用户进程对I/O设备的访问是禁止的;在UNIX中使用一种更为灵活的方法,对应于I/O设备的设备文件的保护采用通常的rwx权限机制,系统管理员可以为每一台设备设置合理的访问权限。

④缓冲管理。即对字符设备和块设备的缓冲区进行的管理。

⑤出错控制。设备独立性软件只处理那些设备驱动程序无法处理的错误。由于在I/O操作中的绝大多数错误都与设备有关,这些错误主要由设备驱动程序处理,而与设备无关的错误处理则由设备独立性软件来处理,例如由于侧畔块受损而不能读取数据时,驱动程序将尝试重读一定次数,若仍有错,则放弃读并通知设备独立性软件处理。

⑥提供独立于设备的逻辑块分配。不同类型的设备信息交换单位是不同的,读取和传输速率也各不相同,如字符型设备以单个字符为单位,块设备是以一个数据块为单位,即使同一类型的设备,其信息交换单位大小也是有差异的,如不同磁盘可以采用不同大小的扇区,设备独立性软件负责隐藏这些差异,并向较高层软件提供大小统一的逻辑数据块。

(2)向用户层(或文件层)软件提供统一接口,无论何种设备,它们向用户所提供的接口应该是相同的。例如,对各种设备的读操作,在应用程序中都使用read;而对各种设备的写操作,也都使用write。

3.设备的命名方式和映射

1)逻辑设备表

为了实现设备的独立性,必须实现逻辑设备名到物理设备名的映射,系统须设置一张逻辑设备表(logical unit table,LUT),用于将应用程序中所使用的逻辑设备名映射为物理设备名,该表的每个表目中包含三项:逻辑设备名、物理设备名和设备驱动程序的入口地址,见表6-2。当进程用逻辑设备名请求分配I/O设备时,系统为它分配相应的物理设备,并在LUT上建立一个表目,填上应用程序中使用的逻辑设备名和系统分配的物理设备名,以及该设备驱动程序的入口地址。当以后进程再利用该逻辑设备名请求I/O操作时,系统通过查找LUT便可找到物理设备和驱动程序。

2)LUT设置

LUT的设置可采取两种方式:第一种方式是在整个系统中只设置一张LUT,由于系统中所有进程的设备情况都记录在同一张LUT中,因而不允许在LUT中具有相同的逻辑设备名,这就要求所有用户都不使用相同的逻辑设备名,在多用户环境下这通常是难以做到的,因而这种方式主要用于单用户系统中。第二种方式是为每个用户设置一张LUT,每当用户登录时,便为该用户建立一个进程,同时也为之建立一张LUT,并将该表放入进程的PCB中。由于通常在多用户系统中,都配置了系统设备表,故此时的逻辑设备表可以采用表6-3中的格式。

表6-2 逻辑设备表(一)

表6-3 逻辑设备表(二)

6.4.5 用户层I/O软件

一般而言,大部分的I/O软件都在操作系统内部,但仍有一小部分在用户层,用户层的I/O软件有两类,一类是与用户程序链接在一起的库函数(库例程),另一类是完全运行于内核之外的一些程序,如Spooling(simultaneous peripheral operation on line)系统,即假脱机系统。

1.库函数

用户层软件必须通过一组系统调用来取得操作系统服务,在现代的高级语言以及C语言中,通常提供了与各系统调用对应的库函数,用户程序通过调用对应的库函数使用系统调用。这些库函数与调用程序连接在一起,包含在运行时装入在内存的二进制程序中。如下面的C语言语句:

count=write(fd,buf fer,nbytes);

其中,所调用的库函数write将与用户程序连接在一起,并包含在运行时的二进制程序代码中,这一类库函数是I/O系统的一部分,它的主要工作是提供参数给相应的系统调用并调用之。还有一些库函数,实现了真正的I/O操作,如一些格式化I/O就是用函数实现的。例如C语言中的printf函数,它的输入为一个格式串和一些变量,随后调用write,输出格式化后的一个ASCII码串。与此类似的scanf,它采用与printf相同的语法规则来读取输入。标准I/O库包含相当多的涉及I/O的库函数,它们都作为用户程序的一部分运行。

2.spooling系统

Spooling(外部设备联机并行操作)系统是关于慢速字符设备如何与计算机主机交换信息的一种技术,也称为假脱机系统,是多道程序设计系统中处理处理独占I/O设备的一种方法。它在输入和输出之间增加了“输入井”和“输出井”的排队转储环节。

Spooling系统主要包括以下三部分:

(1)输入井和输出井:这是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。输出井模拟脱机输入时的磁盘,用于收容用户程序的输出数据。

(2)输入缓冲区和输出缓冲区:这是在内存中开辟的两个缓冲区。输入缓冲区用于暂存有输入设备送来的数据,以后在传送到输出井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。

(3)输入进程和输出进程:输入进程模拟脱机输入时的外围控制机,将用户要求的数据有输入设备到输入缓冲区,再送到输入井。当CPU需要输入设备时,直接从输入井读入内存。输出进程模拟脱机输出时的外围控制机,把用户要求输入的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据,经过输出缓冲区送到输出设备上。

Spooling技术的特点包括:

(1)提高了I/O速度。从对低速I/O设备进行的I/O操作变为对输入井或输出井的操作,如同脱机操作一样,提高了I/O速度,缓和了CPU与低速I/O设备速度不匹配的矛盾。

(2)设备并没有分配给任何进程。在输入井或输出井中,分配给进程的是一存储区和建立一张I/O请求表。

(3)实现了虚拟设备功能,多个进程同时使用一独享设备,而对每一进程而言,都认为自己独占这一设备,不过该设备是逻辑上的设备。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈