拯救我的操作系统

最近公司新装操作系统image都强制装win7,公司电脑一直拖着没有升级,家里也一直是用番茄花园版的xp,突然心血来潮去买了个win7的碟,心想最好是破解版的,回来一装,发现是所谓的旗舰版的,可恶的是这个还是要激活的,只有30天试用期,本想拿去找老板退,后来想想老板那可怜的样子,估计他也不懂啥叫破解,就说一直卖这个,还挺好卖。后来网上一搜,发现下载link多多,唉,浪费。

草草的安装一把,正好吃晚饭,晚饭后回到桌前一看,完了,原来xp系统不见了。心里不禁一惊,这试用期30天是小,原来的系统挂了可麻烦了,好多好多的程序哦,还有那网银整起来好麻烦的。好在,简单配置一下,先把win7下的网络给通了。然后google安装win7后双系统,不少的文章,窃喜。

仔细分析一下我的机器的场景:原来的xp安装在D盘,现在的win7安装在C盘,于是,按照http://www.pcjsh.com/win7/201007/28-3094.html里面的,用bcdedit命令新建了一个引导记录。

  bcdedit -create {ntldr} -D "Windows XP"

  bcdedit -set {ntldr} device partition=D:

  bcedit -set {ntldr} path ntldr

  bcedit -displayorder {ntldr} -addlast

又参考文章http://www.hensejz.com/index.php/archives/118,我xp的安装盘一时找不到了,我原来D盘下根本没有Ntldr、Boot.ini、NTDetect.com这几个文件,还好,从老婆的本本上面拷贝过来这仨文件,如上所述放到D盘(xp系统根目录)下。重启后,的却有多出个“Windows XP”的启动选项,可是点了之后,却出来文件ntldr丢失,无法加载所选项。再仔细想想,原来set path的时候第一篇文章少了bcedit -set {ntldr} path \ntldr, 我猜这个就是路径不对的问题。在重启发现,出现老婆机器一样的界面,Windows XP以及Ghost 一键恢复,但是一闪而过又重新重启了。想了想,可能是boot.ini文件,打开一看,里面是按老婆机器的设置,

