计算机系统启动内幕
                                       
经常碰到有人问到计算机无法启动,好像还未到操作系统了,以及WINDOWS启动怎么慢,怎么提示不到文件,或者蓝屏等关于WINDOWS启动的故障,我根据多年的实战经验,并查阅了微软的技术文档,从计算机启动的内幕分析它的启动过程。让用户对系统的启动有更深层更细致的了解。
首先,我将计算机系统的完整启动画了一张图,如下图所示,后面的讲解都是根据这个图示来完成了。
⑥②①
⑤②①
④②①
③②①
②①
⑦②①
⑨②①
⑧8①
⑾②①
⑩0②①
一、自检及初始化部分
  1步:加电自检(Power On Self Test,简称POST),CPU复位。功能是检查电脑是否良好,通常完整的POST自检将包括对开机不显示桌面CPU640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,串并口,显示卡,软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统将给出提示信息或鸣笛警告。自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。
  2步:BIOS部分,系统初始化,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,主要是对硬件设置的一些参数,当电脑启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。EFI(Extensible Firmware InterfaceI,可扩展固件接口)是由英特尔,一个主导个人电脑技术研发的公司推出的一种在未来的类PC的电脑系统中替代BIOS的升级方案,这里不做探究。)
  引导程序,功能是引导WINDOWS或其他操作系统。BIOS先从软盘或硬盘的开始扇区读取主引导记录(MBR),如果没有到,则会在显示器上显示没有引导设备,如果到引导记录会把电脑的控制权转给主引导记录,由主引导记录到分区引导记录,再由分区引导记录把操作系统装入电脑,BIOS的这部分任务就完成了。
