缓冲的I/O与直接I/O
在驱动程序创建了一个设备对象后,可以通过设置该设备对象(DeviceObject)的Flags域的值,通过该值可以将设备设置成缓冲的I/O或直接的I/O。
如果该值被设为DO_BUFFERED_IO,每当I/O管理器收到一个读写请求,就在内存的非分页区分配一块与用户区大小相同的区域,并将首指针存放于Irp对象的AssociatedIrp.SystemBuffer中,驱动程序就通过这个缓冲区与用户交换数据。每当一个读请求被完成时I/O管理器自动将该缓冲区中的内容复制到用户区,并释放该区域。
如果用户区大于一页(在80x86上为4096字节),一般将该值设为DO_DIRECT_IO。这时每当I/O管理器收到一个读写请求,先锁定用户区的物理内存,然后为其创建一个内存描述表(MDL),并将该表的首指针存放于Irp对象的MdlAddress中,驱动程序可以通过调用MmGetSystemAddressForMdl获得用户区在系统空间中的地址。每当一个读请求被完成时I/O管理器自动将该区域解锁。
定时
为了防止当设备出现某种故障时导致读写请求超时,或需要定时轮询某些设备的状态,驱动程序需要设置一些定时器。驱动程序中有两种方法可以设置定时器。一种是调用IoInitializeTimer将一个定时器过程IoTimer与一个设备对象联系起来。在调用IoStartTimer后,系统将每一秒钟调用一次IoTimer,直至驱动程序调用IoStopTimer。如果需要设置更小间隔的定时器,需要用到被称为CustomTimerDpc的一种推迟过程调用机制。它可以设置系统每隔一定时间将一个设置好的DPC对象放到DPC队列的末尾,执行一个指定的定时器Dpc过程。这个时间间隔可以精确到100ns。
I/O请求包(IRP)
I/O管理器每收到一个来自用户的请求就创建一个该结构,并将其作为参数传给驱动程序的DispatchXxx、StartIo过程。该结构中存放有请求的类型,用户缓冲区的首地址,用户请求数据的长度等信息。驱动程序处理完这个请求后,也在该结构中添入处理结果的有关信息,调IoCompleteRequest将其返回给I/O管理器,用户程序的请求随即返回。
DPC
当驱动程序中要用到Dpc过程时,需要创建该对象。
驱动程序对象(DriverObject)
该对象在驱动程序被启动时由I/O管理器创建(IoCreateDevice),保存有该程序处理各种请求的过程入口、该程序所驱动的全部设备对象的链表等。
设备对象(DeviceObject)
每发现一个可以驱动的设备,驱动程序调用IoCreateDevice创建一个该对象。该对象有一个指针DeviceExtension指向一块由驱动程序定义的结构,其中保存有关此设备的如端口号,中断向量等全部信息。
中断对象(Interrupt)
该对象在驱动程序调用IoConnectInterrupt时创建,存有中断及处理的过程的信息。
当一个中断发生时,I/O管理器用它寻找对应的处理过程。
推迟过程调用(Deferred Procedure Call)
由于中断处理过程运行于较高的DIRQL级,它们能屏蔽许多级别小于或等于它们的过程的执行,如果它们占用CPU时间过长,很容易使系统性能下降。因此中断处理过程应将一些不是很紧急的任务放在被称为Dpc的过程中,在完成数据传输等紧急任务后将一个DPC对象放在系统DPC队列的末尾,然后退出,尽量早地让出CPU。系统将在完成所有DIRQL级的任务后处理DPC队列,在DISPATCH_LEVEL执行每一个DPC 对象指定的Dpc过程,完成中处理断过程未尽的任务。
USB术语介绍
usb
通用串行总线(Universal Serial Bus)是由Intel Compag Mirosoft等公司在1994年开始制定的,1996年发布了USB1.0的规范。1999年发布了USB2.0的规范。USB提出的目的是提供一种新的具有高速、低耗、即插即用(Plug&Play)、使用方便的串行总线接口。
端点
USB设备在主机看来是一个个端点的集合。主机只能通过端点与设备进行通讯,以使用设备的功能。每个端点可以理解为一个一定大小的数据缓冲区,这些端点在设备出厂时就已经定义耗。在USB系统中,每个端点都有唯一的一个地址,这是由设备地址和端点号决定的。每个端点都有一定的特性,包括:传输方式、总线访问频率、带宽、端点号、数据包的最大容量等。端点必须在设备配置后才能生效(端点0除外)。
管道
驱动程序的一个数据缓冲区与一个外设端点的连接,它代表了一种在两者之间进行数据移动的能力。一旦设备被配置好,管道就存在了。管道有2种类型,数据流管道(其中的数据没有USB定义的结构)与消息管道(其中的数据遵循USB定义的结构)。管道是一个逻辑上的概念。
总线枚举
USB设备可以即插即用,但是在可以使用之前必须进行配置。一旦设备连接到USB节点上,USB就产生一系列的操作,来完成对设备的配置,这种操作被称为总线枚举过程。
本文围绕驱动程序展开,介绍了缓冲的I/O与直接I/O的设置及数据交换方式,还提及驱动程序设置定时器的两种方法。同时阐述了I/O请求包、DPC、驱动程序对象、设备对象、中断对象等的创建及作用,以及推迟过程调用机制以提升系统性能。
1186

被折叠的 条评论
为什么被折叠?



