xp引导过程

来源:互联网 发布:egd网络黄金骗局吗 编辑:程序博客网 时间:2024/05/16 15:59

xp引导过程  转自http://blog.csdn.net/lanhai96/archive/2007/10/12/1821165.aspx

在描述windows引导进程时,我们将从系统安装和处理引导支持文件开始。设备驱动是引导进程关键部分,所以我们会解释,在驱动被加载和初始化的时候,引导进程是如何控制每一时间段的方法。然后我们描述执行子系统是如何初始化的和内核是如何启动会话管理进程smss.exe、Windows子系统和登陆进程(Winlogon.exe)来载入用户模式的。在此过程中,我们将会重点讲述那些在屏幕上出现各种文本提示的时间段,以帮助你把你看到的内部进程与你看到的Windows引导过程联系起来。

值得注意的是相对在IA64系统与x86和x64系统之间,引导进程早期阶段会有所不同。下面一节将描述x86和x64系统引导进程细节部分,接着描述IA64引导进程的细节部分。

x86和x64系统的预启动(引导前的准备)

当你按下计算机电源或者按下reset键时WINDOWS引导进程并不会开始。它是在你给你的计算机安装WINDOWS系统的时候开始的。在系统安装程序(Windows Setup program)执行期间的某个点上,系统的主硬盘分区被准备了一些参与引导进程的代码。在我们深入这些代码的作用之前,我们先看看WINDOWS是如何把这些代码放到磁盘上和放在磁盘的什么位置。

从早期的MS-DOS延续下来一个标准,就是在x86系统上把物理磁盘分割成卷。微软操作系统把硬盘分割成称之为分区(Partitions)的离散区域,并且用文件系统(即文件格式FAT和NTFS)把每个分区格式化为一个卷。一个硬盘能最多包含四个主分区。因为这种分配方式会限制一个磁盘只能划分成四个卷,所以一个特殊的分区类型产生了,称之为扩展分区(Extended partition),扩展分区允许每个主分区里包含最多四个额外的分区。扩展分区可以包含还有扩展分区的扩展分区,并且这个分区在一个磁盘空间允许的情况下拥有无限有效的卷标号码。图5-1显示一个硬盘规划的事例,表5-1总述了在x86和x64引导进程的相关文件。(你可以在第十章存储管理了解更多的windows分区知识)

5-1 硬盘规划实例

 

 

5-1总述在x86x64引导进程的相关文件

 组件  执行进程环境  职责与作用  1,主引导记录代码(MBR)  16位实模式  读取并载入分区引导扇区  2,引导扇区  16位实模式  读取根目录以载入Ntldr  3Ntldr  16位实模式和32位或64位保护模式;开启内存分页  读取Boot.ini,提示引导菜单,并且载入Ntoskrnl.exeBootvid.dllHal.dll和引导开始设备驱动。如果引导一个32位安装系统,那么切换到32位保护模式;如果一个引导64位安装系统,则切换到64位长模式。  4Ntdetect.com  16位实模式  完成硬盘检测以备Ntldr执行  5Ntbootdd.sys  保护模式  不可用时,加载该文件作为在SCSIATA磁盘上的I/O设备驱动。  6Ntoskrnl.exe  分页的保护模式  初始化执行子系统,初始化引导,初始化系统开始设备驱动,为系统运行原始应用程序做准备,然后运行Smss.exe  7,Hal.dll  分页的保护模式  Ntoksnrl、设备驱动和硬件之间的接口的内核模式DLL文件 8,Smss.exe  原始应用程序  载入包含Win32k.sysCsrss.exeWindows子系统,然后开始Winlogon进程。  9,Winlogon.exe  原始应用程序  开始服务控制管理器(SCM),开始本地安全子系统(LSASS),然后弹出交互式登陆对话框。  10, 服务控制管理(SCM)  原始应用程序  加载和初始化自动开始的设备驱动和Windows各种服务。      

物理硬盘是以扇区(Sector)为单位来寻址的。在一台IBM兼容PC上的一个硬盘扇区是典型的512字节。用MS-DOSFdisk应用程序或者Windows安装程序,把硬盘准备成卷标定义形式的用途是为了在硬盘的第一个扇区写入有一个扇区数据的称为主引导记录(MBR)的数据代码(MBR分区将在第十章进行描述)。这个MBR包含:一个含有可执行指令(称为引导代码)的固定数量空间,和一个带有四个定义为磁盘主分区位置入口的表(称为分区表)。当一个IBM兼容计算机引导时,它执行的第一个代码被称做BIOSBIOS是被编码到计算机的ROM里面的一段程序。BIOS选择一个引导设备,读这个设备的MBR到内存,并且把控制权交给在MBR里的这个代码。

       MBR通过Microsoft分区工具,像Windows Setup安装程序里集成的分区工具和磁盘管理MMC加载件,写MBR到磁盘也经过了读取进程和传递控制的过程。首先,MBR代码扫描这主分区表,直到落到这样一个分区,这个分区包含一个表示可引导分区的标签。当这个MBR找到至少一个这样的标签,它会读这个被标记分区的第一个扇区到内存,并且传输控制权给这个分区中的代码。这类分区被称为引导分区(boot partition),这样的分区的第一个扇区被称为引导扇区。定义为引导分区的卷标被称为系统卷标(system volume)。

