计算机启动原理与多重引导
由于主分区表中只能分四个分区, 无法满足需求, 因此设计了一种扩展分区格式。 基本上说, 扩展分区的信息是以链表形式存放的, 但也有一些特别的地方。 首先, 主分区表中要有一个基本扩展分区项, 所有扩展分区都隶属于它,也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中。 对于DOS / Windows 来说, 扩展分区的类型为 0x05 或 0x0F (LBA模式)。 除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放, 后一个扩展分区的数据项记录在前一个扩展分区的分区表中, 但两个扩展分区的空间并不重叠。 BIOS 首先读取并运行硬盘主引导记录中的代码,这些代码首先检验主引导记录中的分区表,寻找到活动分区(即标志为可引导分区的分区),然后读取并运行活动分区之引导扇区中的代码。活动分区引导扇区的作用:从分区中读取内核映象并启动内核。内核映象保存在硬盘分区文件系统中,因此,硬盘引导扇区中的代码还需要定位内核映象在文件系统中的位置,然后装载内核并启动内核。 如果计算机上的系统是windows XP,那么它的引导加载器就是ntldr,它的配套组建就是boot.ini,系统安装时,ntldr就把自己的引导代码写在了MBR中,开机时MBR就会把ntldr调入内存,从而把控制权交给ntldr,ntldr再根据boot.ini中的配置以及用户的选择去加载相应操作系统的系统加载工具,从而启动系统。 同理,windows vista/7的引导加载器及配套组建分别是bootmgr和bcd;新版linux的是grldr和grub.cfg;旧版本的linux是grldr和menu.lst。 需要说明的是,一台计算机上安装多个操作系统时,默认情况下最后安装的操作系统都会把mbr中的内容改成自己的引导加载程序,如果最后安装的系统比已经存在的系统版本低,那么它的引导加载器就不能自动识别已经存在的系统,就会造成已经存在的系统无法启动。 例如,一台计算机上先安装了windows7,后来安装了xp,那么不借助第三方工具的话windows7就会无法启动。 同一系列高版本系统可以自动识别低版本系统,所以如果先安装了xp,后安装windows7,windows7就会把xp的启动项加入自己的bcd中,形成包含有winsows7和xp的启动菜单列表供用户选择,如果用户选择了windows7,启动过程继续进行,bootmgr把控制权交给windows7的系统加载器winload.exe,如果用户选择了xp,bootmgr会把控制权交给ntldr,由ntldr去启动xp,这样就形成了多重引导。在这个例子中,bootmgr处于第一层,winload.exe与ntldr并列处于第二层。 有些系统的引导加载器功能比较强大,具有管理功能,可以识别其他系列的系统。例如linux自带的grub就可识别windows系列的系统,在改写mbr后可以把windows系列的系统加入自己的启动配置文件menu.lst或者grub.cfg,因此在windows系统与linux系统共存的机器上可以先安装windows系列的系统,再安装linux系列的系统。 当然了,上面讲的都是相对简单的,但是不够灵活的安装方式。这样的安装方式一般会有一些通病: 1、启动菜单过于复杂且臃肿 2、重新安装系统后往往造成其他的系统不能启动 了解系统的启动原理后,我们就可以借助一些工具按照自己的意愿来安装和管理这些系统了。 下面介绍几个相关的辅助工具,这些工具中有的是系统自带的,有的是第三方工具。 bootsect.exe 此工具是引导扇区修复工具,也可以说是引导扇区转换工具。它是专门针对windows7和xp系统来修复引导扇区的,是win7/vista内自带的工具,使用命令如下: bootsect.exe /nt60 C: 这是修复win7/vista的例子,同理/nt52就是修复xp的命令。如果你把mbr给格式化了,有没有光驱,那么你就可以从硬盘(优盘)安装了,只需要输入这条命令,再把安装文件中的几个pe、内核文件拷入C盘,再根据提示安装就可以了。 bcdedit 这是一款编辑bcd内容的软件,也是vosta/win7自带的软件,其命令较复杂,这里不再介绍。 Easybcd 这是一款很好用的第三方软件,其功能包含了bcdedit的功能,但是比后者要强大得多,且是图形界面。 Grub for dos(grub4dos) 这是一款基于linux自带的grub而开发的能够同时引导windows和linux的的引导加载器,具有管理功能,是一款第三方软件。 Windows与linux共存 下面说一下windows