你可能知道,每台计算机遵循一个基本的启动流程,即BIOS/UEFI -> 引导加载器 -> 操作系统,这其中:
- BIOS(Basic Input/Output System)/UEFI(Unified Extensible Firmware Interface)负责将一切最底层硬件设施处理好。在此之后,根据分区表和引导模式的不同,加载相应位置的引导加载程序(BIOS及UEFI Legacy引导模式会跳转至MBR,UEFI引导则见微软文档)。用不严谨的话说,一般情况下BIOS配MBR,UEFI配GPT。
- Windows的引导加载程序根据系统版本不同分为NT 5.X版本的NTLDR(NT Loader)和NT 6.X及之后的BOOTMGR(Boot Manager)。从名字也看的出来,前者主要定位服务于NT内核,后者则是定位为了一个引导管理器,因此后者对其他系统的兼容性会比前者好一些。两者的主要区别在于BCD文件的存放位置及引导功能的支持,NTLDR使用boot.ini作为引导管理器的引导项和数据文件,而BOOTMGR则在一般情况下使用一个位于隐藏分区内的BCD文件。不出意外的,BOOTMGR在各方面的支持都比NTLDR好。
引导加载器阶段:引导加载器使用一个特定的数据文件来存储启动项、启动文件和启动参数,供用户选择启动项和高级启动选项,文件位置见上。
操作系统阶段,本文针对NT 6.X及后续版本的Windows系统。在本文中,将引导加载器会执行System32目录下的winload.exe或winload.efi程序定义为实际系统启动流程的开始,将用户登录后启动explorer的操作定义为结束。
- 首先,winload.exe/winload.efi将控制权接管,并加载位于同一目录下的ntoskrnl.exe(NT OS Kernel),即操作系统内核。
- 然后,smss.exe(Session Management Service System,会话管理服务系统)进行初始化工作。它负责创建本地进程间通信端口(LPC Port)对象,加载Win32k.sys(子系统内核模块),并运行注册表中指定于HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/BootExecute项下的程序(例如系统启动时chkdsk检查磁盘的操作)。
- 接下来是初始化页面文件和环境变量,以及设置系统注册表。
- 系统随后启动lsass.exe(Local Security Authority Service,本地安全认证服务)和csrss.exe(Client Server Run-Time Subsystem,客户端服务器运行时子系统)。前者负责处理系统权限相关的初始化,后者则支持Windows的图形界面和命令行接口。
- winlogon.exe进程接着启动那些在Windows服务中被标记为开机自启的服务(许多这样的服务通过svchost.exe托管)。
- 在用户登录前,LogonUI组件会被激活,提供用户选择账户的界面。这里存在一点讨论空间:传统上认为,在用户登录之前,LogonUI已经触发userinit.exe来准备登录后的桌面环境,包括启动explorer.exe和其他用户定义的启动项,以及DWM(桌面窗口管理器)。不过这部分细节可能因不同的Windows版本而有所变化。

