• Windows Debugging之十


    驱动程序的结构

    ===========

    IO系统控制并驾驭者着驱动程序的执行. 驱动程序有一系列的函数组成, 这些函数在IO请求的处理的不同阶段被调用. 下图说明了驱动功能函数的要点:

    2009-11-21 21-33-22

    • 一个初始化函数(An initialization routine)- 当IO管理器把驱动程序加载到操作系统中的时候, IO管理器会执行一个驱动的初始化函数, 这个函数典型地被称作DriverEntry.
    • 一个添加设备函数(An add-device routine)- 一个支持即插即用的驱动程序会实现一个设备添加函数. 当这个驱动负责的设备被监测到的时候, PnP管理器会通过这个函数向驱动程序发送通知.
    • 一系列的分配函数(A set of dispatch routines)- 分配函数是设备驱动程序提供的主要功能的函数. 举例包括, 打开, 关闭, 读, 写还有任何其他设备支持的功能, 这些设备可以是文件系统, 也可以是网络.
    • 一个启动IO函数(A start I/O routine)- 驱动程序可以使用启动IO函数来初始化发送向另一个设备的数据传输, 也可以初始化别的设备向它的数据传输. 这个函数只在依赖于IO管理器来将发向设备的请求排入队列的设备中定义. IO管理器通过序列化IRPs的方式来确保驱动每次只处理一个IRP. 多数驱动同时地处理多个IRP, 但是序列化对某些驱动来说是合理的, 比如说键盘驱动.
    • 一个中断服务函数(An interrupt service routine (ISR))- 当一个设备中断的时候, 内核的中断分配器将控制转交给这个函数. 在Windows IO模型中, 中断服务函数(ISR)运行在设备中断请求等级(device interrupt request level)(DIRQL), 所以它们为了避免不必要的对low-level的中断处理的阻碍, 执行的时候所做的操作是越少越好. 一个ISR将拒绝了的低IRQL的函数调用(deferred procedure call)(DPC)进行排队处理, 以便进行剩下请求的中断处理. (只有依靠中断驱动式的设备有ISR, 文件系统读驱动, 比如说, 就没有ISR了)
    • 一个服务中断的DPC函数(An interrupt-servicing DPC routine)- DPC函数执行大多数的工作, 这些工作跟在ISR执行之后的设备中断的处理有关. DPC函数执行在一个比ISR更低的IRQL(DPC/dispatch level)上, 也就是设备水平(device level), 这样才能避免不必要地阻碍其他的中断. 一个DPC函数初始化IO的结束, 并且启动设备中的队列里的下一个IO操作.

    尽管下面的函数在上图中并没有显示出来, 但他们在很多种类的设备驱动中可以找得到:

    • 一个或更多的结束函数(One or more I/O completion routines)- 一个分层次的驱动可能会有IO完成函数, 用来在一个低水平的驱动结束了IRP(I/O request packet)的处理时, 通知设备. 比如说IO管理器会在一个驱动程序结束了将数据转换到文件中的时候, 调用文件系统驱动的IO完成函数. 结束函数通知文件系统驱动: 那个转换数据的操作是成功了, 失败了, 还是取消了, 它还允许文件系统驱动进行清理工作.
    • 一个取消IO函数(A cancel I/O routine)- 如果一个IO操作被取消了, 驱动程序可以定义一个或更多取消IO函数. 当这个驱动程序收到一个可以被取消的IO请求的IRP时, 它会指配一个取消函数到IRP中. 如果一个处理IO的线程在IO请求结束之前就退出了, 或者取消了操作(比如说通过Windows的CancelIo函数), 那么IO管理器会执行IRP中的取消函数, 如果这个IRP被指派了这样一个函数的话. 一个对于不论做什么步骤的IO操作的取消函数, 对释放任何已经获得了的资源的IRP来说是非常必要的, 如同结束了的处于取消状态的IRP一样.
    • 一个卸载函数(An unload routine)- 写在函数释放驱动正在使用的任何系统资源, 如此IO管理器才可以他们从内存中移除出去. 任何在初始化函数中请求来的资源一般都会在卸载函数中释放掉. 所以, 在系统运行的情况下, 一个驱动可以被成功地加载和卸载.
    • 一个系统关机通知函数(A system shutdown notification routine)- 这个函数允许驱动在系统关闭之前进行清理工作.
    • 错误日志函数(Error-logging routines)- 当未预计的错误发生的时候(比如说, 磁盘上的某一块儿损坏了), 那么驱动程序的错误处理函数会记录下这个错误的发生, 并通知IO管理器. IO管理器将这个信息写入到错误日志中.
  • 相关阅读:
    java.lang.NoSuchMethodError: org.springframework.web.context.request.ServletRequestAttributes.<init>
    eclipse web项目实际工程路径对应
    java中专业术语详解
    Maven详解
    工作常用
    html页面布局
    jQuery易混淆概念的区别
    Jquery Datagrid
    Jquery EasyUI 动态添加标签页(Tabs)
    sql语句的写法
  • 原文地址:https://www.cnblogs.com/awpatp/p/1607812.html
Copyright © 2020-2023  润新知