千难万难启动最难系列(二)
从MBR到登录(NT 5.x 篇)
上一篇文章介绍了从计算机通电到BIOS加载MBR的过程。从MBR开始各种系统不同,从这篇起分别介绍各种系统的详细过程。
本篇文章主要介绍NT 5.x(Windows XP)的启动过程。
下面先介绍启动过程设计的组件:
下面开始介绍具体过程:
物理磁盘是按扇区(sector)的单元来寻址的,通常情况下,一个硬盘扇区的大小为512B。硬盘的第一个扇区的数据被称为主引导记录(MBR)。MBR包含了固定数量的空间,其中可执行的指令(引导代码)和一章表(分区表)。分区表有4个表项,分别记录了该磁盘的主分区的信息。
BIOS 加载MBR到内存,开始执行MBR的执行代码。MBR的代码开始扫描主分区表,直到一个可引导分区(就是所谓的活动分区)。这种分区被Windows称为引导分区(boot partition),它的第一个扇区称为引导扇区(boot sector),针对引导分区而定义的卷成为系统卷(system volume)。请记住这几个概念,并注意区别分区和卷。MBR将引导扇区代码读入内存,并将控制权交给引导扇区的代码。
引导扇区的代码的职责是,给Windows提供有关卷的结构和格式方面的信息,并且从该卷的根目录中读入Ntldr文件(请记住是根目录,因为引导扇区包含的代码恰好足够能够从根目录读取文件)。由于引导扇区含有文件系统格式的代码,所以不同的分区格式的引导扇区代码不同。
引导扇区代码将Ntldr加载到内存中以后,控制权交给Ntldr。这时系统还处于16位实模式(real mode),Ntldr采取的第一个动作是,将系统切到保护模式(protected mode)。但是此时并没有从虚拟地址到物理地址的翻译,这个时候已经可以访问完整的32位内存。在系统进入保护模式后,Ntldr创建足够的页表使得16M以下的内存通过分页机制可以访问到。最后Ntldr打开分页机制。带有分页机制的保护模式,正式Windows正常情况执行程序的情况。
Ntldr启动分页机制后,仍然依赖于引导代码提供的函数来访问基于IDE系统,以及磁盘和显示器。引导代码函数会暂时关闭分页机制,将处理器切回实模式,一般执行BIOS的服务。如果引导磁盘是SCSI硬盘,Ntldr会加载一个Ntbootdd.sys的文件来访问磁盘。
Ntldr利用内置的文件系统代码,从根目录下读入boot.ini文件,与引导扇区代码不同,Ntldr内置的文件系代码已经可以读取子目录。
Ntldr清除屏幕。如果系统卷的根目录下有一个Hiberfil.sys文件。那么,它将该文件读入内存,将控制权转交到恢复休眠系统的内核代码。如果在boot.ini有多个引导选项,那么它将向展示一个引导选择菜单(如果只有一个,Ntldr将绕过菜单,继续显示启动进度条)。Boot.ini的选择项告诉Ntldr,被选中的Windows系统目录在哪个分区上。
如果在Boot.ini文件中制定的超时间到期以前,用户没有做出选择,那么Ntldr将选择默认选项。一旦选择项已经确定下来,Ntldr加载执行Ntdetect.com,这是一个16位16位实模式程序,它使用BIOS来查询系统的基本设备和配置信息。这些信息将被保存到内部数据结构中,到引导过程的后期,它们将被保存到注册表中。
Ntldr将清楚屏幕,显示启动Windows的进度条,此进度条仍然是空的。截下来Ntldr从引导卷(boot volume)(注意和开始的引导分区区别开)加载必要文件,以便于开始内核初始化。引导卷就是被引导的系统的系统目录(Windows目录)所在分区的那个卷。这里Ntldr将开始做一下步骤:
- 加载内核和HAL映像(Ntoskrnl.exe和Hal.dll)。
- 读入SYSTEM注册表储槽,确定需要加载哪些驱动
- 扫描内存中的SYSTEM注册表储槽,找到所有的引导设备驱动程序。
- 在将要加载的引导驱动程序中,加入为访问系统目录所需的文件系统驱动程序。
- 加载驱动程序
- 准备CPU寄存器,一般执行Ntoskrnl.exe.这是Ntldr在引导过程中最后的任务。
最后Ntoskrnl开始执行系统初始化。进度条开始移动,中间大约要进行33个步骤,限于篇幅不再一一赘述,只指出几个关键的地方:
在启动进度条25%到75%的过程中,是Windows启动中最复杂的阶段,主要进行IO管理器的初始化,每成功加载一个驱动程序引导进度增加2%(最多到75%)。
在启动最后阶段,会创建会话字系统(Smss)进程。Smss负责创建用户模式环境,由用户模式环境向Windows提供可视的界面。
Smss是一个原生应用程序,是操作系统最可信的部分,它并不使用Windows API,因为Smss启动的时候,Windows 子系统尚未执行。Smss会初始化注册表,加载Windows 子系统的内核模式部分(win32k.sys),然后Smss启动子系统进程(包括Windows 子系统Csrss),最后启动登录进程(Winlogon)。
Winlogon负责用户登录过程。
总结NT 5.x的启动流程:MBR->启动扇区(boot sector)->Ntldr->Ntoskrnl->Smss->Winlogon。
特别申明:本文参考了 Windows Internals 4th edition