* 在了解了驱动程序的结构和类型以及支持该结构和类型的数据结构之后,就可以来看一下I/O请求是如何在系统中传递的。I/O请求会经过几个处理阶段。 而根据是指向由单层驱动程序操作的设备还是一个经过多层设备驱动程序才能到达的设备,它所经过的阶段会有所不同。因为处理的不同还依赖于调用是指定了同步I/O还是异步I/O,所以我们按两种类型来看I/O请求的处理过程。 4.5.4 I/O请求处理过程 * 如果请求是对面向字节的设备,如打印机、键盘、视频监视器和鼠标器等,则可以采用单层处理方法。处理对单层驱动程序的同步I/O处理包括一下六步: 1)I/O请求经过子系统DLL。 2)子系统DLL调用I/O管理器的服务。 1.对单层驱动程序的I/O请求的处理 * 3)I/O管理器以IRP的形式给设备驱动程序发送请求。 4)设备驱动程序启动I/O操作。 5)在设备完成了操作并且中断CPU时,设备驱动程序服务于中断。 6)I/O管理器完成I/O请求。 这六步过程如图4-21所示。 * 图4-21 单层同步请求的I/O处理 环境子系统或DLL I/O管理器 设备驱动程序 打印机 ①I/O请求(以函数形式) ②创建IRP,并调用设备驱动程序 ③传输IRP中指定的数据 ⑥完成IRP,并返回成功或错误状态 ⑤处理中断,并返回成功或错误状态 ④执行I/O,完成后发出中断 * 在本节的“设备驱动程序”部分,我们已经介绍了从用户请求I/O,到设备完成I/O操作的过程,下面我们来研究一下当设备完成I/O操作后,设备发出中断请求,设备驱动程序中的中断处理程序处理中断的过程,以及中断处理完毕后,I/O管理器完成I/O请求的过程。 * 在I/O设备完成数据传输之后,它将中断并请求服务。设备中断发生后,处理器将控制转交给内核陷阱处理程序,内核陷阱处理程序将在它的中断调度表中搜索和定位设备的中断服务例程ISR,当ISR被首次调用时,它获得设备的状态,接着停止设备的中断,然后它给一个DPC排队并退出操作,清除中断。处理中断第一个阶段如图4-22所示。 (1)设备中断的处理 * 打印机 掉电 设备IRQL DPC APC 正常执行 调度例程 启动 I/O ISR DPC例程 ③ISR停止设备中断,并将DPC排队 DPC DPC DPC 设备驱动程序 DPC队列 ①设备发出请求服务的中断,内核陷阱处理程序在中断调度表中搜索 ②内核的中断调度程序将控制交给设备的服务例程 中断调度表 图4-22 处理设备中断的 第一个阶段 * 在经过一段时间后,IRQL降低,开始进行DPC处理,内核陷阱处理程序在中断调度表中搜索,搜索到指定的中断后,中断调度程序把控制权交给驱动程序的DPC例程,DPC例程启动打印机队列中的下一个I/O请求,然后完成中断服务。处理中断的第二个阶段如图4-23所示。 * DPC 掉电 设备IRQL DPC APC 正常执行 调度例程 启动I/O ISR DPC例程 打印机 IRP IRP ③DPC例程启动打印机队列中的下一个I/O请求,然后完成中断服务 ①IRQL降低,开始处理DPC并在中断调度表中搜索 中断调度表 图4-23 处理设备中断的第二个阶段 DPC DPC DPC队列 ②中断调度程序将控制交给驱动程序的DPC例程 设备队列 设备驱动程序 * 当设备驱动程序的DPC例程执行完以后,就可以进行I/O处理的第三个阶段,即“I/O完成”,它因I/O操作的不同而不同。例如,全部的I/O服务都把操作的结果记录在调用者提供的数据结构“I/O状态块”中。与此类似,一些执行缓冲I/O服务的要求I/O系统返回数据给调用线程。 (2)完成I/O请求 * I/O系统必须把一些存储在系统内存中的数据复制到调用者的虚拟地址空间中。要获得调用者的虚拟地址,I/O管理器必须在“调用者的线程描述表”中进行数据传输,即调用的线程正在执行时,才能数据传输。它通过把一个内核模式的异步过程调用(APC)排队到线程中来完成这个操作。这是完成I/O的第一个阶段,如图4-24所示。 * APC APC 调度例程 启动I/O ISR DPC例程 I/O管理器 ②I/O管理器将一个APC放入线程的APC队列中 线程的APC队列 设备驱动程序 ①DPC例程调用I/O管理器来完成I/O请求 图4-24 完成I/O的第一个阶段 * ●中断服务例程(ISR):当一个设备中断时,内核的中断调度程序把控制转交给这
原创力文档

文档评论(0)