流微型驱动开发指南

上传人:s9****2 文档编号:562387620 上传时间:2023-03-06 格式:DOCX 页数:12 大小:76.73KB
返回 下载 相关 举报
流微型驱动开发指南_第1页
第1页 / 共12页
流微型驱动开发指南_第2页
第2页 / 共12页
流微型驱动开发指南_第3页
第3页 / 共12页
流微型驱动开发指南_第4页
第4页 / 共12页
流微型驱动开发指南_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《流微型驱动开发指南》由会员分享,可在线阅读,更多相关《流微型驱动开发指南(12页珍藏版)》请在金锄头文库上搜索。

1、流微型驱动开发指南注意:本节详述了已经过时的 Stream.sys 类驱动。随着 Microsoft Windows XP 的正式发布, Microsoft建议硬件制造商考虑使用下一代Class模型AVStream来开发新的,非音频多媒体驱动程序。相关细节可参看AVStream Overview一章。Microsoft现在只对Stream.sys 提供基本的支持。如果你要开发一个音频Minidriver,请参看Audio Miniport Drivers一章。很多种设备都通过提供流式Minidriver来得到(操作系统的)支持。尤其是视频捕捉设备, 譬如数码相机和DVD播放机,它们都是通过提供

2、流式Mini driver来获得支持的,类似的还有外 部音频设备。更多介绍可参考Video Capture Mi nidriver Design Guide和Ven dor-Supplied DVD Drivers。流 Minidriver 支持内核流。在此我假定本文的读者已经熟悉了内核流的相关基本概念。如果 你不明白,请先阅读Kernel Stream ing Overview设计 Stream Class Driver 的目的,就是通过处理许多和操作系统进行交互的细节,来使流 式设备驱动的开发更加简单。Minidriver 让 Stream Class Driver代表它处理同步问题。举个

3、例子,Stream Class Driver可 以为Minidriver随意地串行化I/O请求。通过让Class Driver为它处理同步问题,Minidriver可 以做到多处理器平台安全,但是代码却是不可重入的。这样很适合后端(low-e nd)到中端(medium-e nd)的硬件。Class Driver会自动对文件操作进行同步。例如,通过互斥体(Mutex)、信号量(Semaphores) 或者事件(Eve nt),打开流和打开设备的操作可以被正确地串行化,无需Mi ni driver的参与。Class Driver从Minidriver中抽象了内核流的具体实现细节。Class Dr

4、iver 处理所有和 PnP 管理器之间的交互动作。例如:Class Driver 代表 Minidriver 创建功能性设备对象( Functional device object)。Class Driver管理资源设置(如翻译端口地址,翻译并映射内存范围,连接中断)Class Driver 处理 PnP IRP 包。比如 IRP_MN_START_DEVICE, or IRP_MN_STOP_DEVICE。所有的低级缓冲区管理也是由Class Driver完成的。如果必要的话,分配DMA适配器对象。映射缓冲区,并为DMA创建scatter/gather列表。为DMA和PIO正确锁定并回写(

5、Locking and flushing)缓冲区所有的IO控制码的正确性验证也是由Class Driver完成的。Class Driver 通过看门狗定时器为所有的请求打上时间戳。Minidriver自己并不创建设备对象,它在必要的时候可以分享Class Driver的设备对象。这 样可以节约对系统资源占用。每个适配器只创建一个设备对象。而适配器所支持的MulitipleSubDevice(称为流,Stream) 则用 WDM Streaming Pins 来描述。一、Class Driver 和 Minidriver 的定义Class Driver是由微软提供的一种中间驱动(或称媒介驱动),

6、用来在硬件厂商提供的 Minidriver和操作系统之间提供一个简单的接口。Minidriver是一个硬件相关的DLL,它通过函 数调用的方式,使用微软提供的Class Driver来完成大部分动作,它只提供和设备紧密相关的控 制。在WDM模型中,Minidriver向Class Driver注册所有和它相关联的硬件适配器(Hardware Adapter),然后Class Driver会创建一个文件对象(File Object)来描述向它注册的每个适配器。 Minidriver使用Class Driver的设备对象(Device Object)来进行系统调用。用户态的客户代码 可通过 WDM

7、 流(WDM Streaming)访问 Class DriveroClass Driver 和 Minidriver 之间的交互包括: Mini driver并不创建它自己的设备对象(Device Object),而是在必要的时候共享Class Driver 的设备对象,这样可以节约系统资源。每个适配器(Adapter)只能创建一个设备对象。而适配器所支持的MulitipleSubDevice (称为流,Stream)则用 WDM Streaming Pins 来描述。二、Stream Class和 Minidriver之间的接口流类接口( Stream Class In terface)主要

