Windows XP启动过程及常见启动故障
一、Windows XP系统在磁盘上的组织
安装XP过程中,Windows安装系统会在计算机的磁盘分区写入引导相关的组件,分别置放于系统卷(system volume)启动卷(boot volume)。 一个硬盘一般有两种分区方式:一是四个主分区,每个分区都可以作为活动分区;二是三个主分区和一个扩展分区,扩展分区中以逻辑链方式组织逻辑分区,逻辑分区数不受限制。Windows的系统卷只能是主分区,启动卷则没有此限制,主分区或逻辑分区均可。
Windows安装程序会选择磁盘上第一个可引导的主分区(即活动分区)作为系统卷,在写MBR(Master Boot Record,磁盘的第一个扇区,大小一般为512字节)代码的同时,在该分区第一个扇区写入引导扇区。系统卷上包含的显示系统组件包括Ntldr, Boot.ini, Ntdetect.com,Boot.ini是引导菜单配置文件,Ntdetect.com为Ntldr执行硬件检测,Ntldr负责引导Windows系统,它会读入Boot.ini,提示引导菜单,加载Ntoskrnl.exe, Bootvid.dll, Hal.dll和引导启动的设备驱动程序。如果需要,系统卷上还会包含SCSI驱动程序Ntbootdd.sys。
Windows系统其他所有组件都会被置放于启动卷,在安装的时候由用户选择确定,系统环境变量%SystemDrive%指明该分区,所有Windows文件安装在%SystemRoot%目录下。Windows核心组件都位于<WINDOWS\system32>子目录下,如Ntoskrnl.exe(初始化执行体子系统), Hal.dll(内核模式DLL), smss.exe(会话管理器), winlogon.exe(登录进程), win32k.sys(Windows子系统)等,驱动程序位于drivers目录下,注册表文件位于config目录下。
多数情况下,系统卷和启动卷是一个分区。但事情总有例外,比如把XP安装在逻辑分区上,此时这两个卷就是分开的,相关组件就会分别写在相应的分区上。这里跑一下题,能不能同时在一个台机器上安装多个XP系统呢?理论上分析一下,启动卷可以位于不同的分区,但是如果活动分区不发生改动的话,系统卷总是同一个分区。如此一来,系统卷里的组件就会被覆盖重写,多个XP系统共享系统卷组件,这与彼此完全独立的XP系统多少还是有所区别的。经过实验,验证了我的分析,的确可以在一台机器上安装多个XP系统,但是系卷是共享的,也就是ntldr, boot.ini(多个启动项), ntdetect.exe是共用的。
二、Windows XP启动过程
从系统加电启动计算机,到用户登录到桌面完成启动,Windows大致经历以下几个阶段。
1. 预引导阶段
系统加电后,计算机立即运行POST自检程序,检测系统硬件并进行初始化工作。然后,BIOS定位计算机的引导设备,读取MBR至内存0X7c00处,然后就跳转到0x7C00处去执行。
2. 引导阶段
MBR引导代码扫描分区表,找到XP系统卷,然后将对应分区的引导扇区读入内存,并且将控制权交给它。引导扇区代码将Ntldr加载到内存中以后,它把控制权交给Ntldr,之后就由Ntldr来控制引导过程。
Ntldr的第一个动作就是将系统切换至保护模式,打开分页机制,系统进入了Windows的标准状态。接着,Ntldr利用BIOS服务访问磁盘。如果是SCSI磁盘,则需要加载Ntbootdd.sys文件,用它代替引导代码函数来访问磁盘。Ntldr读取系统卷根目录下的boot.ini引导菜单文件,如果存在多个引导项,则显示一个引导选择菜单。一旦引导项确定下来,Ntldr加载并执行Ntdetect.exe,它使用系统的BIOS来查询系统的基本设备和配置信息。这些信息被收集到Ntldr中,在引导过程的后期,它们被保存在注册表 HKLM\HARDWARE\\DESCRIPTION。
3. 加载内核阶段
在该阶段,Ntldr将执行以下任务:
(1)加载正确的内核和HAL映像(默认是Ntoskrnl.exe和hal.dll)。
(2)读入SYSTEM注册表储巢,位于\Windows\system32\config\system,确定需要加载的驱动程序。
(3)扫描内存中的SYSTEM注册表储巢,找到所有的引导设备驱动程序。
(4)将访问系统目录的文件系统驱动加入引导驱动程序列表。
(5)加载引导驱动程序。
(6)准备CPU寄存器,调用Ntoskrnl.exe。
4. 初始化内核阶段
Ntoskrnl在屏幕显示Windows启动徽标。然后,它通过两阶段来完成内核子系统的初始化:第一阶段完成对象定义(process, thread, driver, etc)和核心数据结构初始化;第二阶段完成对象初始化和子系统启动。这两个过程有随后成为”System Idle Process”的内核系统线程来完成。
I/O Manager 按顺序加载”boot-start”驱动程序和”system-start”驱动程序,每个驱动程序的信息都保存在注册表HKLM\System\CurrentControlSet\Services中。最后, Ntoskrnl创建会话管理器进程(Session Manager) (\Windows\System32\Smss.exe), 这是第一个用户态进程。
Smss运行BootExecute中指定的程序,例如autochk,chkdsk等,处理“Delayed move/rename”命令,初始化paging files和其余的注册表项,加载并初始化内核模式中的Win32子系统 (Win32k.sys),启动Csrss.exe (Win32子系统在用户模式的部分),启动Winlogon.exe。
5. 登录阶段
Winlogon.exe加载GINA (Graphical Identification and Authentication)并等待用户登录,默认GINA是Msgina.dll,它会显示标的Windows登录对话框。然后,Winlogin创建服务控制管理器Services.exe进程,依次加载所有标识为自动启动的服务和驱动程序,以及本地安全认证子系统LSASS (Local Security Authority)。
一旦用户正确登录后,Winlogon从登录用户的轮廓中加载注册表储巢,并且将它映射到HKCU,然后设置用户环境变量。Winlogin通知GINA执行用户初始化程序Userinit.exe和Shell脚本,由HKLM\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Userinit和Shell指定,加载各种自动启动项。
至此,Windows启动完成,用户将控制计算机展开各种活动。
三、Windows XP常见启动故障
XP启动过程中可能发生一些问题,主要包括MBR损坏、引导扇区损坏、系统文件缺失或损坏、Boot.ini缺失或配置错误、系统崩溃或蓝屏、系统服务或驱动加载失败、用户登录问题等等。这些问题可能是由于硬盘破坏、文件破坏、缺失文件以及第三方驱动程序错误造成的。针对引导问题,Windows提供了多种诊断和修复解决方案,主要有最后已知的好配置(Last Known Good Configuration)、安全模式、安全模式下的驱动程序加载、恢复控制台(Recovery Console)。其中,恢复控制台中提供了很多实用工具,如fixmbr, fixboot, bootcfg, chkdsk。对于高级用户,可以利用Windows调试工具箱提供的内核调试器kd.exe或者WinDbg.exe,对崩溃转储文件、本地故障系统、远程故障系统进行诊断和修复。
四、参考文献
[1] 深入解析Windows操作系统,Mark E.Russinovich and David A.Solomon.
[2] Windows启动过程.ppt,喻勇(www.yuyong.net).
[3] WindowsXP启动过程.doc,佚名.