Windows I/O系统

来源:互联网 发布:mac系统 matlab 2016b 编辑:程序博客网 时间:2024/06/06 14:01

王泽玮

(南京理工大学 计算机科学与工程学院 南京 210094)

About windows I/O system’s research

WANG Zewei

(Department of Computer Science and Technology, Nanjing University of Science and Technology, Nanjing 210094 , China)

Abstract: The Windows I/O system consists of several executive components that together manage hard-ware devices and provide interfaces to hardware devices for applications and the system.Here we came up for a relatively depth discussion,described the composition of its various components, to obtain knowledge of the process on the windows io.

 

摘要:WindowsI/O系统包括几个执行组件,它们共同管理硬件设备,并提供硬件设备、应用程序和系统的接口。在这里我们对windows进行一次较为深入的探讨,对其各个部件的组成进行说明,以获得关于windows io的处理过程更多的知识。

关键词:windows I/O IRP;组件

 

在现代操作系统中,I/O(Input/Output,输入输出)是计算机完成各种功能的一个重要方面。处理器负责执行各种计算任务,并且通过内存总线操纵整个内存空间,但作为一个现实可用的计算机系统,仅仅具备这样的计算和内存访问能力还不够,还要有各种外部设备的参与才可使计算机真正“有用”。尽管这些设备的功能和用途各式各样,但是处理器利用了标准的接口技术,通过设备的控制器与它们打交道。因此,从硬件层面上,处理器支持的接口技术是计算机系统能够协作运行的基础。

从软件层面上,操作系统必须提供相应的软件来操纵这些设备的控制器,并且定义对应的软件接口或系统服务,使得应用程序可以方便地操纵或使用外部设备。并且,在一个多任务,多进程操作系统中,这些外部设备是共享的,所以操作系统必须协调对外部设备的访问。典型的做法是,应用程序不直接访问外部设备,而是通过操作系统来完成对设备的访问。Windows 作为一个通用操作系统,提供了一套可扩展的I/O处理框架,从而允许第三方硬件厂商编写专门的系统模块来控制其硬件设备。这一I/O处理框架即被成为windows I/O模型。我们将首先探讨windows I/O模型的组成,及各个部件的作用,最后对IRP(I/O Request Packet)的处理过程进行详解。

1.windows I/O模型

windows 的 I/O系统由5个部分组成:I/O管理器、即插即用管理器、电源管理器、WMI例程,以及设备驱动程序。其中I/O管理器是整个I/O系统的核心,它定义了一个非常通用的框架,允许各种功能的设备驱动程序容纳于其中。I/O管理器除了支持与设备相关的驱动程序以外,它也允许与设备无关的驱动程序进入到内核中,这一类驱动程序并不操纵任何硬件设备,它们进入到内核中以后,将变成内核的一部分,一旦经过I/O管理器的初始化,便与内核融为一体。因此设备驱动程序也是内核扩展的一种形式。

对上图各部件功能的说明:

◆I/O管理器是I/O系统的核心。它将“应用程序和系统组件”与“虚拟的、逻辑的和物理的设备”连接起来,而且它定义了基础设施来支持设备驱动程序;

◆设备驱动程序通常为某一特定类型的设备提供一个I/O接口。设备驱动程序接收来自I/O管理器传送给它们的命令,当这些命令完成时,它们通知I/O管理器,设备驱动程序通常使用I/O管理器来向其他的共享同一设备接口或控制的设备驱动程序转送I/O命令。

◆Pnp管理器与I/O管理器和一种成为总线型驱动程序(bus driver)的设备驱动程序紧密地一起工作,以指导硬件资源的分配,以及检测并响应硬件设备的加入和移除。Pnp管理器和总线驱动程序负责在检测到一个设备时,将该设备的驱动程序加载进来。当一个设备被加入到一个缺乏正确的设备驱动程序的系统中时,执行体即插即用组件就会请求用户模式Pnp管理器的设备安装服务;

◆电源管理器也与I/O管理器紧密地一起工作,以指导系统和各个单独的设备驱动程序经过电源状态的转变;

◆一组windows管理规范(WMI)支持例程,它们被称为windows驱动程序模型(WDM)WMI提供者。设备驱动程序可以使用WMD WMI提供者作为中间媒介与用户模式的WMI服务进行通信,因而它们间接地成了WMI提供者;

◆注册表被当作一个数据库,保存了当前系统上附载的基本硬件设备的描述信息,以及关于驱动程序初始化和配置的设置信息;

◆.inf文件是驱动程序安装文件,是一个特定的硬件设备与控制该设备的驱动程序之间的纽带。.inf文件由类似脚本的指令构成,指令描述了该.inf文件所对应的设备、驱动程序文件的源位置和目标位置、安装驱动程序所需要的注册表修改,以及驱动程序的相依性信息。

.cat文件用于保存数字签名。Windows利用数字签名检验驱动程序文件是否已经通过了Microsoft Windows硬件质量实验室WHQL的测试。

◆HAL提供一组API,将不同平台之间的差异隐藏起来,从而使驱动程序与处理器和中断控制器的特殊性相互隔离开

