操作系统 图形窗口 子系统

来源:互联网 发布:在线排课软件 编辑:程序博客网 时间:2024/06/05 15:52
Windows 子系统

按照Windows NT 最初的设计,它支持三个环境子系统:OS/2、POSIX 和Windows(或称为Win32)。然而,Windows 子系统是必须要运行的,没有它Windows 系统无法运行,而其他两个子系统则被配置成按需启动。而且,到了Windows XP以后,只有Windows子系统随Windows 系统一起发行。这一节将介绍Windows 子系统的概况,更详细的信息,请参考9.2 节。

在Windows 平台上,可执行映像文件的格式为PE 文件格式[PE-SPEC](参见上一小节中插入的关于PE 文件格式的介绍),其头部域Subsystem 指定了该应用程序将被运行在哪个环境子系统中。Microsoft Visual Studio 的链接器(linker)支持/SUBSYSTEM 命令选项,由它来指定子系统的类型。例如,该域为2 说明这是一个Windows GUI 应用程序,为3则是Windows 控制台应用程序(Windows CUI)。

Windows 子系统中既有用户模式部分,也有内核模式部分。内核模式部分的核心是win32k.sys,虽然它的形式是一个驱动程序,但实际上它并不处理I/O 请求,相反,它向用户代码提供了大量的系统服务。从功能上讲,它包含两部分:窗口管理和图形设备接口(GDI)。其中窗口管理部分负责收集和分发消息,以及控制窗口显示和管理屏幕输出;图形设备接口部分包含各种形状绘制以及文本输出功能。

用户模式部分包括Windows 子系统进程(csrss.exe)以及一组动态链接库(DLL)。Csrss.exe 进程主要负责控制台窗口的功能,以及创建或删除进程和线程等。子系统DLL则被直接链接到应用程序进程中,包括kernel32.dll、user32.dll、gdi32.dll 和advapi.dll 等,负责实现已文档化的Windows API 函数。除了有些可以直接在用户模式中完成以外,很多API 函数需要调用执行体API 或win32k.sys 模块提供的系统服务。

Win32k.sys 一方面向用户代码提供系统服务,另一方面也跟Windows 内核紧密地融合在一起。它通过向内核注册一组出调(callout)函数,以便介入到内核的线程和进程管理等处理逻辑中,同时也可以接收电源事件。对于每个线程,一旦它调用了win32k.sys的任何一个系统服务,就变成了一个GUI 线程,从而纳入到了Windows 子系统的线程和进程管理范畴。Windows 内核的线程和进程数据结构为Windows 子系统预留了一些域,从而win32k.sys 可以方便地操纵它的线程和进程。

下面从窗口管理和图形设备接口两方面来介绍Windows 子系统的核心功能和结构。

窗口管理

Windows 子系统的用户界面管理有一个层次结构,通常应用程序只是在一个默认的桌面上运行。图2.5 显示了这一层次结构。每个子系统会话都有自己的会话空间,属于某一会话的资源将从该会话空间中分配。当用户登录到Windows 中时,操作系统将为该用户建立一个会话;即使用户通过远程桌面或者终端服务连接到一个系统中,系统也会为该用户建立一个单独的会话。 

在一个会话中,有一个交互式窗口站,可能还有非交互式窗口站。在交互式窗口站中通常有三个桌面:登录桌面、默认桌面和屏幕保护桌面。通常我们运行的图形界面应用程序运行在默认桌面上。交互式窗口站有独立的剪贴板、键盘、鼠标、显示器等,在它的三个桌面中,任一时刻只有一个是激活的,输入输出设备归激活的桌面所有。

在每个桌面中,都有一个顶级窗口列表,这些窗口往往可以相互重叠,有系统菜单、最大化/最小化按钮和滚动条等。通常各个图形界面应用程序的主窗口属于当前桌面的顶级窗口。在Windows 中,窗口可以有子窗口,子窗口占据父窗口的客户区域。因此,桌面上的窗口形成了一个层次结构。图2.5 仅仅显示了顶级窗口的子窗口,实际上,一个窗口总是可以构建它自己的子窗口。

Windows 为常用的窗口定义了一些窗口类(window class),因而应用程序可以非常方便地创建这些窗口类的实例。应用程序如果要定义独特的窗口特性,可以生成一个窗口类,这个窗口类既可以是全新的,也可以是在系统已有窗口类的基础上定义得到。窗口类规定了其对象将如何响应各种消息,包括系统发送给它的消息和用户触发的消息。Windows 窗口的编程模型是消息驱动的,每个窗口对象根据其窗口类指定的窗口过程来响应各种消息。

Windows 子系统会话有一个RIT(Raw Input Thread)线程,负责从输入设备读取原始的输入事件,然后生成消息,寄送到正确的线程消息队列中。每个包含用户界面元素的线程都应该及时地处理这些消息。通常的做法是在一个消息循环中,不停地获取消息,再分发给目标窗口,由目标窗口的窗口过程来响应。有关Windows 子系统中的窗口管理和消息机制的更多信息,请参考9.2.3 节。

图形设备接口

Windows 的图形引擎也是在Windows 子系统中提供的,它有两方面的特点:首先,它提供了一套与设备无关的编程接口,即GDI,这使得应用程序可以适应各种底层显示设备的差异;其次,应用程序与图形设备驱动程序之间的通信足够高效,从而即使在频繁输出和刷新图形元素的情况下,Windows 也能够为用户提供良好的视觉效果。

在技术上,Windows 子系统定义了一个稳定的图形体系结构,以便于第三方的图形设备硬件厂商可以方便地将他们的视频显示器和打印设备集成到Windows中。如图2.6 所示,win32k.sys 通过DDI(显示设备驱动程序接口)与显示驱动程序打交道,而显示驱动程序通过ENG(图形引擎接口)调用win32k.sys 中图形引擎的功能。

 图2.6 Windows 子系统的图形模块结构

Win32k.sys 的图形引擎实现了基于标准格式位图的图形绘制功能。显示驱动程序在初始化时向图形引擎报告它所支持的物理设备的特征描述。显示驱动程序既可以自己管理图形表面(surface),也可以直接使用图形引擎管理的图形表面。另外,显示驱动程序可以有选择地截取GDI 的图形绘制操作,也可以将图形绘制操作转交给图形引擎。因此,显示驱动程序在实现功能方面有很大的灵活性。

如图2.6 所示,显示驱动程序可以帮助图形引擎实现针对特定视频适配器的图形功能,视频小端口驱动程序更是针对视频适配器的硬件特性。两者的分工原则是:显示驱动程序执行一些对用户可见并且性能紧急的图形操作,譬如,它可以直接访问适配器的视频存储区或者寄存器;而视频小端口驱动程序执行一些不常见的图形操作,或者一些不能被中断打断或其他进程抢占的关键图形操作。

视频端口驱动程序由Windows 操作系统提供,它实际上是一个动态链接库,用于帮助视频小端口驱动程序实现一些公共的、与图形处理有关的功能,以及为小端口驱动程序提供一个与系统内核和执行体打交道的环境。视频小端口驱动程序则负责直接的硬件资源管理和控制。

Windows 子系统的图形系统,除了支持GDI,还提供了对DirectX 的显示支持,包括DirectDraw 和Direct3D,因而允许像游戏、多媒体播放器等应用软件绕过GDI 图形引擎,直接操纵显示器硬件,从而获得更快的显示速度,并且避免屏幕抖动。

有关Windows 子系统图形功能部分的详细信息,请参考9.2.4 节关于Windows 显示驱动程序模型的描述,以及9.2.5 节关于Windows Vista 以后变化情况的简单介绍。