QXL安照windows2000显示架构编写,见下图:
QXL实现的功能主要包含两块:Display Driver 和 Video Miniport。
1. Display Driver
Display Driver以动态链接库qxldd.dll的形式提供,处于内核态,主要是提供绘图API给GDI,这样当最上层的应用需要绘图的时候,通过调用GDI API(gdi32.dll),GDI 调用QXL的绘图API(qxldd.dll)达到绘图目的。
GDI与QXL建立这种关系是在GDI初始化的时候,示例如下:
1)QXL Display Driver实现了DrvEnableDriver,DrvEnableDriver是任何显卡驱动的入口点,在GDI初始化的时候会调用该API:
BOOL DrvEnableDriver(ULONG engine_version, ULONG enable_data_size, PDRVENABLEDATA enable_data) |
2)Display Driver在enable_data 里返回了drv_calls[],drv_calls[]包含了一系列的绘图API的函数指针,这样在GDI需要绘制各类图形和文字的时候就可以调用相应的API了:DrvCopyBits,DrvTextOut,DrvStrokePath,DrvFillPath 。。。
2. Video Miniport
处于内核模式(miniport->qxl.sys)通常处理必须和内核组件交互的操作。它的责任包括资源管理,例如硬件配置、物理设备内存映射。Miniportdriver必须针对video硬件。它要管理和displaydriver共享的资源(内存资源)
它还要处理:显卡的模式设置交换,多种硬件类型,减少displaydriver的硬件依赖,把video寄存器映射到displaydirver的地址空间。I/O端口可以直接访问
1)QXL miniport driver的入口跟所有其他驱动一样,都是 DriverEntry; 它是在装载时被I/O Manager(设备管理器)调用的;
2)DriverEntry主要做的是调用VideoPortInitialize完成初始化,而VideoPortInitialize最主要的是设置了HwFindAdapter,HwInitialize,HwStartIO等函数指针