[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
C:\GHLDR=一键GHOST v2009.07.15

老婆的机器xp是装在C盘下的,之前我倒是想过,但是自以为partition也是从0开始,1就是第二个分区么,后来仔细查了一下,应该是从1开始,顺便把那个Ghost条目给删了。重启后还是不行,快崩溃了。又看到http://wenwen.soso.com/z/q190320111.htm里说把这3个文件都拷到win7的根目录下面,也就是俺的C盘下。再重启,终于OK了。

看到很多文章说,这3个文件在xp根目录下就行了,在我这里就是不通。于是想应该多想想他的原理么,看到http://bbs.51cto.com/topic/thread-23342.html里面

Windows XP Professional计算机启动过程概述
--------------------------------------------------------------------------------

概述
本文讲述了Microsoft Windows XP 在x86架构计算机上的启动过程,旨在使读者更加了解Windows XP专业版启动的基本知识。了解了这些知识以后,当启动发生问题时,可以更快地找到解决方案以避免可能发生的各方面的损失。但要注意的是,本文并没有涉及到故障处理以及任何关于故障的阐述,本文仅仅介绍Windows XP引导/启动过程。

--------------------------------------------------------------------------------
目录
1. Windows XP启动阶段概览
2. 每个启动阶段的详细介绍

--------------------------------------------------------------------------------

Windows XP启动阶段概览
从按下计算机开关启动计算机,到登入到桌面完成启动,一共经过了以下几个阶段:
1. 预引导(Pre-Boot)阶段;
2. 引导阶段;
3. 加载内核阶段;
4. 初始化内核阶段;
5. 登陆。

--------------------------------------------------------------------------------

每个启动阶段的详细介绍
a) 预引导阶段
在按下计算机电源使计算机启动,并且在Windows XP专业版操作系统启动之前这段时间,我们称之为预引导(Pre-Boot)阶段,在这个阶段里,计算机首先运行Power On Self Test(POST),POST检测系统的总内存以及其他硬件设备的现状。如果计算机系统的BIOS(基础输入/输出系统)是即插即用的,那么计算机硬件设备将经过检验以及完成配置。计算机的基础输入/输出系统(BIOS)定位计算机的引导设备,然后MBR(Master Boot Record)被加载并运行。在预引导阶段,计算机要加载Windows XP的NTLDR文件。
b) 引导阶段
Windows XP Professional引导阶段包含4个小的阶段。
首先,计算机要经过初始引导加载器阶段(Initial Boot Loader),在这个阶段里,NTLDR将计算机微处理器从实模式转换为32位平面内存模式。在实模式中,系统为MS-DOS保留640kb内存,其余内存视为扩展内存,而在32位平面内存模式中,系统(Windows XP Professional)视所有内存为可用内存。接着,NTLDR启动内建的mini-file system drivers,通过这个步骤,使NTLDR可以识别每一个用NTFS或者FAT文件系统格式化的分区,以便发现以及加载Windows XP Professional,到这里,初始引导加载器阶段就结束了。
接着系统来到了操作系统选择阶段,如果计算机安装了不止一个操作系统(也就是多系统),而且正确设置了boot.ini使系统提供操作系统选择的条件下,计算机显示器会显示一个操作系统选单,这是NTLDR读取boot.ini的结果。(至于操作系统选单,由于暂时条件不够,没办法截图,但是笔者模拟了一个,见图一。)
在boot.ini中,主要包含以下内容:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Windows Windows 2000 Professional"
其中,multi(0)表示磁盘控制器,disk(0)rdisk(0)表示磁盘,partition(x)表示分区。NTLDR就是从这里查找Windows XP Professional的系统文件的位置的。
(*gnaw0725 注:关于boot.ini的操作请参考:
[url=http://support.microsoft.com/kb/289022/zh-cn]http://support.microsoft.com/kb/289022/zh-cn[/url]
[url=http://support.microsoft.com/kb/314081/zh-cn]http://support.microsoft.com/kb/314081/zh-cn[/url]

如果在boot.ini中只有一个操作系统选项,或者把timeout值设为0,则系统不出现操作系统选择菜单,直接引导到那个唯一的系统或者默认的系统。在选择启动Windows XP Professional后,操作系统选择阶段结束,硬件检测阶段开始。
在硬件检测阶段中,ntdetect.com将收集计算机硬件信息列表并将列表返回到NTLDR,这样做的目的是便于以后将这些硬件信息加入到注册表HKEY_LOCAL_MACHINE下的hardware中。
硬件检测完成后,进入配置选择阶段。如果计算机含有多个硬件配置文件列表,可以通过按上下按钮来选择。如果只有一个硬件配置文件,计算机不显示此屏幕而直接使用默认的配置文件加载Windows XP专业版。
引导阶段结束。在引导阶段,系统要用到的文件一共有:NTLDR,Boot.ini,ntdetect.com,ntokrnl.exe,Ntbootdd.sys,bootsect.dos(可选的)。
c) 加载内核阶段
在加载内核阶段,ntldr加载称为Windows XP内核的ntokrnl.exe。系统加载了Windows XP内核但是没有将它初始化。接着ntldr加载硬件抽象层(HAL,hal.dll),然后,系统继续加载HKEY_LOCAL_MACHINE\system键,NTLDR读取select键来决定哪一个Control Set将被加载。控制集中包含设备的驱动程序以及需要加载的服务。NTLDR加载HKEY_LOCAL_MACHINE\system\service\...下start键值为0的最底层设备驱动。当作为Control Set的镜像的Current Control Set被加载时,ntldr传递控制给内核,初始化内核阶段就开始了。
d) 初始化内核阶段
在初始化内核阶段开始的时候,彩色的Windows XP的logo以及进度条显示在屏幕中央,在这个阶段,系统完成了启动的4项任务:
内核使用在硬件检测时收集到的数据来创建了HKEY_LOCAL_MACHINE\HARDWARE键。
内核通过引用HKEY_LOCAL_MACHINE\system\Current的默认值复制Control Set来创建了Clone Control Set。Clone Control Set配置是计算机数据的备份,不包括启动中的改变,也不会被修改。
系统完成初始化以及加载设备驱动程序,内核初始化那些在加载内核阶段被加载的底层驱动程序,然后内核扫描HKEY_LOCAL_MACHINE\system\CurrentControlSet\service\...下start键值为1的设备驱动程序。这些设备驱动程序在加载的时候便完成初始化,如果有错误发生,内核使用ErrorControl键值来决定如何处理,值为3时,错误标志为危机/关键,系统初次遇到错误会以LastKnownGood Control Set重新启动,如果使用LastKnownGood Control Set启动仍然产生错误,系统报告启动失败,错误信息将被显示,系统停止启动;值为2时错误情况为严重,系统启动失败并且以LastKnownGood Control Set重新启动,如果系统启动已经在使用LastKnownGood值,它会忽略错误并且继续启动;当值是1的时候错误为普通,系统会产生一个错误信息,但是仍然会忽略这个错误并且继续启动;当值是0的时候忽略,系统不会显示任何错误信息而继续运行
Session Manager启动了Windows XP高级子系统以及服务,Session Manager启动控制所有输入、输出设备以及访问显示器屏幕的Win32子系统以及Winlogon进程,初始化内核完毕。
e) 登陆
Winlogon.exe启动Local Security Authority,同时Windows XP Professional欢迎屏幕或者登陆对话框显示,这时候,系统还可能在后台继续初始化刚才没有完成的驱动程序。
提示输入有效的用户名或密码。
Service Controller最后执行以及扫描HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servives来检查是否还有服务需要加载,Service Controller查找start键值为2或更高的服务,服务按照start的值以及DependOnGroup和DepandOnService的值来加载。
只有用户成功登陆到计算机后,Windows XP的启动才被认为是完成,在成功登陆后,系统拷贝Clone Control Set到LastKnownGood Control Set,完成这一步骤后,系统才意味着已经成功引导了。