操作系统通常在没有用户干预下把引导扇区写入磁盘。例如,当Windows安装程序写MBR到一个硬盘时,它也写一个引导扇区到这个磁盘的第一个可引导扇区。在安装MS-DOS,Windows Me,Windows 98,或者Windows 95时,你可能已经创建一个MS-DOS引导扇区。Windows安装程序检测这个引导扇区,看这个将被Windows引导扇区重写的引导扇区是否是一个有效的MS-DOS引导扇区。如果是,Windows安装程序拷贝这个引导扇区的内容到一个存在于分区根目录下称为Bootsect.dos的文件中。

在写入到一个分区的引导扇区之前,Windows安装程序首先确保这个分区是被你指定的一个Windows支持的(FAT,FAT32,NTFS)文件系统格式化了(以及其他分区都要做类似格式化过程)。如果分区已经被格式化,你可以指示安装程序跳过这一步。否则,使用安装程序格式化了这个引导分区以后,安装程序拷贝Windows用在引导分区的文件(系统卷标)到系统卷中,这些文件包含两个参与引导序列的文件:Ntldr和Ntdetect.com。

安装程序的另一角色是创建一个引导菜单文件:Boot.ini,它存在于系统卷标的根目录。这个文件包含是从安装程序安装的这个版本的windows还是一些先前已经安装的Windows选择引导的一个选项。如果Bootsect.dos包含一个有效的MS-DOS引导扇区,Boot.ini创建的入口之一就是引导到该MS-DOS下。下面输出的内容显示了一个在Windows XP之前安装了MS-DOS双引导计算机的Boot.ini文件

boot.ini例子:

[boot loader]
 
timeout=30
 
default=multi(0)disk(0)rdisk(0)partition(1)/WINDOWS
 
[operating systems]
 
multi(0)disk(0)rdisk(0)partition(1) /WINDOWS="Microsoft Windows XP Professional" /fastdetect
 

C:/="Microsoft Windows"

 

你会发现这个示例文件中Windows文件路径很特别,是使用一种ARC命名规则的特殊语法。有三个变量被Windows用到这个语法中。第一,在前所述代码中multi()语法,指示Windows用BIOS INT 13函数来载入系统文件。因此,这个multi()语法被介绍为,当定位于引导卷标的磁盘有一个支持INT-13的控制器时使用。如下就是multi()的语法:

multi(W)disk(X)rdisk(Y)partition(Z)

W是这个磁盘控制器号(也称为磁盘序号),通常为0。X在multi()语法中一直是0。Y指定为附在控制器W的的具体物理硬盘。对于ATA控制器,这个数字介于0-3之间。对于SCSI控制器,这个号码通常在0-15之间。Z显示在物理硬盘上相应引导卷标的分区号码。第一分区被指派为号码1。

Ntbootdd.sys提供支持Windows磁盘的I/O服务,这scsi() ARC语法依靠Ntbootdd.sys来通知windows去访问在引导卷标的文件。该语法格式如下:

 

scsi(W)disk(X)rdisk(Y)partition(Z)

此语法中,W是控制器号,X是附属到控制器的物理硬盘,也是介于0-15。Y指定了引导卷标磁盘的SCSI逻辑单元号(LUN),通常为0。最后,Z是相应驱动卷标分区号,通常从1开始。

这最后一种被Windows使用的语法是signature()语法。它指示Windows定位到括号中匹配第一个值的标号磁盘,不管与磁盘联合的控制器号,并且用Ntbootdd.sys去访问引导卷标。一个磁盘签名就是一个全局唯一标识符(GUID),Windows安装程序从MBR中的信息中生成该签名,并且写到磁盘上。这个signature()语法如下:

signature(V)disk(X)rdisk(Y)partition(Z)

V是一个32位16进制用于表示该磁盘的磁盘签名。X是带有特定签名的物理硬盘,并且它在系统中能与任何控制器发生紧密联系。Y一直是0。Z就是引导卷标所在的分区号码。

Windows使用该语法于下面几种情况:

1、引导卷标的大小高于7.8GB,并且BIOS扩展的INT-13函数(用于访问一个磁盘超过7.8GB的部分)不能访问整个卷标情况下。

