依旧的博客

技术学习

C++博客 首页 新随笔 联系 聚合 管理
  17 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

我曾经在有一个Windows XP的机器上另装一个Windows 2000,结果2000装完后XP不能启动了。后来上网看了一些资料,又几经试验,解决了这个问题。这里总结一下其中的原理,这个现象很容易在重装低版本系统后出现,而且弄清原理以后,我们可以更自由地处理多系统安装的问题。

单个操作系统的引导过程是这样的:首先,主引导记录(MBR)被加载到内存运行,它读取磁盘分区表(DPT),查找第一个活动分区(可引导分区),该分区的引导扇区存放着操作系统的引导记录。然后,系统引导记录被加载到内存运行,它从系统安装目录读取系统的启动文件,将其加载执行,控制随后的启动过程。

这里面涉及到一些程序和数据,它们存放在不同的地方,在不同阶段运行。第一段程序MBR,它的数据是DPT,它们存放在磁盘的主引导扇区。第二段程序是系统引导记录,存放在系统所在分区的引导扇区。第三段程序是系统启动文件,存放在系统所在分区系统安装目录中。这三段程序像接力跑一样,前一段程序的工作就是加载后一段程序,并把控制交给它。 引导记录和启动文件随操作系统而不同, 是在安装时形成的,每个系统的安装程序都把其引导记录写入安装分区的引导扇区,而启动文件是系统的一部分。

上面的引导过程有一个基本缺陷,就是只能引导一个系统,并且只能引导装在第一活动分区的系统。

如果一个操作系统不在活动分区,那么该系统要被引导有三种办法,改写MBR,改写第一活动分区引导记录,或把所在分区设为第一活动分区。最后一种做法是不方便的,系统通常会改写前两段引导程序,那么它在解决自身引导问题的同时,也不能破坏其他系统的引导,这就引出了多系统地引导问题。常见的做法是系统提供一个启动管理器接管引导过程。启动管理器能够获得机器上多个系统的引导记录,从而可以根据用户选择启动不同的系统。系统在安装时改写磁盘第一活动分区的引导记录,使启动管理器被作为第三段程序加载。

如果启动管理器能够知道机器上每个系统所在的分区,就能获得该系统的引导记录,从而可以引导该系统。但实际上,启动管理器所属系统的引导记录是不能再次被加载的,必须特殊对待。同一系列的系统,也可能有类似的问题。所以启动管理器可能要了解机器上每个系统具体如何启动,相应进行引导。这样只有让高版本的系统提供启动管理器,因为低版本的启动管理器无法启动高版本系统。
2000/XP的启动管理器是OS Loader。它对98和2000/XP的引导就是不同的,对98是加载98引导记录的镜像文件,对2000/XP是加载HAL.DLL等文件。OS Loader在引导多系统时,对于windows系列的引导有特殊性,必须向下兼容。

OS Loader的载体是ntldr文件,它运行时还会读取一个配置文件boot.ini,两个文件都存放在磁盘第一活动分区根目录。boot.ini记录了每个系统所在的分区,每个版本的windows在安装时都会在boot.ini中填写有关自身的一项。2000/XP在安装时都会更新OS Loader和重写第一活动分区的引导记录,后安装者的两个程序才会被保留。如果后装2000,由于前述的OS Loader版本问题,就可能无法引导XP。

posted on 2006-05-18 16:27 依旧的博客 阅读(894) 评论(0)  编辑 收藏 引用 所属分类: 动手

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理