在操作系统当中,设备驱动程序是一种非常重要的I/O软件。设备驱动程序是直接同IO设备打交道,直接对它们进行控制的软件模块。设备驱动程序的基本任务是接收来自上层的IO软件的抽象请求,并且去执行这个请求,例如,抽象的读写操作,设备的初始化操作等。上层的IO软件通过这些抽象的函数接口与设备驱动程序打交道,而这些接口是标准的、稳定不变的,而硬件设备的具体细节被封装在设备驱动程序内部。这样,如果硬件设备发生变化,只要更新相应的设备驱动程序即可,不会影响到上层软件对它的使用。
设备驱动程序与具体的设备类型密切相关。每个IO都需要相应的设备驱动程序,而每一个设备驱动程序也只能处理一种类型的设备,因为对不同类型的设备,他们的控制方式不同的。例如,对于一个鼠标设备驱动程序来说,它需要从设备控制器中读取各种各样的信息,包括鼠标的移动位置、那个键被按下等。而对于一个磁盘的驱动程序而言,它为了进行磁盘的读写操作就必须知道扇区、磁道、柱面、磁头等各种各样的参数,并使用这些参数来控制磁盘控制器。
一般而言,在具体实现一个设备驱动程序的时候,可以采用一种通用的结构。
(1)检查输入的参数是否有效,如果无效,就返回一个出错报告;如果有效,就把输入的的抽象参数转换而控制设备所需要的具体参数。
(2)检查设备当前是否空闲,如果设备正忙,那么这一次的IO请求就暂时没法完成,所以把它加入等待队列(阻塞队列),稍后在处理;如果设备空闲,再检查硬件的状态,看是否具备了运行的条件。
(3)设备驱动程序向设备控制器发出一连串的命令,也就是说,把这些命令写入到控制器的各个寄存器中当中。
(4)在发出控制命令后,如果这个IO操作需要一定的时间,不能马上完成,那么驱动程序就会把自己阻塞起来,直到IO操作完成,并通过硬件产生一个中断,在这个中断处理程序里面把驱动程序唤醒加入到就绪队列中(如果cpu空闲则就获得cpu运行)。
(5)IO操作完成以后,设备驱动程序还有检查出错的情况。若一切正常,就返回一些状态信息给调用者。如果这是一个输入的操作,还要把输入的数据上传给上一层的系统软件。
在实时内核的IO系统中,用户的IO请求在到达设备驱动程序之前,通常只做少量的处理。事实上,实时内核的IO系统的作用就像一个转换表,把用户对IO的请求转换到相应的设备驱动程序中。这样,设备驱动程序就能获得最原始用户的请求,并对设备进行操作。
阅读(1872) | 评论(0) | 转发(0) |