2、BIOS不支持扩展的INT-13函数情况下。

X86/x64引导扇区和Ntldr

Windows Setup安装程序在写入引导扇区前必须知道这个分区格式,因为引导扇区内容非常依赖这个格式。例如,如果分区格式是FAT,Windows写入可以理解FAT文件系统的代码到引导扇区。但是如果分区是NTFS,那么Windows就会写入可以理解NTFS格式的代码到引导扇区。这个引导扇区代码的角色就是给Windows提供一个关于卷标结构和格式的信息,同时从该卷标的根目录读入Ntldr文件。因此,引导扇区代码包含了足够的只读文件系统代码以便去完成这样一个任务。引导扇区代码载入Ntldr到内存后,它传递控制给Ntldr的输入点。如果引导扇区在这个卷标根目录里面没有找到Ntldr文件,那么如果引导区的文件系统是FAT时,它会显示这样的错误信息:"BOOT: Couldn't find NTLDRP",如果文件系统是NTFS,显示错误信息:"NTLDR is missing"。

当在一个存在于实模式(real mode)的x86操作模式的系统执行时,Ntldr就开始执行。在实模式,不会出现从虚拟地址到物理地址的内存地址转译,这就意味着用于内存地址的程序会使用物理地址来解释他们,同时也意味着仅有计算机物理内存的第一个1MB是可访问的。简单的MS-DOS程序执行在一个实模式环境。然而,Ntldr做的第一个动作就是交换系统到保护模式。虽然仍然没有虚拟物理内存在引导进程的这个点上发生转译,但是一个完整的32位的内存已经变的可用了。系统进入保护模式以后,Ntldr可以访问所有的物理内存。创建了足够的页表使低于16MB的内存被页可访问后,Ntldr就打开分页机制了。激活页的保护模式也就是一般正常情况下系统的执行环境。

Ntldr激活了页以后,它就完全可以操作了。然而,它仍然依赖引导代码的函数支持,以访问基本IDE系统和引导磁盘、显示器。这个引导代码函数暂时中断页,传递控制权返回给BIOS提供的一种服务模式的对应进程去执行。如果包含引导卷标的磁盘是SCSI基础的,并且是用BIOS固件支持不可访问的,那么Ntldr载入一个文件名为Ntbootdd.sys的文件,和使用它来代替引导代码函数来供磁盘访问。Ntbootdd.sys是SCSI微型端口驱动的拷贝,windows用这个驱动在它完全接手操作的时候去访问引导磁盘。(在磁盘驱动的更多信息请查看第十章)Ntldr下来使用嵌入的系统代码从根目录读取Boot.ini文件。跟引导扇区的代码一样,Ntldr包含只读NTFS和FAT代码;然而不同引导扇区代码的是,Ntldr的文件系统代码可以读取子目录。

Ntldr下来清理屏幕。如果有一个有效的Hiberfil.sys文件在系统卷标的根目录,它取这个引导进程的捷径以读取文件的内容到内存,并且传递控制到内核代码以恢复中断中的系统。这个代码负责重新启动那些在系统关机时仍然活动的驱动程序。仅仅当上次计算机关机时它被休眠了,Hiberfil.sys才会是有效的,其他时间它是休眠的。(更多关于休眠的信息看11章的电源管理章节)

如果在Boot.ini文件里面有多个引导选项,它会提供给用户一个引导选项菜单。(如果仅仅有一个,Ntldr就会略过这个菜单,直接去显示开始进度条。)在Boot.ini里面的选项输入点指导Ntldr到被选择安装的系统目录的分区。这个分区可能和引导分区相同,也可能是别的主分区。

如果Boot.ini输入点指向一个MS-DOS安装(换句话说,以C:/作为系统分区),Ntldr读取Bootsect.dos文件的内容到内存,切换系统返回到16位的实模式,同时在Bootsect.dos里面呼叫MBR代码。这个动作引起Bootsect.dos代码去执行,就像MBR已经从磁盘读取了代码。在Bootsect.dos的代码继续一个特别MS-DOS引导,这通常被用于引导在计算机中已经安装了的Microsoft Windows Me, Windows 98, or Windows 95的系统。

Boot.ini里面的内容包含一些可选的参数,包括Ntldr和其他有关说明引导进程的部件。表5-2包含了这些选项以及他们的影响的完整列表。工具Bootcfg.exe工具,在windowsXP里面有介绍,提供了一个便利的接口以设置这些参数开关。包含在boot.ini的任何选项都被保存到注册表值HKLM/System/CurrentControlSet/Control/SystemStartOptions.里了。

表5-2 Boot.ini里面的引导选项

(暂略)

故障类型:

电脑无法识别SATA硬盘?

