Windows内核学习:I/O系统

来源:互联网 发布:百度推广数据分析报告 编辑:程序博客网 时间:2024/05/17 08:07

作者:shenzi

链接:http://blog.csdn.net/shenzi

Windows内核学习:I/O系统
1.I/O系统组件
    Windows的I/O系统如图1所示,由几个可执行模块和设备驱动程序组成。
图1:I/O系统组件
  • I/O管理器将应用程序和系统组件连接到虚拟的、逻辑的以及物理的设备上,并定义支持这些设备的基础体系结构。
  • 一个设备驱动程序通常为某种特定类型的设备提供I/O接口。设备驱动程序接收I/O管理器发来的命令。这些命令被导向I/O管理器所管理的设备。当那些命令完成后驱动程序通知I/O管理器。设备驱动程序经常利用I/O管理器向前传递I/O指令给其它设备驱动程序。在某种设备接口或控制的实现中,这些设备驱动程序是共享的。
  • PnP管理器与I/O管理器和一种叫做“总线驱动程序(busdriver)”的设备驱动程序紧密合作,指导硬件资源的分配,并检测和响应硬件设备的到达和删除。当检测到设备时,PnP管理器与总线驱动程序负责加载设备驱动程序。当一个设备被添加到系统而不具备合适的设备驱动程序时,可执行的即插即用组件调用某个用户模式的PnP管理器的设备安装服务。
  • 电源管理器也与I/O管理器紧密合作,指导系统以及个别设备驱动器实现电源状态的迁移。
  • Windows管理装置(WMI)支持称为“WDM WMI提供程序”的例程。在用户模式利用WDM WMI提供者作为中介与WMI通信,允许设备驱动程序作为间接地提供者。
  • 注册表充当数据库,存储附属于系统的基本设备的描述以及驱动器的初始化和配置。
  • INF文件是驱动程序安装文件,用后缀.inf表示。INF文件是一个特定硬件设备与控制该设备的驱动程序之间的联系纽带。它们由类似于脚本的指令组成,描述相应的设备、驱动程序文件的源目标位置、安装驱动程序所需要的注册表修改,以及驱动程序的依赖信息。Windows用来检验设备文件是否通过WHQL测试的数字签名存储在.cat文件中。
  • 硬件抽象层(HAL)通过提供隐藏平台之间的差别的API将驱动程序从处理器和中断控制器的规范中隔离开来。实际上,HAL是计算机主板上所有设备的总线驱动程序,不受驱动程序的控制。
   典型的I/O请求流程如图2所示:
    
图2:典型的I/O请求流程
    在Windows中,线程在虚拟的文件上执行I/O操作。操作系统将所有的I/O请求抽象为对虚拟文件的操作,从而隐藏了I/O操作的目标可能不是一个文件结构型设备的事实。这种抽象将应用程序到设备的接口一般化。虚拟文件是指某种被当作文件对待的I/O资源或目的地,例如文件、目录、管道、邮件槽等。所有读写的数据都被看作是指向相应虚拟文件的简单的字节流。
I/O管理器:
  • I/O管理器定义有序的工作框架或模型,在该框架内I/O请求被发送给设备驱动程序。I/O系统是包驱动的。大多数I/O请求都是用I/O请求包(IRP)表示的。IRP是一种数据结构,包含描述一个I/O请求的完整信息。
  • I/O管理器创建代表I/O操作的IRP,将该IRP指针传递给正确的驱动程序,并在I/O操作完成后释放该包。相反,驱动程序接收IRP,执行IRP指定的操作,并在操作完成后将IRP传回给I/O管理器,或者是将其传递给另一个驱动程序进一步处理。
  • I/O管理器还为不同的驱动程序提供公共代码。驱动程序调用这些代码执行各自的I/O处理。
  • 驱动程序提供的统一的、模块化的接口,使I/O管理器可以调用任何驱动程序而不需要与它的内部结构或细节有关的任何特殊知识。
设备驱动程序:
    为了集成I/O管理器和其它I/O系统组件,设备驱动程序必须确保实现了它所管理的设备类型的指导准则以及管理设备时所起的作用。设备驱动程序例子如图3
    