--------------------------------------------------------------------------------

结论
本文简单讲述了Windows XP Professional在32位计算机上的启动/引导过程,包括每个启动阶段,以及阶段中的详细步骤。虽然本文没有提及错误处理,但是通过让读者了解这些启动过程,当遇到错误时他们会变得更加从容以及更加容易找到错误的原因。

--------------------------------------------------------------------------------

参考资料
[1] Microsoft Windows XP 专业版帮助;
[2] MCSE: Windows XP Professional Study Guide. Sybex Press.
[3] MCSE Training Kit Microsoft Windows XP Professional. Microsoft Press.[/quote]

我想NTLDR读取boot.ini,为啥开始我放到D盘下就不行呢?我在C,D根目录下都放了boot.ini,似乎他只认C盘下面的,为了验证,我用msconfig命令,我将C盘下面的boot.ini改名为boot_.ini,这时候msconfig里面看不到boot.ini选项了。说明其作用的的确是C盘下面的,我当初装xp的时候确实是装在D盘下面的,似乎是因为装win7把我C盘下面的boot.ini等文件都革没了,所以我开始会找不到那3个文件只能到我老婆机器上面去拷了。

至于原因,我想会不会和我的分区有关,于是用Diskpart命令查看我的磁盘(Diskpart -> select disk 0 -> list partition),发现只有C盘是主分区,其他驱动器都是挂在扩展分区底下,至于为什么,就是装机的时候,那帮人用极快的速度我看都没看清楚的方式帮我把分区搞定的缘故。是否是次原因,我实在是不想再深究了。我突然想到,为啥一定要把win7新建的引导记录写成[bcdedit -set {ntldr} device partition=D:]呢?为验证心中的想法,我把这条修改成了[bcdedit -set {ntldr} device partition=C:],反正我都要在C盘下放那几个文件的,重启机器,OK,果然和我想的一样,也可以进XP的,反正不就是要找到ntldr么,不得不提的这篇文章可能更清晰些,毕竟英文原版的可能才是出处么。http://www.dewassoc.com/kbase/multiboot/boot_ini.htm

终于写完了,好像很乱的,和我想象的还是不一样,看来想表达清楚的确很难啊,还好只是给自己瞅瞅,留个印象么。完!

posted on 2011-05-08 22:59  小宝他爸  阅读(89)  评论(0编辑  收藏  举报

导航