8、由介于Class Driver和Mi nidriver之间的一系列的 函数调用组成。Class Driver对请求的流程(Request Flow)进行控制,当有必要对适配器硬件 进行存取时,它就调用适配器的Minidriver。Class Driver还负责对多处理器和中断同步作出响应。 当 Class Driver 和 Minidriver 都初始化完毕之后, Minidriver 将处于一个被动的地位,它只能被 Class Driver所调用,而绝大多数的调用都是非常低级的服务请求。对Mi nidriver来说,对命令和信息(Comma nds and In formation )进行控

9、制的最基本的机 制就是流请求块(Streaming Request Block)o每个Minidriver都有一系列的SRB来对其某个 特定的功能进行访问,而且一般说来,设备所支持的每种数据流都有相应的SRB与之对应。这 些信息(SRB)通过操作系统控制的DMA缓冲区(它是一个环形队列)传递给设备。一个SRB由一个命令码字段,以及与该命令码相关联的其他数据所组成。结构体 HW_STREAM_REQUEST_BLOCK包含了和特定的SRB相关的所有信息。我们常常把这个结构体 就简称为SRB,它体内还包含了一些作为对命令码的补充信息的其他参数。结构体 HW_STREAM_REQUEST_BLOCK

10、 的定义如下:typedefstruct _HW_STREAM_REQUEST_BLOCKULONGSizeOfThisPacket;SRB_COMMANDCommand;NTSTATUSStatus;PHW_STREAM_OBJECTStreamObject;PVOIDHwDeviceExtension;PVOIDSRBExtension;union _CommandDataPKSSTREAM_HEADERDataBufferArray;PHW_STREAM_DESCRIPTORStreamBuffer;KSSTATEStreamState;PSTREAM_PROPERTY_DESCRIPT

11、ORPropertyInfo;PKSDATAFORMATOpenFormat;struct _PORT_CONFIGURATION_INFORMATION * ConfigInfo;HANDLEMasterClockHandle;DEVICE_POWER_STATEDeviceState;PSTREAM_DATA_INTERSECT_INFOIntersectInfo; CommandData;ULONGNumberOfBuffers;ULONGTimeoutCounter;ULONGTimeoutOriginal;struct _HW_STREAM_REQUEST_BLOCK*NextSRB

12、;PIRPIrp;ULONGFlags;PVOIDHwInstanceExtension;unionULONG NumberOfBytesToTransfer;ULONG ActualBytesTransferred;ULONGNumberOfPhysicalPages;ULONGReserved2; HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;关于对以上其他参数的解释,参见 DDK 文档,这里不再赘述。下图解释了流类(Stream Class)和Minidriver在初始化时所进行的交互动作。初始化适配器所有的流式 Minidrive

13、r 函数并不一定非要和 Minidriver 的中断服务例程( Interrupt Service Routine, ISR)同步,因而Minidriver的代码是不可重入的(Non-re-entrant,相应的概念叫做 可重入代码,又叫做纯代码。关于可重入代码的概念,请参考西电版操作系统教材),亦即,当 Minidriver正在执行一个线程的时候,不能再调用Minidriver内其他任何函数,包括中断服务例 程在内。这种非可重入的特性即便在支持多处理器的Windows NT/2000系统下也是存在的,这 样可以令Minidriver编写起来更加方便。为了达到这样的特性,流类驱动(Stream

14、 Class Driver) 会在 Minidriver 体内任何例程被执行时,通过内核例程 KeSynchronizeExecution 屏蔽 Streaming Minidriver的中断请求IRQ (和所有低优先级的IRQ)。如果想了解更多关于同步的信息,请参 看MiniDriver同步一章。Streaming Minidriver可以在必要的时候调用WDM系统服务。但是, Minidriver 自己并没有设备对象,他是利用 ClassDriver 的设备对象来完成系统调用的。绝大多数 Minidriver是不需要进行WDM系统调用的,因为几乎所有必要的功能都已经被Class Drive

15、r所 涵盖了,没有必要直接进行系统调用。必须知道的是,当进行WDM系统服务调用时,所有的Mini driver的入口点都会在高于 DISPATCH_LEVEL的中断优先级下被调用(注意不包括DISPATCH_LEVEL中断优先级)。但有 一个例外,那就是 StreamClassCallAtNewPriority 例程,此函数允许在 DISPATCH_LEVEL或 PASSIVE_LEVEL 中断优先级上进行系统服务调用,具体哪个优先级取决于调用时所指定 的优先级别。如果要一劳永逸地修改这个对IRQL的调用限制,可以通过把 HW_INITIALIZATION_DATA 结构体中的 BOOL 型成员变量 TurnOffSynchronization 简单置为 TRUE 来实现之。MlnidrivujrStream ClassDrhrer Entry(TM PVQ畑山肿厶 IN PVDIP电阳响闵HW_IKlTAUZAn0N_DATAIII StreamClass-R cgi sterM I n Drl-ver()1. PnP-Y1.45il.KT(. :. . ; hlir-zldrivcrOnvefErrtrv1.2.Minidrwef :rfW INTn

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号