Video Miniport Driver
显示驱动程序被分成Display驱动和Video Miniport驱动(下面将它们简称为display和miniport),它们之间的关序如上图所示。每个video miniport为display提供硬件级支持,display可以通过Graphics engine提供的EngDeviceIoControl函数向下面的miniport发出请求。
Display和miniport都可以直接操作显卡硬件,它们之间只是分工不同。通常处理那些实时性要求较高的操作,比如应用程序发出的画线、位图拷贝等图形操作。Miniport则处理那些不经常发生的或者完全实时的操作。完全实时表示这些操作不会被中断或其他进程抢先。另外display不能处理设备中断,并且它还需要miniport将显卡上的寄存器(显存和控制寄存器)映射到display的虚拟地址空间中。
除了DriverEntry之外miniport还应该实现其他的接口函数。这些函数被分成:必须实现、在某种前提条件必须实现、以及选择实现,下面是这些函数的简单描述。
必须实现的函数:
l DriverEntry:初始化video miniport driver。
l HwVidFindAdapter:获取设备访问的地址范围。如果有需要可以检测设备类型。
l HwVidGetPowerState:查询设备是否支持所请求的电源状态。
l HwVidGetVideoChildDescriptor:枚举挂接在该显卡上的子设备,比如电视接收器等等。
l HwVidInitialize:初始化设备。
l HwVidSetPowerState:为指定的设备设置电源状态。
l HwVidStartIO:处理特定的VRP。
在某种前提条件必须实现的函数(是否实现这些函数依赖于显卡的特性以及驱动程序的设计):
l HwVidInterrupt:如果显卡会产生中断,你应该实现这个函数来处理中断。
l HwVidResetHw:将显卡重新设置成字符模式。
l HwVidSynchronizeExecutionCallback:用来同步访问共享数据,类似Win32下的临界区,避免被中断处理程序抢先。如果miniport中的其他函数需要和HwVidInterrupt函数共享设备状态时就需要实现这个函数。
选择实现的函数:
l HwVidLegacyResources:返回一份资源清单,这些资源没有在设备的PCI配置空间给出。
l HwVidQueryDeviceCallback和HwVidQueryNamedValueCallback:处理存储在注册表中的配置信息。
l HwVidQueryInterface:返回miniport实现的函数,以便其他驱动程序访问显卡上的子设备。
l HwVidTimer:当计时器被启动后,每一秒钟系统每秒钟会调用这个函数一次。
l SvgaHwIoPortXxx:在x86机器上,DOS全屏幕程序可以通过它们访问I/O port。