0x00. 微内核架构
如果你对操作系统基本理论并不熟悉,那笔者其实更推荐 从 Linux kernel 这一个开源宏内核进行入门,本节内容基本不会涉及操作系统基础概念
以及笔者看到很多讲 Windows 内核的文章上来就先大讲特讲 X86 的基本知识(页表、保护模式、调用门...),但是在笔者看来 这些东西并不是特定于某个操作系统的技术 ,讲 Windows 内核上来不讲内核本身反而先讲一堆这些东西 属于是有点本末倒置了
另外说一句,本节内容在笔者看来更多是通识向的内容,可能知识深度上不会满足各大 Windows kernel hacker 的胃口,以及和前面 Linux 一样不会在这一小节深入分析各个子系统的细节,还请见谅:)
Windows 操作系统全称为新技术视窗(Windows New Technology,简称 Windows NT),其曾经声称采用的是微内核架构(micro kernel),即大部分系统组件都以用户态形式存在,仅有部分必要组件以内核态形式存在,但实际上现在 Windows 往内核态塞了不少东西,所以现在的 NT kernel 更偏向于 混合内核 (hybrid kernel)

本篇博客我们主要介绍 64 位 Windows NT kernel 的基本运行原理以及一些基本组件,主要以 Windows 10 和 Windows 11 作为案例进行讲解, 不会涉及与 32 位相关的内容
关于 Windows 内核一些结构体的定义可以参见 这个网站
一、用户态部分
Windows NT 操作系统在用户态主要分为四个部分:
- 系统进程(System Processes)
- 服务(Services)
- 应用(Applications)
- 环境子系统(Environment Subsystem)
Windows 下所有用户态程序对系统资源的获取最终都要通过 ntdll.dll 提供的系统调用接口完成
二、内核态部分
NT kernel 并不存在硬件意义上的分层(都跑在 ring0),但在设计上存在分层依赖的概念,可以分为如图所示的三层:

上层:执行体 (Executive)
执行体(Executive)是 NT kernel 的核心部分, 本质上就是传统的操作系统内核本体,比较核心的一些子系统如下:
-
对象管理器(Object Manager):对象管理器是 执行体的底层部分 ,在内核中 所有的资源都是一个对象 (object),对象管理器便负责管理所有的内核对象
-
输入输出管理器(I/O Manager):负责接收用户态程序的 I/O 请求(如访问磁盘),将其转换为对相关设备的调用
- 安全引用监视器(Security Reference Monitor):Windows 使用访问控制列表(Access Control List)来确定对象的安全性,该子系统便负责实行安全规则
- 进程间通信管理器(IPC Manager):负责处理不同进程间的通信请求
- 虚拟内存管理器(Virtual Memory Manager):负责从内核层面进行整个操作系统的内存管理
- 进程管理器(Process Manager):负责进程与线程的创建与销毁, 不负责直接调度
- 即插即用管理器(Plug and Play Manager):负责处理设备动态载入与卸载时进行检测及提供相应服务,大部分实际上在用户态的
Plug and Play中实现 - 电源管理器(Power Manager):负责处理电源相关事件(关机、睡眠等),并通知相关联的驱动程序
- 图形设备接口(Graphic Device Interface):负责所有基本的绘图功能,自 NT 4.0 起移入内核态中运行(此前在用户态)
执行体相关的代码位于 ntoskrnl.exe 中,其向用户态导出的接口位于 ntdll.dll 中
中层:(微)内核(Kernel)
内核(Kernel)在 NT kernel 中仅负责多处理器间同步、线程直接调度、中断/异常分发等最基本的 硬件侧职能 ,符合“微内核”架构的基本思想
内核相关代码位于 ntoskrnl.exe 中
中层:内核模式驱动(Kernel Mode Driver)
Windows 下的驱动有两种:用户模式驱动和内核模式驱动,后者负责向前者提供对应的接口,并将数据传递给更为底层的驱动程序
内核模式驱动可以分为如图所示的三层,越贴近底层越靠近详细具体的硬件结构:

内核模式驱动被实现为离散的模块化组件,而非位于某个特定的 PE 文件中(有点像 LKM?)
下层:硬件抽象层(Hardware Abstract Layer)
硬件抽象层(Hardware Abstract Layer)负责隐藏与屏蔽底层不同硬件的各种细节,从而向上层内核提供统一的抽象硬件接口,例如 IO 接口、中断控制器等硬件行为的统一抽象
HAL 的目的主要是消除硬件架构间的差异,从而方便操作系统与驱动开发者为不同硬件平台编写与具体硬件架构无强相关的代码以跨平台运行,从而无需为每个硬件平台都单独编写一套针对性代码
需要注意的是 HAL 主要负责 IO 等通用资源的抽象,部分驱动的部分操作仍然是绕开 HAL 直接与硬件进行通信的
HAL 相关代码位于 hal.dll 中。