启动与关机
引导进程
在描述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引导进程的相关文件。
物理硬盘是以扇区(Sector)为单位来寻址的。在一台IBM兼容PC上的一个硬盘扇区是典型的512字节。用MS-DOS的Fdisk应用程序或者Windows安装程序,把硬盘准备成卷标定义形式的用途是为了在硬盘的第一个扇区写入有一个扇区数据的称为主引导记录(MBR)的数据代码(MBR分区将在第十章进行描述)。这个MBR包含:一个含有可执行指令(称为引导代码)的固定数量空间,和一个带有四个定义为磁盘主分区位置入口的表(称为分区表)。当一个IBM兼容计算机引导时,它执行的第一个代码被称做BIOS,BIOS是被编码到计算机的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文件
你会发现这个示例文件中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函数情况下。