你可能知道,每台计算机都有一个固定的启动流程,即BIOS/UEFI→引导加载器→操作系统,这其中:
BIOS(Basic Input/Output System)/UEFI(Unified Extensible Firmware Interface)负责将一切最底层硬件设施处理好,在此之后,根据分区表的不同,加载相应位置的引导加载程序(BIOS及UEFI Legacy会直接跳转至MBR,UEFI引导则见[https://learn.microsoft.com/zh-cn/windows-hardware/drivers/bringup/boot-and-uefi])
Windows的引导加载程序根据系统版本不同分为NT 5.X版本的NTLDR和NT 6.X及之后的BOOTMGR,两者的主要区别在于BCD文件的存放位置及引导安全功能的支持,NTLDR使用boot.ini作为引导管理器的引导项和数据文件,而BOOTMGR则在一般情况下使用一个位于隐藏分区内的BCD文件。不出意外的,BOOTMGR在各方面的支持都比NTLDR好。
引导加载器阶段:引导加载器使用一个特定的数据文件来存储启动项、启动文件和启动参数,供用户选择启动项和高级启动选项,文件位置见上。
操作系统部分:本文只探讨NT6.X及之后的系统版本,引导加载器会启动位于System32目录下的Winload.exe,该程序会接管控制权,开始真正的系统启动阶段。其会加载位于System32目录下的ntoskrnl.exe(操作系统内核),之后smss.exe(Session Management Service System)初始化,其会创建LPC port对象,加载Win32k.sys(系统子内核模块),运行注册表里HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/BootExecute定义的程序,初始化页面文件和注册表,初始化系统环境变量,启动lsass.exe(Local Security Authority Service)和csrss.exe(Client Server Run-Time Subsystem),lsass.exe会初始化系统权限相关,winlogon随后拉起Windows系统服务中被定义为启动时加载的服务(有不少是svchost),之后拉起logonUI,就是系统中欢迎使用界面/用户选择账户的界面,在用户登录前,(logonui就已经拉起了userinit来启动登录后加载的程序(如exqlorer和其他定义的启动项)和dwm)(该部分存疑),用户登录后启动explorer,至此用户进入桌面