﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-依旧的博客-随笔分类-动手</title><link>http://www.cppblog.com/zliner/category/1800.html</link><description>技术学习</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 18:49:21 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 18:49:21 GMT</pubDate><ttl>60</ttl><item><title>多操作系统的引导</title><link>http://www.cppblog.com/zliner/archive/2006/05/18/7362.html</link><dc:creator>依旧的博客</dc:creator><author>依旧的博客</author><pubDate>Thu, 18 May 2006 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/zliner/archive/2006/05/18/7362.html</guid><wfw:comment>http://www.cppblog.com/zliner/comments/7362.html</wfw:comment><comments>http://www.cppblog.com/zliner/archive/2006/05/18/7362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zliner/comments/commentRss/7362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zliner/services/trackbacks/7362.html</trackback:ping><description><![CDATA[
		<p>
				<span class="NewsRemark">我曾经在有一个Windows XP的机器上另装一个Windows 2000，结果2000装完后XP不能启动了。后来上网看了一些资料，又几经试验，解决了这个问题。这里总结一下其中的原理，这个现象很容易在重装低版本系统后出现，而且弄清原理以后，我们可以更自由地处理多系统安装的问题。<br /><br />单个操作系统的引导过程是这样的：首先，主引导记录(MBR)被加载到内存运行，它读取磁盘分区表(DPT)，查找第一个活动分区(可引导分区)，该分区的引导扇区存放着操作系统的引导记录。然后，系统引导记录被加载到内存运行，它从系统安装目录读取系统的启动文件，将其加载执行，控制随后的启动过程。</span>
		</p>
		<p>
				<span class="NewsRemark">这里面涉及到一些程序和数据，它们存放在不同的地方，在不同阶段运行。第一段程序MBR，它的数据是DPT，它们存放在磁盘的主引导扇区。第二段程序是系统引导记录，存放在系统所在分区的引导扇区。第三段程序是系统启动文件，存放在系统所在分区系统安装目录中。这三段程序像接力跑一样，前一段程序的工作就是加载后一段程序，并把控制交给它。</span>
				<span class="NewsRemark">引导记录和启动文件随操作系统而不同，</span>
				<span class="NewsRemark">是在安装时形成的，每个系统的安装程序都把其引导记录写入安装分区的引导扇区，而启动文件是系统的一部分。</span>
				<br />
				<br />上面的引导过程有一个基本缺陷，就是只能引导一个系统，并且只能引导装在第一活动分区的系统。<br /><br /><span class="NewsRemark">如果一个操作系统不在活动分区，那么该系统要被引导有三种办法，改写MBR，改写第一活动分区引导记录，或把所在分区设为第一活动分区。最后一种做法是不方便的，系统通常会改写前两段引导程序，那么它<span class="NewsRemark">在解决自身引导问题的同时，也不能破坏其他系统的引导，这就引出了多系统地引导问题。常见的做法是</span></span><span class="NewsRemark">系统提供一个启动管理器接管引导过程。启动管理器能够获得机器上多个系统的引导记录，从而可以根据用户选择启动不同的系统。系统在安装时改写磁盘第一活动分区的引导记录，使启动管理器被作为第三段程序加载。</span><span class="NewsRemark"><br /><br />如果启动管理器能够知道机器上每个系统所在的分区，就能获得该系统的引导记录，从而可以引导该系统。但实际上，启动管理器所属系统的引导记录是不能再次被加载的，必须特殊对待。同一系列的系统，也可能有类似的问题。所以启动管理器可能要了解机器上每个系统具体如何启动，相应进行引导。这样只有让高版本的系统提供启动管理器，因为低版本的启动管理器无法启动高版本系统。</span><span class="NewsRemark">2000/XP的启动管理器是OS Loader。它对98和2000/XP的引导就是不同的，对98是加载98引导记录的镜像文件，对2000/XP是加载HAL.DLL等文件。OS Loader在引导多系统时，对于windows系列的引导有特殊性，必须向下兼容。</span></p>
		<p>
				<span class="NewsRemark">
				</span>
				<span class="NewsRemark">OS Loader的载体是ntldr文件，它运行时还会读取一个配置文件boot.ini，两个文件都存放在磁盘第一活动分区根目录。boot.ini记录了每个系统所在的分区，每个版本的windows在安装时都会在boot.ini中填写有关自身的一项。2000/XP在安装时都会更新OS Loader和重写第一活动分区的引导记录，后安装者的两个程序才会被保留。如果后装2000，由于前述的OS Loader版本问题，就可能无法引导XP。</span>
		</p>
<img src ="http://www.cppblog.com/zliner/aggbug/7362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zliner/" target="_blank">依旧的博客</a> 2006-05-18 16:27 <a href="http://www.cppblog.com/zliner/archive/2006/05/18/7362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>