流Mini驱动开发指南(选自DDK联机文档)
——翻译:codewarrior@HS5
本节详细讨论了已经过时的Stream.sys Class Driver。随着Microsoft Windows XP的正式发布,Microsoft建议硬件制造商考虑使用下一代Class模型——AVStream——来开发新的,非音频多媒体驱动程序。相关细节可参看《AVStream Overview》一章。Microsoft现在只对Stream.sys提供基本的支持。如果你要开发一个音频Minidriver,请参看《Audio Miniport Drivers》一章。
很多种设备都通过提供流式Minidriver来得到(操作系统的)支持。尤其是视频捕捉设备,譬如数码相机和DVD播放机,它们都是通过提供流式Minidriver来获得支持的,类似的还有外部音频设备。更多介绍可参考《Video Capture Minidriver Design Guide》和《Vendor-Supplied DVD Drivers》。
流Minidriver支持内核流。在此我假定本文的读者已经熟悉了内核流的相关基本概念。如果你不明白,请先阅读《Kernel Streaming Overview》
设计Stream Class Driver的目的,就是通过处理许多和操作系统进行交互的细节,来使流式设备驱动的开发更加简单。
Minidriver让Stream Class Driver代表它处理同步问题。举个例子,Stream Class Driver可以为Minidriver随意地串行化I/O请求。通过让Class Driver为它处理同步问题,Minidriver可以做到多处理器平台安全,但是代码却是不可重入的。这样很适合后端(low-end)到中端(medium-end)的硬件。
Class Driver会自动对文件操作进行同步。例如,通过互斥体(Mutex)、信号量(Semaphores)或者事件(Event),打开流和打开设备的操作可以被正确地串行化,无需Minidriver的参与。
Class Driver从Minidriver中抽象了内核流的具体实现细节。
Class Driver处理所有和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正确锁定并回写(Locking and flushing)缓冲区
所有的IO控制码的正确性验证也是由Class Driver完成的。
Class Driver通过看门狗定时器为所有的请求打上时间戳。
Minidriver自己并不创建设备对象,它在必要的时候可以分享Class Driver的设备对象。这样可以节约对系统资源占用。
每个适配器只创建一个设备对象。而适配器所支持的Mulitiple SubDevice(称为流,Stream)则用WDM Streaming Pins来描述。
一、Class Driver 和 Minidriver 的定义
Class Driver是由微软提供的一种中间驱动(或称媒介驱动),用来在硬件厂商提供的Minidriver和操作系统之间提供一个简单的接口。Minidriver是一个硬件相关的DLL,它通过函数调用的方式,使用微软提供的Class Driver来完成大部分动作,它只提供和设备紧密相关的控制。
在WDM模型中,Minidriver向Class Driver注册所有和它相关联的硬件适配器(Hardware Adapter),然后Class Driver会创建一个文件对象(File Object)来描述向它注册的每个适配器。Minidriver使用Class Driver的设备对象(Device Object)来进行系统调用。用户态的客户代码可通过WDM流(WDM Streaming)访问Class Driver。
Class Driver和Minidriver之间的交互包括:
· Minidriver并不创建它自己的设备对象(Device Object),而是在必要的时候共享Class Driver的设备对象,这样可以节约系统资源。
· 每个适配器(Adapter)只能创建一个设备对象。而适配器所支持的Mulitiple SubDevice(称为流,Stream)则用WDM Streaming Pins来描述。