本文共 1886 字,大约阅读时间需要 6 分钟。
大多数操作系统中,都会把应用程序和内核代码分离运行在不同的模式下。内核模式访问系统数据和硬件,应用程序运行在没有特权的模式下(用户模式),只能使用有限的API,且不能直接访问硬件。当用户模式调用系统服务时,CPU执行一个特殊的指令以切换到内核模式,当系统服务调用完成时,操作系统切换回用户模式。
Windows与大多数UNIX系统类似,驱动程序代码共享内核模式的内存空间,意味着任何系统组件或驱动程序都可能访问其他系统组件的数据。但是,Windows实现了一套内核保护机制,比如PatchGuard和内核模式代码签名。
内核模式的组件虽然共享系统资源,但也不会互相访问,而是通过传参数的方式来访问或修改数据结构。大多数系统代码用C写的是为了保证可移植性,C语言不是面向对象的语言结构,比如动态类型绑定,多态函数,类型继承等。但是,基于C的实现借鉴了面向对象的概念,但并不依赖面向对象。多任务指的是操作系统用一个处理器执行多个线程。当计算机有多个处理器(可能是CPU或核)时,可以同时执行多个任务。
Windows是对称多处理(SMP)操作系统,也就是说,在多CPU或核的机器上,每个CPU或者核是对等的,所有处理器共享一块内存空间,这个模型与非对称处理(ASMP)相反,ASMP模型是有一个处理器用来执行内核代码,其他处理器运行用户模式的代码。如下图:
Windows也支持3种类型的多处理系统,分别是多核,超线程,NUMA(non-uniform memory architecture,非一致性内存架构)。
超线程技术由Intel发明,它给每个物理内核提供两个逻辑处理器,每个逻辑处理器都有自己的CPU状态,但量执行引擎和缓存是共享的。
NUMA中的处理器分组成小的单元,叫做结点。每个结点有自己的处理器和内存。NUMA上的Windows仍然以SMP的形式运行,所有处理器都可以访问所有内存。下图是简化版的Windows系统架构实现:
首先注意那条横线将用户模式和内核模式分开两部分了。横线之上是用户模式的进程,下面是内核模式的系统服务。
这4种用户模式下的进程分别是:
内核模式的几个组件包括:
下表中是Windoows系统核心组件的文件名:
文件名 | 组件 |
Ntoskrnl.exe | 执行体和内核 |
Ntkrnlpa.exe(32位才有) | 支持PAE |
Hal.dll | 硬件抽象层 |
Win32k.sys | 子系统的内核模式部分 |
Ntdll.dll | 内部函数 |
Kernal32.dll,Advapi32.dll,User32.dll,Gdi32.dll | 核心子系统的组件 |