|
知识路径: > 嵌入式系统软件基础知识 > 嵌入式操作系统基础知识 > 设备管理 > 设备驱动程序 >
|
被考次数:2次
被考频率:低频率
总体答错率:49%  
知识难度系数:
|
由 软考在线 用户真实做题大数据统计生成
|
相关知识点:5个
|
|
|
|
设备管理软件的设计水平决定了设备管理的效率,为了更好地管理系统当中各式各样的I/O设备,在软件上通常采用分层的体系结构,把各种设备管理软件组织成一系列的层次。其中,低层软件是面向硬件的,与硬件特性密切相关,它把硬件和上层的软件隔离开来。而较高层的软件是面向用户的,负责向用户提供一个友好、清晰、统一的编程接口。一般来说,这个层次结构可以分四层:中断处理程序、设备驱动程序、设备独立的I/O软件和用户空间的I/O软件。
|
|
|
|
中断处理程序与设备驱动程序密切配合,来完成特定的I/O操作。当一个用户程序需要某种输入/输出服务时,它会去调用相应的系统调用函数,而这个函数又会去调用相应的设备驱动程序。然后,在驱动程序中会启动输入/输出操作,并且被阻塞起来。直到这个I/O操作完成,之后将产生一个中断,并跳转到相应的中断处理程序。然后在中断处理程序中,将会唤醒被阻塞的驱动程序。至于阻塞和唤醒的具体实现,可以采用各种任务间通信的方式,如P、V原语。
|
|
|
在中断处理过程中,还需要执行如下指令,如保存CPU的运行上下文、为中断服务子程序设置一个运行环境、向中断控制器发出应答信号以及执行相应的中断服务子程序等,这些都需要一定的时间开销。
|
|
|
|
设备驱动程序是直接同输入/输出设备交互,直接对它们进行控制的软件模块。设备驱动程序的基本任务就是接收来自于上层I/O软件的抽象请求,并且去执行这个请求。例如,抽象的读操作、写操作、设备的初始化操作等。上层的I/O软件通过这些抽象的函数接口与设备驱动程序打交道,这些接口是标准的、稳定不变的。而硬件设备的具体细节被封装在设备驱动程序里面。这样,即使硬件设备发生了变化,只要更新相应的设备驱动程序即可,不会影响到上层软件对它的使用。
|
|
|
设备驱动程序与具体的设备类型密切相关。每一个I/O设备都需要相应的设备驱动程序,而每一个设备驱动程序一般也只能处理一种类型的设备。因为对于不同类型的设备,它们的控制方式是不同的。例如,对于一个鼠标驱动程序来说,它需要从设备控制器中读取各种各样的信息,包括鼠标移动的位置、哪一个键被按下了等等。而对于一个磁盘驱动程序来说,它为了进行磁盘的读写操作,就必须知道扇区、磁道、柱面、磁头等各种各样的参数,并使用这些参数来控制磁盘控制器。
|
|
|
一般而言,在具体实现一个设备驱动程序的时候,可以采用一种通用的结构。
|
|
|
(1)检查输入的参数是否有效,如果无效,就返回一个出错报告;如果有效,就把输入的抽象参数转换为控制设备所需要的具体参数。
|
|
|
(2)检查设备当前是否空闲,如果设备正忙,那么这一次的I/O请求就暂时没法完成,因此把它加入等待队列,稍后再处理。如果设备空闲,再检查硬件的状态,看是否具备了运行的条件。
|
|
|
(3)设备驱动程序向设备控制器发出一连串的命令,即把这些命令写入到控制器的各个寄存器当中。
|
|
|
(4)在发出控制命令后,如果这个I/O操作需要一定的处理时间,不能马上完成,那么驱动程序就会把自己阻塞起来,直到I/O操作完成。这时会发生一个中断,在这个中断处理程序里面把驱动程序唤醒。
|
|
|
(5)I/O操作完成后,驱动程序还要检查出错情况。若一切正常,就返回一些状态信息给调用者。如果这是一个输入操作,还要把输入的数据上传给上一层的系统软件。
|
|
|
事实上,实时内核的I/O系统的作用就像一个转换表,把用户对I/O的请求转换到相应的设备驱动程序。这样,驱动程序就能获得最原始的用户请求,并对设备进行操作。
|
|
|
|
在设备驱动程序的上面,是设备独立的输入/输出软件。它是系统内核的一部分,主要任务是实现所有设备都需要的一些通用的输入/输出功能,并向用户级的软件提供一个统一的访问接口。具体来说,在这个层面上实现的功能主要有:设备驱动程序的管理、与设备驱动程序的统一接口、设备命名、设备保护、缓冲技术、出错报告以及独占设备的分配和释放。
|
|
|
设备驱动程序的管理通过驱动程序地址表来实现。驱动程序地址表中存放了各个设备驱动程序的入口地址,可以通过此表来实现设备驱动的动态安装与卸载。
|
|
|
操作系统的一个主要问题就是如何使各种I/O设备和设备驱动程序的处理方式大致相同,从而方便系统的设计和用户的使用,实现设备独立性。因此,I/O系统通常会提供一个统一的调用接口,包含了一些常用的设备操作,如设备初始化、打开设备、关闭设备、读操作、写操作、设备控制,等等。在I/O设备的命名规则上,可以采用统一命名的方式,然后由设备独立的I/O软件来负责把设备的符号名映射到相应的设备驱动程序。
|
|
|
缓冲技术是操作系统当中很重要的一种技术,它的基本思想是:在实现数据的输入/输出操作时,为了缓解CPU与外部设备之间速度不匹配的矛盾,提高资源的利用率,可以在内存当中开辟一个空间,作为缓冲区。当需要从设备读取数据时,先到缓冲区中去查找,如果能够找到,就不用去访问外设了。同样,往设备中写入数据时,也是先写到缓冲区中。这样,如果马上又要用到这些数据,就可以直接从缓冲区中去取。缓冲技术是一种实用、有效的技术,因为对于I/O设备的访问,也会满足程序的局部性原理,即在访问设备数据的时候,在一小段时间内,可能会集中地访问其中的若干个数据块。所以设置缓冲区可以减少对I/O设备的访问,从而提高系统的性能。在具体实现上,缓冲技术可以分为单缓冲、双缓冲、多缓冲和环形缓冲。
|
|
|
|
通常大部分的I/O软件都是包含在操作系统当中,是操作系统的一部分,但也有一小部分的I/O软件,它们运行在系统内核之外。这主要可以分为两种:
|
|
|
.与用户程序进行链接的库函数。例如,在C语言中与输入/输出有关的各种库函数。不过,对于这些库函数,它们在具体实现的时候,其实是把传给它们的参数再往下传递给相应的系统调用函数,然后由后者来完成实际的输入/输出操作。
|
|
|
.完全运行在用户空间当中的程序。例如,Spooling技术是在多道系统中,一种处理独占设备的方法。
|
|
|
Spooling(simultaneous peripheral operations on line)是外围设备联机操作的缩写,常称为Spooling技术、假脱机技术或虚拟设备技术,它可以把一个独占的设备转变为具有共享特征的虚拟设备,从而提高设备的利用率。它的基本思想是:在多道系统当中,对于一个独占的设备,专门利用一道程序,即Spooling程序,来增强该设备的输入/输出功能。具体来说,一方面,Spooling程序负责与这个独占的I/O设备进行数据交换,这可以称为实际的I/O操作。另一方面,应用程序在进行I/O操作时,只是和这个Spooling程序交换数据,这可以称为虚拟的I/O操作。此时,它实际上是与Spooling程序当中的缓冲区打交道,从中读出数据或往里写入数据,而不是直接地跟实际的设备进行I/O操作。
|
|
|
Spooling技术的优点有两个:第一,它能提供高速的虚拟输入/输出服务。应用程序的虚拟输入/输出比实际的输入/输出速度要快,因为它只是在两个任务之前的一种通信,把数据从一个任务交给另一个任务,这种交换是在内存中进行的,而不是真正地让机械的物理设备去运作,这样就能缩短应用程序的执行时间;第二,它能实现对独占设备的共享,也就是说,由Spooling程序提供虚拟设备,然后各个用户任务就可以对这个设备依次地共享使用。
|
|
|