图3:文件驱动程序和磁盘驱动程序的分层
    该图说明了两个分层的驱动程序之间的任务划分。I/O管理器接收写请求,该请求时相对于特定文件的起始位置的。I/O管理器将请求传递给文件系统驱动程序。文件系统驱动程序将相对于文件的写操作转换成起始位置(磁盘上的扇区边界)和所要读写的字节数。文件系统驱动程序调用I/O管理器将请求传递给磁盘驱动程序,后者再将请求转换成物理磁盘位置并传输数据。
    因为所有驱动程序—设备驱动程序和文件系统驱动程序—对操作系统都呈现同样的工作框架,所以可以很容易地将另外的驱动程序插入层次结构中,而不需改变现有的驱动程序或者是I/O系统。
    设备驱动程序由一组例程组成,这些例程被用来处理不同阶段的I/O请求。图4描述了关键的功能驱动程序例程:
    
图4:主要的设备驱动程序例程
即插即用管理器:
    即插即用(Plug andPlay,PnP)管理器是支持Windows识别并自适应地更改硬件配置能力的主要组件。用户不需要为安装或删除设备而去理解硬件或手工配置的复杂性。即插即用功能需要硬件级、驱动程序级和操作系统级的写作。附加在总线上的设备枚举与识别的工业标准是Windows即插即用功能的基础。
  • PnP管理器自动识别所安装的设备;
  • 硬件资源的分配是PnP管理器的任务;
  • 加载适当的驱动程序时PnP管理器的另一项职责;
  • PnP管理还实现应用程序和驱动程序检测硬件配置的更改的机制。   
电源管理器:
    就像Windows的即插即用给你功能需要系统的硬件支持那样,它的电源管理性能也需要一件支持。这些硬件必须遵从高级配置与电源接口(ACPC)规范。
    ACPC标准为系统和设备定义了各种不同的电源级别。表1描述了系统的六种电源状态。分别以S0(完全打开或工作态)到S5(完全关闭)表示它们。
    
表1:系统电源状态定义
2.I/O数据结构
    有四种主要的数据与I/O请求相关:文件对象、驱动程序对象、设备对象和I/O请求包(IRP)。
文件对象:
    文件对象是处理文件或设备的内核模式结构,它们是两个或两个以上用户模式进程的线程可以共享的系统资源,它们可以又名称,它们由基于对象的安全机制所保护,并且它们支持同步。
     当调用程序打开一个文件或简单设备时,I/O管理器将返回一个文件对象句柄。图5说明了打开一个文件时所发生的情况:
图5:打开一个文件对象
驱动程序对象和设备对象:
    当线程打开一个文件对象句柄时,I/O管理器必须从文件对象的名称决定它应该调用哪个(或哪些)驱动程序来处理请求。而且,I/O管理器必须在线程下一次使用同一个文件句柄时可以查找这个信息。一下系统对象满足这些要求:
  • “驱动程序对象"在系统中代表一个独立的驱动程序。I/O管理器从驱动程序对象获取驱动程序的调度例程(入口点)的地址。    
  • ”设备对象“在系统中代表一个屋里或逻辑设备并描述了它的特征,例如它所需要的缓冲区对齐方式以及用来保存到来的I/O请求包的设备队列的位置。
图6:驱动程序对象
I/O请求包:
    I/O请求包(IRP)是I/O系统用来存储处理I/O请求所需信息的地方。当线程调用I/O服务时,I/O管理器就构造一个IRP来表示在整个I/O系统进展中要进行的操作。
图7:涉及单层驱动程序I/O请求的数据结构
3.I/O处理
    我们来考察一下I/O请求时如何在系统中流动的。图8说明了当读取操作启动后的控制流程。
图8:I/O操作的控制流程
    跟踪对单层内核模式设备驱动程序的同步I/O请求。处理对单层驱动程序的同步I/O请求包括以下7步,如图9:
     1)  I/O请求经过子系统DLL;
    2) 子系统DLL调用I/O管理器的NtWriteFile服务;
     3)  I/O管理器分配一个描述该请求的IRP并通过调用其拥有的IoCallDriver函数将该IRP发送给驱动程序(这里指设备
          驱动程序)
     4)  驱动程序将IRP中的数据传输到设备并启动I/O操作;
     5)  驱动程序通过中断CPU,发信号给I/O完成例程;
     6)  在设备完成了操作并且中断CPU时,设备驱动程序服务于中断;
     7)  驱动程序调用I/O管理器的IoComleteRequest函数通知其自身已经完成IRP请求的处理,然后I/O管理器完成该I/O             请求。

    图9:单层驱动程序的同步I/O请求

参考:
WINDOWS 2000内部揭秘
Windows OS Internals Curriculum Resource Kit (CRK)

 

原创粉丝点击