Windows 编程/Windows 系统架构
Windows 最初是由微软开发的,是一个用于 MS-DOS 的 16 位图形层。随着它的发展,它获得了处理 32 位程序的能力,最终在 Windows NT 和 2000 发布时完全变成了 32 位。在 Windows 95 之后,微软开始移除对 DOS 的依赖,最终在 Windows 2000 中完全实现了分离。Windows 拥有许多高级功能,但也存在许多特定于平台的问题。它拥有一个应用程序编程接口,包含数千个大部分未记录的 GUI 函数,并且具有不同程度的 MS-DOS 兼容性。此外,随着 NT(新技术)的出现,Windows 完全依赖于 NT 内核而不是它的 MS-DOS 子系统,NT 内核能够模拟必要的 DOS 功能。除了 NT 内核之外,微软还引入了许多 API 包装器,例如 MFC(微软基础类)、COM(组件对象模型)和 .NET 技术。
Windows 上最流行的语言包括 Visual Basic/VB6 和 C/C++,尽管 C++ 正在迅速被 .NET 平台取代,特别是 C#(C Sharp)。
Windows 1.0、2.0 和 3.11 被认为是较旧一代的 Windows 系统,它们被构建为在 MS-DOS 操作系统之上提供一个简单的图形层。Windows 95、Windows 98 和 Windows ME 被设计为绕过 MS-DOS(尽管 DOS 仍然存在),它们都基于相同的代码结构,称为“9x 内核”。Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7 和 Windows Server 都基于一组称为“NT 内核”的代码。
今天我们开始一个新的系列文章,重点关注了解 Windows 系统架构本身。在我们的第一篇文章中,我们将快速回顾一些基本的 Windows 概念和术语,包括对 Windows API 的简要概述、服务以及进程和线程之间的区别。可以将此视为为我们未来的文章打下基础,这些文章将涵盖注册表、会话空间和桌面堆等主题。因此,事不宜迟,让我们从介绍 Windows API 开始。
Windows NT 内核被分成几个部分,这里我们将简要讨论 Windows 操作系统的组成。最基本的是文件 NTOSKRNL.EXE,它是 Windows 操作系统的内核,也是您计算机上最重要的文件。如果您有兴趣自己查看它,您可以在您自己的 Windows NT 机器上的 C:\Windows\System32 文件夹(也可以使用以下路径 %systemroot%\system32)中找到它。
NTOSKRNL.EXE 提供了 Windows 的一些基本功能,但仅靠一个文件无法让整个系统正常工作。NTOSKRNL 严重依赖于一个称为 HAL.DLL 的 **动态链接库 (DLL)**。HAL 代表“硬件抽象层”,它是允许低级机制(如中断和 BIOS 通信)独立处理的代码部分。
如果我们将 Windows 架构视为分层架构,NTOSKRNL.EXE 和 HAL.DLL 位于最底层,下一层向上包含两个重要的文件,NTDLL.DLL 和 WIN32K.SYS。NTDLL 包含许多用户模式函数,如系统调用存根和运行时库 (RTL) 代码,统称为(大部分未记录的)“本机 API”。大部分运行时库代码在 NTOSKRNL 和 NTDLL 之间共享。WIN32K.SYS 是一个内核模式驱动程序,它实现窗口和图形,允许创建用户界面。
下一层向上包含许多我们主要感兴趣的库。这一层构成了所谓的 **Win32 API**,它包含了用户在 Windows 中编程所需的(几乎)所有函数。Win32 API 分为 4 个组成部分,每个部分都是一个 .DLL
- kernel32.DLL
- 它包含大多数与系统相关的 Win32 API 函数。大多数这些函数只是围绕底层 NTDLL 函数的包装器,但一些功能(如国家语言支持 (NLS) 和控制台处理)在 NTDLL 中不可用。
- advapi32.DLL
- 它包含其他与系统相关的函数,如注册表和服务处理。
- gdi32.DLL
- 它包含许多用于绘图的基本函数。这些函数都比较简单,允许用户在屏幕上绘制形状(圆形、矩形等)、显示和操作位图等。
- user32.DLL
- 它包含许多实现 Windows 熟悉的用户界面的函数。程序、消息框、提示等都使用 User32 函数实现。User32 通过调用由 WIN32K.SYS 实现的系统调用来执行其任务。
除了 Win32 API 中的 4 个主要库之外,还有许多其他重要的库,Windows 程序员应该熟悉它们
- MSVCRT.DLL
- MSVCRT.DLL 是一个动态链接库,它包含 C 程序员应该熟悉的 C 标准库 (**stdlib**) 函数的实现。这些函数是在常见的头文件 stdio.h、string.h、stdlib.h 等中定义的。
- WS2_32.DLL
- 这是 Winsock2 库,它包含用于在互联网上进行通信的标准伯克利套接字 API。我们将在本书的后面部分讨论 winsock 编程。
Windows 系统,对于一些人来说可能令人惊讶的是,是一个非常主动的系统。对于那些刚开始使用标准库进行 C 编程的人来说,这不是一个熟悉的概念。在正常的软件项目中,通常会有一个 main 函数,而 main 函数又会调用项目中定义的其他函数。在 Windows 函数中,程序员通常会向系统提供函数指针,而 Windows 会调用 *进入您的程序*。此外,在 Windows 程序中,当没有事情要做时,您的代码会处于空闲状态。使用 **消息循环架构**,Windows 会在需要处理事件时向您的程序发送消息,程序会响应这些消息。如果程序没有响应,则会忽略该消息。
对于每个程序,Windows 会设置一个消息队列结构来处理消息传输过程。Windows 会维护一个所有程序使用的对象和系统资源的列表,并为每个资源分配一个 **句柄**。这些句柄本身没有用,但可以传递给系统来引用特定的对象和资源。