7.2.5 I/O软件原理
1.I/O软件的设计目标
I/O软件的总体设计目标是按照分层思想来组织I/O软件,低层软件用来屏蔽具体设备细节,从而实现上层的设备独立性;高层软件则要为用户提供一个统一、规范、友好的界面。这种层次结构很好地体现了I/O设计的一个关键的概念:设备独立性。
2.I/O软件的4个层次
根据I/O软件的设计目标,将I/O软件由低向高分为4个层次,分别是I/O中断处理程序、I/O设备驱动程序、与设备无关的I/O软件、用户层的I/O软件。
(1)I/O中断处理程序
I/O中断处理程序位于操作系统底层,与硬件设备密切相关。当设备控制器收到CPU发来的I/O命令后,就开始I/O操作,设备在完成I/O操作后,控制器便向CPU发送一个中断请求,CPU响应请求后便转入中断处理程序执行。
CPU响应设备发送的中断请求后转入中断处理程序执行的过程中,通常需要CPU判断中断产生的原因,判断引起中断的设备,并根据I/O操作完成的情况进行相应的处理:如果数据传输错误,则向上层软件报告出错原因;如果传输正常结束,则要唤醒被阻塞的驱动进程;如果有等待传输的I/O命令,则通知相关软件启动下一个I/O请求。
(2)I/O设备驱动程序
设备驱动程序是指驱动物理设备与DMA控制器或I/O控制等直接进行I/O操作的子程序集合,是一种可以使计算机与设备进行通信的特殊程序,或者说是请求I/O的进程与设备控制器之间的一个通信和转换程序。驱动程序也可以认为是硬件厂商根据操作系统编写的配置文件。通常,不同类型的设备有不同的设备驱动程序。
设备驱动程序的主要任务是负责启动指定设备,即负责设置与相关设备有关的寄存器的值,启动设备进行I/O操作,指定操作的类型和数据流向等。具体处理过程如下:用户进程发出I/O请求→系统接受这个I/O请求→设备驱动程序具体完成I/O操作→I/O完成后,用户进程重新开始执行。
一般来说,设备驱动程序接受来自上层与设备无关软件的抽象请求,并执行该请求。如果请求到来时驱动程序是空闲的,那么它就立即执行该请求;若驱动程序正在处理一个请求,则将新到来的请求插入一个等待处理I/O请求队列中。
设备驱动程序的功能如下:
1)接收由I/O进程发来的命令和参数,并将命令中的抽象要求转换为具体要求。
2)接受用户的I/O请求。设备驱动程序将用户的I/O请求排在请求队列的队尾,检查I/O请求的合法性,了解I/O设备的状态,传递有关参数等。
3)取出请求队列中的队首请求,将相应设备分配给它,然后启动该设备工作,完成指定的I/O操作。
4)处理来自设备的中断,及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。
5)对于设置有通道的计算机系统,驱动程序还应能够根据用户的I/O请求,自动地构成通道程序。
(3)与设备无关的I/O软件
为了实现设备独立性,就必须在设备驱动程序之上设置一层与设备无关的操作系统软件。与设备无关的I/O软件,通常也称为I/O子系统,其基本任务就是执行适用于所有设备的常用I/O功能,并向用户层软件提供统一的接口。该层的工作主要在核心态完成。与设备无关的I/O软件主要功能如下:
1)设备命名映射。I/O设备同磁盘文件一样需要命名并按照路径名寻址,每个设备名具有文件名、inode、文件所有者、权限位等属性。一个设备名唯一确定一个索引节点,索引节点中通常包含主设备号和次设备号,通过主设备号可以找到相应的设备驱动程序,通过次设备号确定具体的物理设备。设备映射负责将设备的符号名(逻辑设备名)映射到具体的设备(物理设备名)和相应的驱动程序上。
2)设备保护。检查用户程序是否有权对I/O设备进行访问。保护机制与文件系统一样都采用rwx权限。
3)提供独立于设备的块尺寸。不同磁盘可以采用不同的扇区大小,I/O子系统负责屏蔽这一事实并向高层软件提供统一的逻辑数据块尺寸,使高层软件只与抽象设备打交道。
4)独占设备分配与回收。检查设备的使用状态,接受或拒绝用户请求。当进程使用完独占设备时应关闭并释放该设备。
5)缓冲区的分配和释放。块设备和字符设备都需要缓冲技术,通过在主存开辟缓冲区来解决数据交换速度的匹配问题。设备缓冲区通常是从一个公用的大缓冲区中动态分配的。
6)与设备无关的错误处理。低层软件将不能处理的错误交给高层软件处理,高层软件处理那些设备驱动程序无法处理的错误。
7)向用户层I/O软件提供统一接口。所有设备向用户提供的接口是相同的。例如,对各种设备的读操作,在应用程序中都使用read;对各种设备的写操作,都使用write。
(4)用户层的I/O软件
用户层的I/O软件位于I/O系统软件的最上层,负责与用户及设备无关的I/O软件通信。它面向程序员,当接收到用户的I/O指令后,将具体请求发送给设备无关的I/O软件。该层的工作在用户态完成。它主要包含I/O函数库和SPOOLing系统。