前言
本章将介绍Microsoft Windows操作系统的关键概念和术语,比如:
- Windows API、
- 进程、
- 线程、
- 虚拟内存、
- 内核模式和用户模式、
- 对象、
- 句柄、
- 安全性
- 注册表等。
这些概念和术语将贯穿全书。
同时也会介绍一些可用来探查Windows内部的工具,比如:
- 内核调试器
- 性能监视器,
- 以及来自Windows Sysinternals 的一些关键工具。
此外,还将说明如何以WDK (Windows Driver Kit)
和SDK (Platform Software Development Kit)
作为资源,来找到关于Windows内部机理的进一步信息。
请一定要理解本章中讲述的所有内容,本书其余章节将以此为基础。
1.1 Windows操作系统的版本
(这个列表会持续更新)
可参考:
产品名称 | 内部版本号 | 发布日期 |
Windows NT 3.1 | 3.1 | 1993.7 |
Windows NT 3.5 | 3.5 | 1994.9 |
Windows NT 3.51 | 3.51 | 1995.5 |
Windows NT 4.0 | 4.0 | 1996.7 |
Windows 2000 | 5.0 | 1999.7 |
Windows XP | 5.1 | 2001.12 |
Windows Server 2003 | 5.2 | 2003.3 |
Windows Vista | 6.0 | 2007.1 |
Windows Server 2008 | 6.0 | 2008.3 |
Windows 7 | 6.1 (编译版本7600) | 2009.10 |
Windows 7 SP1 | 6.1.7601 (编译版本7601) | |
Windows Server 2008 R2 | 6.1(编译版本7600) | 2009.10 |
Windows 8 | 6.2.9200 | |
Windows Server 2012 R2 | 6.3 | |
Windows 8.1 | 6.3.9200 | |
Windows 8.1(Update1) | 6.3.9600 | |
Windows Server 2016 | 10.0* | |
Windows Server 2019 | 10.0* | |
Windows 10 | 10.0.10240 | |
Windows Server 2022 | 10.0* | |
Windows 10(1511) | 10.0.10586 | |
Windows 10(1607) | 10.0.14393 | |
Windows 10(1703) | 10.0.15063 | |
Windows 10(1709) | 10.0.16299 | |
Windows 10(1803) | 10.0.17134 | |
Windows 10(1809) | 10.0.17763 | |
Windows 10(1903) | 10.0.18362 |
注“Windows 7”这一产品名称中的“7”并非指内部版本号,而是Windows家族的世代编号。实际上,为了使应用兼容性问题尽可能小,Windows 7的版本号其实是6.1,如表1.1所示。这使得那些检查大版本号的应用程序在Windows 7上可以像在Windows Vista上那样继续执行。事实上,Windows 7和Server 2008 R2有同样的版本号和编译版本,因为它们是从同样的Windows代码基编译而来。
1.2 基础概念和术语
Windows API
Windows应用编程接口(API)是针对Windows操作系统家族的用户模式系统编程接口。在64位版本的Windows推广以前,32位版本Windows操作系统的编程接口被称为Win32 API
,以区别于原来的16位版本Windows的编程接口,即16位WindowsAPI。
术语WindowsAPI兼指Windows的32位和64位编程接口。
Windows API 常用的又分为几个大类:
- 基本服务
- 组件服务司
- 用户界面服务
- 图形和多媒体服务
- 消息和协作
- 网络
- Web服务
关于 .Net
Microsoft.NET框架组成:
- 框架类库(FCL,Framework Class Library)的类库
- 提供了托管代码执行环境的公共语言运行库(CLR,Common Language Runtime)
托管代码执行环境包含一些特性:
- 即时编译
- 类型检验
- 垃圾回收 GCC
- 代码访问安全性等。
由于CLR具有这些特性,因此它所提供的开发环境能够提高开发人员的生产效率,减少常见的编程错误。
.NET框架的组件之间的关系
Win32 API 历史
第一次使用:microsoft Windows 3.0
起因:成为Windows NT启动之初,替代32位 OS/2 Presentation Manager API.
服务、函数、例程
windows 特定的术语的含义:
Windows API函数
指Windows API中已被文档化的、可被调用的子例程。
例如CreateProcess、CreateFile和GetMessage。原生的系统服务(或者系统调用)
指操作系统中未文档化的、可在用户模式下调用的底层服务。
例如,NtCreateUserProcess是一个内部系统服务,Windows的CreateProcessi函数调用该服务来创建新的进程。有关系统调用的定义,参见第3章“系统机制”的“系统服务分发”一节。内核支持函数(或例程)
指位于Windows:操作系统内部且只能在内核模式下调用的子例程(关于内核模式,本章后文将给出定义)。
例如,ExAllocatePoolWith Tag就是个这样的例程,设备驱动程序调用该例程可以向Windows系统堆(称为内存池)申请内存。Windows服务
指由Windows服务控制管理器启动的进程。
例如,Task Scheduler服务运行在用户模式进程中,它支持at命令(类似于UNIX命令at或cron)。(注意,虽然注册表将Windows设备驱动程序定义为“服务”,但是,在本书中不这样使用。)DLL(动态链接库)
指一组可调用的子例程,合起来被链接成一个二进制文件,使用这些子例程的应用程序可以动态地加载此二进制文件。
例如Msvcrt.dll(C运行库)和Kernel32.dl(一个Windows API子系统库)。Windowsl的用户模式组件和应用程序大量使用了DLL.
DLL比静态库的优势在于,应用程序可以共享DLL,Windows保证在内存中只有一份DLL代码,供所有引用该DLL的应用程序共享。注意,非可执行的NET程序集也被编译成DLL,但是,它们没有导出任何子例程,而是由CLR解析出编译的元数据,以便访问对应的数据类型和成员。
进程、线程和作业
进程
程序是指一个静态的指令序列,
进程是一个容器,其中包含了执行程序的特定实例时所用到的各种资源。
Windows进程是由以下元素构成的:
私有的虚拟地址空间
,这是指该进程可以使用的一组虚拟内存地址。可执行的程序
,它定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中已打开句柄的列表,这些句柄指向各种系统资源,比如信号量、通信端口和文件,该进程内所有的线程都可以访问这些系统资源。被称为访问令牌的安全环境
,它标识了与该进程关联的用户、安全组、特权、UAC
(User Account Control,用户账户控制)虚拟化状态、会话,以及有限的用户账户状态。被称为进程ID的唯一标识符
(在内部,进程ID还是标识符客户ID的一部分)。至少一个执行线程
(尽管“空”进程也是有可能的,但没有用处)。
tlist /t 查看进程树
tlisk.exe 位于 C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\tlisk.exe
任务管理查看进程
Process Explorer查看进程的细节
线程
线程是一个进程内部的实体,也是Windows执行此进程时的调度实体。
如果没有线程,进程的程序将不可能运行。
线程包括以下一些最基本的部件:
- 一组代表
处理器状态
的CPU寄存器中的内容。 - 两个栈一一一个用于线程在内核模式下执行时,另一个用于线程在用户模式下执行时。
- 一个被称为
线程局部存储
(TLS,thread-local storage)的私有存储区域,各个子系统、运行库和DLL都会用到该存储区域。 - 一个被称为
线程ID
的唯一标识符(它也是内部结构客户ID〔client ID)的一部分进程D和线程D是从同一个名字空间中产生的,所以它们永远不会重叠)。 - 有时候线程也有它们自己的
安全环境
,或者令牌,多线程服务器应用程序要模仿其客户的安全环境时,常常会使用线程自己的安全环境。
易失的寄存器
、栈
和私有存储区域
合起来被称为线程的环境(context)
。因为这些信息随着Windows所在机器架构的不同而有所不同,所以,此结构必须是与底层架构相关的。
Windows的
GetThreadContexti函数
允许程序访问这一与架构相关的信息(称为CONTEXT块)。
纤程与用户模式调度器线程
出现的原因
:因为将CPU的执行从一个线程切换到另一个线程,将不可避免地涉及内核调度器,所以,这可能是一个开销昂贵的操作,如果两个线程经常频繁地来回切换则尤其如此。
Windows实现了两种机制来降低这一开销:
- 纤程(fiber)
- 用户模式调度(UMS,user-mode scheduling)。