上QQ阅读APP看书,第一时间看更新
1.5 系统总体架构
图1-8显示了Windows系统的总体架构,由用户模式和内核模式的各个组件组成。
图1-8 Windows系统体系结构
下面是图1-8中各个带名称的方框的概要描述:
- 用户进程 这是基于映像文件的普通进程,在系统中执行,例如Notepad.exe、cmd.exe、explorer.exe等实例。
- 子系统DLL 子系统DLL是实现子系统的API的动态链接库(DLL)。子系统是内核暴露出来其能力的一个确定视图。从技术上来说,从Windows 8.1开始,只存在一个子系统— Windows子系统。子系统DLL包括众所周知的文件,比如kernel32.dll、user32.dll、gdi32.dll、advapi32.dll、combase.dll等。这些DLL包含了大部分官方公开的Windows API。
- NTDLL.dll 这是一个系统范围的DLL,它实现了Windows原生API。这是用户模式代码的底层。它最重要的作用是为系统调用提供到内核模式的转换。NTDLL也实现了堆管理、映像加载以及部分用户模式线程池功能。
- 服务进程 服务进程是普通的Windows进程,它与服务控制管理器(SCM,在services.exe中实现)进行通信,并允许对它的生命周期进行一些控制。SCM能够启动、停止、暂停、恢复服务和给服务发送其他的消息。通常,服务用某个特殊的Windows账号—本地系统(local system)、网络服务(network service)或者本地服务(local service)来运行。
- 执行体 执行体(executive)位于NtOskrnl.exe(内核本身)的高层。它包含了大多数内核代码,其中大部分是各种“管理器”:对象管理器、内存管理器、I/O管理器、即插即用管理器、电源管理器、配置管理器,等等。显然,它比较低的内核层要大。
- 内核 内核层实现了最基础和最时间敏感的内核模式操作系统代码,包括线程调度、中断和异常分发,并实现了各种内核原语,比如互斥量和信号量。一些内核代码用特定CPU的机器语言编写,以达到高效和直接访问特定CPU细节的目的。
- 设备驱动程序 设备驱动程序是可装载的内核模块。其代码在内核模式运行,因此具有完全的内核能力。本书致力于某些内核驱动程序的编写。
- Win32k.sys 这是“Windows子系统的内核模式组件”。本质上它是一个内核模块(驱动程序),处理Windows的用户界面部分和经典的图形设备接口(GDI)API。这意味着所有的窗口操作(
CreateWindowEx
、GetMessage
、PostMessage
等)都由此组件处理。系统的其余部分很少甚至没有用户界面的知识。 - 硬件抽象层(HAL) HAL是接近CPU的硬件之上的一个抽象层。它使得设备驱动程序可以通过调用API来工作,而不需要知道细节和具有类似中断控制器或者DMA控制器之类的特定知识。很自然地,这一层对于编写控制硬件设备的驱动程序是非常有用的。
- 系统进程 系统进程是一个总体的说法,它用来描述那些通常“就在那里”干自己的活的进程,一般情况下不需要与这些进程直接打交道。不过它们都是很重要的,并且事实上其中一些进程对于系统的正常运行至关重要。终止其中一些进程是致命的,会导致系统崩溃。一些系统进程是原生进程,它们只使用原生API(由NTDLL实现的API)。系统进程的例子有
Smss.exe
、Lsass.exe
、Winlogon.exe
、Services.exe
等。 - 子系统进程 Windows子系统进程运行的映像文件是
Csrss.exe
,它可以被视为一个助手进程,帮助内核对Windows系统中运行的进程进行管理。这是一个关键进程,一旦被杀掉,系统就会崩溃。通常每一个会话都有一个Csrss.exe
的实例在运行,因此在标准系统上会存在两个实例—一个对应会话0,另一个对应已登录的用户会话(通常是1)。虽然Csrss.exe
是Windows子系统(当前仅有的一个子系统)的“管理器”,但它的重要性远远超出这个角色。 - Hyper-V虚拟机管理器 Hyper-V虚拟机管理器存在于Windows 10或者Server 2016(和以后版本)系统里,如果它支持基于虚拟化的安全性(VBS)的话。VBS提供了一个额外的安全层,让实际的机器事实上只是一个由Hyper-V控制的虚拟机。VBS超出了本书的范围,请参考Windows Internals一书来获得更多信息。
Windows 10 1607版引入了Windows的Linux子系统(WSL)。虽然它看起来只是又一个子系统,但是它与Windows以前支持的POSIX和OS/2子系统并没有那么类似。旧的子系统能够运行Windows的编译器编译出来的POSIX和OS/2应用程序,而WSL却不需要这样。来自Linux的可执行文件(以ELF格式存储)能够直接在Windows里运行,不需要重新编译。
为了达到这个目的,人们创建了一种新的进程类型—微(pico)进程加上微提供者(pico provider)。简要地说,微进程是一个空地址空间的进程(最小的进程),供WSL进程使用。WSL进程运行时的每个系统调用(Linux系统调用)都必须被截取并转换成等价于Windows的系统调用。这个工作由微提供者完成(微提供者是一个设备驱动程序)。所以,这是一个安装在Windows机器上的真正的Linux系统(用户模式部分)。