通过上图说明,我们了解到,从虚拟机的角度来说,Windows的I/O系统是一个层层封装的虚拟机。Windows在系统核心中,对设备进行了数层封装:直接构建在设备上的是硬件抽象层(HAL),在此之上的是设备驱动程序,然后是I/O系统(I/O管理器、电源管理、WDM、WMI例程等);同时还有许多在用户态运行的系统服务如WMI服务,方便应用程序管理I/O设备。正因为有这种复杂的层次结构,统一管理、兼容成百上千不同种类的系统设备才成为可能。各个抽象层次把硬件结构上的多样性屏蔽掉,使用户能够按照一个统一的方式进行I/O操作。

2.  windows I/O处理流程

2.1一个典型的I/O请求过程

绝大多数I/O操作并不涉及I/O系统的所有组件。典型的I/O请求首先从“一个应用程序执行一个与I/O相关的函数”开始,该请求将由I/O管理器、一个或多个设备驱动程序和HAL来处理。

在Windows中,操作系统将所有的I/O请求都抽象成针对一个虚拟文件的操作,从而屏蔽了“一个I/O操作的目标可能是一个没有文件结构的设备”的事实。所谓虚拟文件,是指任何可被当作文件来对待的I/O源或目标(比如文件、目录、管道和邮件槽)。所有被读或写的数据都被看作一个简单的、位于这些虚拟文件中的字节流。用户模式的应用程序都调用文档化的函数,这些函数又一次调用内部的I/O系统函数来读一个文件、写一个文件,或者执行其他的操作。I/O管理器动态地将这些虚拟文件请求引导到正确的设备驱动程序上。下图显示了一个典型的I/O请求的基本结构:

2.2 windows I/O系统的核心数据结构

与I/O系统有关的主要数据结构有四种,它们是文件对象、驱动程序对象、设备对象和IO请求包(IRP)。下面一一对其介绍:

◆文件对象(File Object):文件对象是一种逻辑上的对象,它并不仅仅可以代表文件,事实上它可以代表许许多多不同的物理设备(键盘、打印机、屏幕……当然也可以代表文件)。它事实上提供的是一种基于内存共享的物理资源表示法。每个文件对象对应一个句柄,用户程序通过这个句柄实现各种I/O操作。具体说,通过写入/查询特定的内存区段的,即可实现和物理设备的通讯。Windows所有的I/O操作都通过这种虚拟的文件对象进行,它隐藏了I/O操作目标的实现细节,为各种不同的物理设备提供了一个统一的操作接口

◆驱动程序对象(Driver Object):驱动程序对象代表系统中一个独立的驱动程序,并且为I/O记录每个驱动程序的调度例程的地址(入口点)。当驱动程序被加载到系统中时,I/O管理器将创建一个驱动程序对象,然后它调用驱动程序的初始化例程,该例程把驱动程序的入口点填放到该驱动程序对象中。

◆设备对象(Device Object):设备对象代表系统中的一个物理、逻辑或虚拟的设备(注意,并不一定是物理设备!)并描述其特征。

总体上看,可以认为驱动程序对象是在功能上的抽象(对应某个“操作”),设备对象是结构上的抽象(对应某个“设备”)。完成某个操作通常需要用到多个设备,所以驱动程序对象通常有多个与它相关的设备对象。尽管驱动程序对象和设备对象所封装的功能和设备是各种各样的,但它们都有统一的模型和接口,所以I/O管理器可以统一对它们进行管理和调用,而不用在意其具体内部结构的不同。

◆I/O请求包(IRP)是I/O系统用来存储处理I/O请求所需信息(例如请求的类型和大小、是同步请求还是异步请求、指向缓冲区的指针和进展状态信息等)的地方。由前面的例子可以看到,在整个系统内核中的I/O处理流程中,所有的调用/返回/控制信息都是由IRP传递的。它在I/O请求开始时由I/O管理器创建,在I/O处理完成后被释放,它是I/O处理中负责信息传递的最主要数据结构,即所谓以IRP驱动的I/O处理机制。

以上四种数据结构完整的抽象出了一个I/O请求的方方面面,它们在逻辑上把形形色色的I/O操作都统一起来,使用户可以不理会具体实现的细节,用几乎同样的方式实现各种I/O操作。

2.2windows I/O完整流程

以下以打开一个文件对象的过程为例,说明Windows I/O请求的处理流程:

1.         子系统调用一个I/O系统服务,打开一个有名字的文件。

2.         I/O管理器(I/O Manager)调用对象管理器(Object Manager)查找这个文件并帮助它找到所有相关的符号链接。同时也调用安全引用监视器(Security Reference Monitor)检查这个子系统是否有打开这个文件对象的权限。

3.         如果这个文件所在的卷还没有装入,那么I/O管理器暂时挂起这个请求,调用其他文件系统,直到装有这个文件的卷装入,然后I/O管理器恢复刚才挂起的请求。

4.         I/O管理器为文件打开请求的IRP初始化分配内存。对于驱动程序而言,文件打开请求等价于一个"create"请求。