二、 BIOS到操作系统的过渡部分:
3 MBRmaster boot reorder(主引导记录)
期中 MBR存在于硬盘的0磁道的第一个扇区称,它的大小是512字节,而这个区域可以分为三个部分。第一部分为pre-boot区(预启动区),占446字节;第二部分是Partition table区(分区表),占66个字节,该区相当于一个小程序,作用是判断哪个分区被标记为活动分区,然后去读取那个分区的启动区,并运行该区中的代码。第三个部分是结束代码标识(55AA)。如下图1所示:
1
关于分区表(DPT
  在主引导区中,从地址BE开始,到FD结束为止的64个字节中的内容就是通常所说的分区表。分区表以80H或00H为开始标志,以55AAH为结束标志,每个分区占用16个字节,一个硬盘最多只能分成四个主分区,其中扩展分区也是一个主分区。随着硬盘容量的迅速扩大,引入的扩展分区可以不受四个主分区的限制,把硬盘分区数扩展到“Z”。
值得注意的是,MBR是由分区程序(例如DOS的)产生的,它也并不是以文件的形式存在的,而是由BIOS通过磁盘的定位来完成读写操作的不同的操作系统可能这个扇区的内容代码是不相同,但是实现的功能只有一个,使其中的一个活动分区获得控制区,正常启动系统。MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质。具有公共引导的特性。它实际上是让BIOS过渡到操作系统的中间部分。
  如何是EFI方式,它会加载BOOTMGR,然后进行相应的启动。这里不作研究。
  把上面二个步骤可以细化为以下十个步骤:
1. 开机
2. BIOS 加电自检( Power On Self Test --POST ),内存地址为0ffff:0000
3. 将硬盘第一个扇区(0 0 1 扇区, 也就是BootSector) 读入内存地址
0000:7c00 .
4. 检查(WORD) 0000:7dfe 是否等于0xaa55, 若不等于,则转去尝试其他启动介质,
如果没有其他启动介质则显示"No ROM BASIC" 然后死机.
5. 跳转到0000:7c00 处执行MBR 中的程序.
6. MBR 首先将自己复制到0000:0600 ,然后继续执行.
7. 在主分区表中搜索标志为活动的分区.如果发现没有活动分区或有不止一个活动分
, 则转停止.
8. 将活动分区的第一个扇区读入内存地址0000:7c00 .
9. 检查(WORD) 0000:7dfe 是否等于0xaa55, 若不等于则显示"Missing Operating
System" 然后停止,或尝试软盘启动.
10. 跳转到0000:7c00 处继续执行特定系统的启动程序.
11. 启动系统...
以上步骤中2,3,4,5 步是由BIOS 的引导程序完成.6,7,8,9,10 步由MBR 中的引导程
序完成. 一般多系统引导程序 (SmartFDISK, BootStar, PQBoot )都是将标准主引导记录替换成自己的引导程序, 在运行系统启动程序之前让用户选择要启动的分区. 而某些系统自带的多系统引导程序 (lilo, NT Loader )则可以将自己的引导程序放在系统所处分区的第一个扇区中, Linux 中即为SuperBlock ( 其实SuperBlock 是两个扇区).
: 以上各步骤中使用的是标准MBR, 其他多系统引导程序的引导过程与此不同.
三、操作系统部分(WINDOWS
4步:BOOT sector(分区引导记录)
在上面的MBR中,通过引导程序代码到分区表中的活动分区的引导记录,并将控制权交给它。 BOOT sector 是活动分区的引导记录,存在于活动分区开始的第一个扇区,也不是以文件的形式存在,是由MBR中的第一部分程序来读取的。它是由操作系统在安装时初始化建立的。
    Boot sector 即操作系统引导扇区,通常位于硬盘的0磁道1柱面1扇区(这是对于DOS来说的,对于那些以多重引导方式启动的系统则位于相应的主分区/扩展分区的第一个扇区),是操作系统可直接访问的第一个扇区,它也包括一个引导程序和一个被称为BPB(BIOS Parameter Block)的本分区参数记录表。其实每个逻辑分区都有一个Boot sector,其参数视分区的大小、操作系统的类别而有所不同。
引导程序的主要任务是根据操作系统安装时建立的初始化信息在当根目录中寻系统文件ntIdr文件,如果存在,就把该文件读入内存,并移交控制权予该文件。(如果是VISTRA,则是WINLOAD文件)
5步:NTLDRNT BOOT LOADER/WinLoad
在本步骤中,系统要用到的文件一共有:NTLDRBoot.inintdetectNtbootdd.sysbootsect.dos(可选的)、Hiberfil.sys。这些文件在系统的根目录下以隐藏或系统文件的方式存在。
工作过程:
  1NTLDR将计算机微处理器从16位实模式转换为32位保护模式。在实模式中,系统为MS-DOS保留640kb内存,其余内存视为扩展内存,而在32位保护模式中,系统(Windows XP Professional)视所有内存为可用内存
2、启用CPU的内存分页机制,即pagefiles.sys文件。
3、检测硬盘类型,如果SCSI硬盘,则加载Ntbootdd.sys用于访问磁盘,否则使用INT 13访问硬盘。
4如果发现系统根目录下有Hiberfil.sys文件并且有效,那么NTLDR将读取Hiberfil.sys的信息并恢复休眠以前的状态。这时它并不处理boot.ini文件。
说明:Hiberfil.sys是系统的休眠功能所占用的硬盘空间的文件(Windows 默认休眠功能是处于打开状态的),电脑处于休眠状态时,内存中的所有内容将保存到硬盘,并且电脑会被关闭。电脑在返回打开状态之后,关闭电脑时打开的所有程序和文档将全都还原到桌面。也就是说,当你让电脑进入休眠状态时,Windows 在关闭系统前将所有的内存内容写入hiberfil.sys文件。而后,当你重新打开电脑,操作系统使用Hiberfil.sys把所有信息放回内存,电脑恢复到关闭前的状态。然而,Windows 在硬盘上留下了hiberfil.sys文件,即使这个文件不再需要了。
5、加载BOOT.INI,选择操作系统。如果没有上述的hiberfil.sys文件,将读取BOOT.INI文件,这时我们会看到操作系统选择的画面。如果用户按F8,进入操作系统的启动菜单选项。如果用户选择了DOS,则NTLDR将加载BOOTSECT.COM,这是供DOS使用的引导扇区副本。
      6、加载硬件检测,即执行ntdetect,将调用BIOS收集计算机硬件信息列表并保存到注册表HKEY_LOCAL_MACHINE下的hardware中,硬件检测完成后,进入配置选择阶段。如果计算机含有多个硬件配置文件列表,可以通过按上下按钮来选择。如果只有一个硬件配置文件,计算机不显示此屏幕而直接使用默认的配置文件加载Windows XP专业版
7、加载内核阶段
  在加载内核阶段,ntldr加载注册表引导驱动程序,准备将系统控制权交给Windows XP内核的。。 接着ntldr加载硬件抽象层(hal.dll),然后,系统继续加载HKEY_LOCAL_MACHINE\system键,NTLDR读取select键来决定哪一个Control Set将被加载。控制集中包含设备的驱动程序以及需要加载的服务。NTLDR加载HKEY_LOCAL_MACHINE\system\service\...start键值为0的最底层设备驱动。当作为Control Set的镜像的Current Control Set被加载时,ntldr传递控制给内核,执行的入口函数,初始化内核阶段就开始了。
6步:内核初始化(NTOSKRNL.EXE
在初始化内核阶段开始的时候,彩的Windows XPlogo以及进度条显示在屏幕中央,在这个阶段,系统完成了启动的4项任务:
1、完成对象定义和和核心数据结构初始化,使用在硬件检测时收集到的数据来创建了HKEY_LOCAL_MACHINE\HARDWARE键。