电脑的启动过程分析

1) 打开任何一台计算机的电源时,系统都会从一次“开机自检”开始。POST期间具体采用的操作因系统而异。最后一声短促的响铃,表明post成功完成。
    post 的最有一步是将控制权交给BIOS中的INT13例程,以便检查是否已经有一个可启动设备。系统从驱动器加载主启动记录(MBR),MAR中的可执行代码会扫描MBR末尾的分区表,查找活动启动分区的扇区/偏移量。
    如果代码未能在分区表中找到合适的项目,就会显示“Invalid Partition Table”错误提示。如果代码找到一个分区表,但不能定位活动分区的启始位置,就显示“error loading operating system”或者“missing operating system”。
 
  2) 辅助启动:mbr中的可执行代码找到了活动分区的起始位置之后,就会将第一个扇区(512个字节)加载到内存位置0X700h处。这个扇区成为引导扇区。它们能查找并加载一个“辅助启动加载程序”。
    启动扇区中的可执行代码不能读取文件系统,所以辅助启动加载程序必须位于启动驱动器的根目录。辅助启动加载程序:Ntldr. 如果Ntldr遗失,或者没有加载,启动扇区代码就会显示相应的错误消息,比如“ a disk read error has occurred ”,
    “Ntldr is missing” 或者“Ntldr is compressed”。在任何情况下,系统都会要求你“Press Ctrl Alt Del to restart”。

  3) Ntldr Ntldr执行时,它会初始化视频硬件,并将屏幕设置成80*25字符模式,而且采用黑色背景。然后,它将处理器切换到“保护”模式来支持32位内存寻址,并初始化Ntldr代码中内置的小型版本的NTFS和FAT文件系统驱动程序。
    在这些文件系统驱动程序的帮助下,Ntldr就能足够充分地访问驱动器,以加载剩余的Windows系统文件。Ntldr现在会查找一个名为 Boot.ini 文件,其中包含了Windows 启动菜单。
 
  4) Ntldr 在执行核心映像之前,需要了解有关硬件的信息。这便需要用到Ntdetect.com,它在IA32系统上收集的信息相当于EFI在IA64系统从固件中收集的信息。
    Ntdetect将查找一下硬件配置(CPU类型和FPU将在后期由Ntoskrnl.exe和Hal.dll来检测):
   
    机器ID
    总线/适配器类型
    视频
    键盘
    通信端口
    并口
    软盘驱动器
    鼠标
    Ntdetect利用这些信息在内存中构建一个数据结构。以后,核心驱动程序将利用它来构建注册表中的Hardware分支。
 
  5) 系统核心 如果从启动菜单中选择一个 Windows操作系统,辅助启动加载程序就会用那个分区?font color="#ff0066">加载操作系统核心(Ntoskrnl.exe)、对应的“硬件抽象层”库以及一个显示驱动程序(Bootvid.dll)。辅助启动加载程序将核心文件的映像放到内存中,
    但暂不执行它们。它首先要寻找并加载服务驱动程序。如果辅助启动加载程序没有发现Ntoskrnl.exe,就会显示错误提示消息: windows server 2003 could not start because the following file is missing or corrupt\\system32\ntoskrnl.exe。
    之所以造成这个错误,最大的可能是启动菜单项中指定了不正确的路径,不过也不排除另一个因素:卷上的文件系统被损坏。如果遗失boot.ini,ntldr 就默认在包含了系统分区的驱动器上查找包含了Ntoskrnl.exe的一个分区。这是启动菜单中的一个“默认"项。
  6) 初始服务驱动程序   辅助启动加载程序打开注册表中的system 分支,并检查select项,以便查找currentcontrolset。然后,它扫描currentcontrolset中的services项列表,查找start值为0的设备(值0代表service_boot_start)以及start值为1的设备(值1代表service_system_start)。
    它按照control,service group order 下方的group值所指定的顺序来加载这些驱动程序。此时,控制台屏幕上应该显示一条消息 starting Windows XP,而且屏幕底部会显示一个进度条,表明驱动程序加载的进度。
    完成之后,扶助启动加载程序将初始化Ntoskrnl.exe,并移交目前已保存在内存中的驱动程序映像。

  7) 核心初始化   Ntoskrnl启动后,它会初始化hal.dll和bootid.dll。屏幕现在转为图形模式。然后,Ntoskrnl初始化系统驱动程序,并使用来自Ntdetece.com(IA32)的信息,在注册表中创建一个包罗万象的hardware分支。接着,它调用:“ 会话管理器”(smss.exe)来进行一些初步的清理工作。

  8) 会话管理器要从注册表的 Hklm|system|current controlset control|session manager 中读取它自己的设置项,检查bootexecute的设置。默认情况下启动时要执行的包括 AUTOCHK,它是CHKDSK的一个在启动期间执行的版本。会话管理器还要设置页面文件,即pagefile.sys。会话管理器结束这些
    清理工作之后,会并行的做以下两件事情:*加载控制台登陆服务 winlogon.exe,从而启动身份验证过程。winlogon要启动“本地安全机构子系统”(local security authority subsystem),即lsass.exe。另还要启动脱机打印程序spoolss.及其支持函数库.

    *加载“服务控制器”(screg.exe),结束其余设备和服务的加载。(Windows2000 ;Windows2003 Server需要加载这个服务)

    在NT中,从用户在登陆窗口中输入身份凭证,一直到打开桌面,往往有一个非常长的延迟。用户经常对此迷惑不解。在windows2000中,Microsoft在服务驱动程序初始化之后再显示登陆窗口。在windows XP中,为了加快对控制台的访问,即使许多服务都尚未初始化,也允许用户登录。
    只要用户输入的身份凭证正确无误,就能快速进入。
 
    如果screg不能启动一个设备或服务,就会根据相应的注册表项中的定义来采取操作。具体操作要视情况而定,从在事件日志中简单地添加一条消息,一直到因为停止错误而造成系统崩溃(蓝屏死机)。如果问题不是灾难性的。这条控制台消息并非总是出现,所以你在启动一个服务器之后
    应该总是检查一下日志。任何异常都应该重视,要养成及时隔离问题并解决问题的好习惯。

任何一个小故障都会导致系统启动失败,所以大家对于启动过程确实需要了解一番.

转载请注明:代码家园 » 电脑的启动过程分析

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)