如果南桥主板提供的SATA控制器没有被设置为RAID或者在BIOS设置时屏蔽了RAID,是可以找到硬盘的,但是如果开启了RAID,则无法找到硬盘。可在BIOS里面禁用RAID。在安装XP系统的过程中,当屏幕下方显示:“Press F6 if you need to install a third party SCSI or RAID driver”提示时,按下F6键,然后按照系统提示将主板附带的SATA驱动程序光盘放入驱动器中,最后按下“S”载入必须的驱动程序即可。

 

如果在Boot.ini文件指定的超时时间期间,用户没有从选项菜单里面选择一个进入点,那么Ntldr选择默认选项,默认选项在Boot.ini文件的最顶点输入点,它指定了一个匹配的路径位于“default=”行。一旦这个引导选择被设置,Ntldr会载入并且执行Ntdetect.com、一个16位的实模式(用于系统BIOS去请求计算机以引导基本设备)和配置信息。这些信息包含:

1、     存储在系统CMOS里面的时间和日期信息;

2、     系统里的总线类型和依附在总线上的设备标识符;

3、     系统里磁盘驱动的号码,大小和驱动类型;

4、     连接到系统的接入鼠标设备类型;

5、     系统的并口配置的号码和类型;

6、     出现在系统中的视频适配器;

 

这些聚集到内部数据结构的信息将被存贮在引导后的HKLM/HARDWARE/DESCRIPTION注册表值下。

在Windows2000,Ntldr清理屏幕并显示“Starting Windows”进度条。这个进度条保持留空以通知Ntldr开始载入引导驱动。(查看下面列表的第五步)在进度条下是这样的信息:"For troubleshooting and advanced startup options for Windows, press F8."如果用户按下F8,这个高级引导菜单就会出现,以允许用户选择这样一些更好的引导选项:safe mode, debug mode, and so on。在Windows XP和Windows Server 2003,Ntldr提供出一个登陆快闪屏幕(logo splash screen)替代进度条。

如果Ntldr运行在一个X64系统上,并且引导高级菜单中的选项指定的内核是针对x64的,那么,Ntldr将处理器切换到长模式(long mode),该模式下,原始的字长是64位的。下来,Ntldr开始加载来自引导卷标(boot volume)所必需文件到启动内核初始化中。引导卷标是指被引导的系统的系统目录(通常是/Windows)所在分区的那个卷。这里包含了Ntldr执行的以下步骤:

1、载入适当的内核和HAL映像(默认被Ntoskrnl.exe and Hal.dll)。如果Ntldr载如这些文件中的任一个失败,Windows就会在屏幕上显示"Windows could not start because the following file was missing or corrupt"的信息,下面紧跟这加载失败文件的名字。

2、读取系统注册表巢/Windows/System32/Config/System,以使它决定系统引导需要加载的设备驱动。(一个巢就是一个包含注册表子树的文件,可以从第四章注册表得到更多信息)

3、扫描内存中的系统注册表巢,定位所有的引导设备驱动。引导设备驱动是引导系统过程中所必须的驱动。这些驱动在注册表中用一个开始值SERVICE_BOOT_START (0)指示出来。任何一个驱动在注册表HKLM/SYSTEM/CurrentControlSet/Services下都有一个子键值。例如:对应于逻辑磁盘管理驱动的服务就有一个对应的Dmio的名字,可以参考图5-2。(注册表Services输入点的更多细节请查看第四章服务)

图5-2. 逻辑磁盘管理驱动服务

 

4、在将要加载的引导驱动程序的列表中,添加上为了访问系统目录而需要的文件系统驱动程序,该驱动程序实现了系统目录所在分区类型(FAT、FAT32或者NTFS)的代码。Ntldr在这个时刻必须加载此驱动程序;如果它不这样的话,内核会要求这些驱动程序加载它们自己,这一个请求会引入循环相依赖性。

5、加载引导驱动程序,应该只加载那些“类似引导卷的文件系统驱动程序那样,若要求内核来加载它们就会引入循环相依赖性”的驱动程序。为了指示加载的进度,Ntldr对于文本“Starting Wdindows”下面的进度条进行更新。对于每个被加载的驱动程序,进度条都会相前移动(它假定总共有80个引导设备驱动程序----每一个成功加载以后进度条都会向前移动1.25%)。如果在Boot.ini选项中指定了/SOS开关参数,那么,Ntldr就不会显示进度条了,而是显示每个引导驱动程序的文件名。要注意,在这个时候这些驱动程序只是被加载近来,而没有被系统初始化---在引导的后期它们才被初始化。

6、为Ntoskrnl.exe的执行而准备CPU寄存器。这个动作是在引导进程中Ntldr的最后一个角色。在这个点上,Ntldr唤出在Ntoskrnl.exe中的主函去完成系统初始化的剩余部分。

(待续....)

 
 
原创粉丝点击