5.         I/O管理器调用文件系统驱动程序,向它发送IRP。文件系统驱动程序访问它在IRP中的I/O堆栈单元(I/O stack location)以决定要进行什么操作,检查参数,决定是否需要通过cache访问文件。如果不需要,在IRP中建立更低一级驱动程序的I/O堆栈单元。

6.        各级驱动程序处理IRP完成这个I/O操作请求,会调用I/O管理器和其他系统组件提供的核心态支持例程。

7.         驱动程序在IRP中设置I/O状态块(指明操作是否成功或错误代码),并将IRP返回到I/O Manager。

8.         I/O管理器从IRP中获得I/O状态,通过被保护的子系统将状态信息返回到原始调用者处。

9.         I/O管理器释放已经完成任务的IRP。

10.       如果操作成功,I/O管理器返回这个文件对象的句柄到子系统;否则返回相应的失败状态。

如果打开成功,子系统就可以通过句柄来对这个设备进行各种I/O操作。其他操作的工作流程与此类似。I/O管理器会根据不同的请求类型产生相应的IRP发送到相应的驱动程序中执行特定的操作。以上处理流程虽然复杂,但去掉一些细节后,总脉络是清晰的:I/O请求先陷入到系统核心,从上依层次向下将指令传到设备,执行结果依次向上返回到调用进程,切换回用户态。

在整个I/O系统中,I/O管理器无疑是非常重要的,具有核心地位。顾名思义,它负责所有I/O请求的调度和管理工作。根据请求的不同内容,选择相应的驱动程序对象,设备对象,并生成、发送、释放各种不同的IRP。整个I/O处理流程是在它的指挥下完成的。

2.3 windows I/O类型

事实上由于I/O操作种类繁多,它们有不同的需求和特点,所以Windows提供了不同的I/O操作选项。主要的I/O操作类型有:同步I/O和异步I/O,快速I/O(注意:快速I/O模式比较特殊,不使用IRP),映射文件I/O和文件高速缓存,分散/集中I/O。各种I/O操作类型的内部处理步骤是很不一样的。同时,单层和多层的驱动程序也有不同的执行策略。下面分开介绍:

(1). 同步I/O和异步I/O

应用程序发出的大部分I/O操作都是同步的。也就是说,设备执行数据传输并在I/O完成时返回一个状态码,然后程序就可以立即访问被传输的数据。

异步I/O允许应用程序发布I/O请求,然后当设备传输数据时,应用程序继续执行。这类I/O能够提高应用程序的吞吐率,因为它允许在I/O操作进行期间,应用程序继续完成其他的工作。

与I/O请求的类型无关,由IRP代表的内部I/O操作都将被异步操作执行。也就是说,一旦启动一个I/O请求,设备驱动程序就返回I/O系统。I/O是否返回调用程序取决于文件是否为异步I/O打开的。

(2).快速I/O

快速I/O是一个特殊的机制,它允许I/O系统不产生IRP而直接到文件系统驱动程序或高速缓存管理器去执行I/O请求。快速I/O是特别设计用于缓存文件的快速同步I/O.在快速I/O操作中,数据是在用户缓冲区和系统缓存直接交换,绕过文件系统和存储介质驱动堆栈(存储介质驱动不使用快速I/O).当接收到一个快速I/O的读或写请求时如果要读或写的文件数据都在系统缓存当中,那么请求可以马上被满足.否则就会产生缺页错误,导致一个或多个IRP产生.当这种情况发生时,快速I/O例程要么返回FALSE,或者让调用者等待直到缺页错误被处理.如果快速I/O例程返回FALSE,则请求的操作失败,调用者必须产生IRP

(3).映射文件I/O和文件高速缓存

映射文件I/OI/O系统的一个重要特性,是I/O系统和内存管理器共同产生的。“映射文件I/O”是指把磁盘中的文件视为进程的虚拟内存的一部分。程序可以把文件作为一个大的数组来访问,而无需执行缓冲数据或执行磁盘I/O的工作。程序访问内存,同时内存管理器利用它的页面调度机制从磁盘文件中加载正确的页面。如果应用程序向它的虚拟地址空间写入数据,内存管理器就把更改作为正常页面调度的一部分写会到文件中。

(4).分散/集中I/O

分散/集中I/O是一种特殊类型的高性能I/O,可通过win32ReadFileScatterWriteFileGather函数来实现。这些函数允许应用程序执行一个读取或写入操作,从虚拟内存重的多个缓冲区读取数据并写到磁盘上文件的一个连续区域里。要使用分散/集中I/O,文件必须以非高速缓存I/O方式打开,所使用的用户缓冲区必须是页对齐的,并且I/O必须被异步执行。

3. 结束语

本文对windows I/O过程进行了较为详细的概括,虽然具体到每一个I/O请求处理策略会各有不同,但总的来说,涉及到的操作对象和数据结构就是前面提到的那些。而且总的处理脉络仍然是:I/O请求先陷入到系统核心,从上依层次向下将指令传到设备,执行结果依次向上返回到调用进程,切换回用户态。

 

 

 

0 0