双系统启动分析

来源:互联网 发布:彗星dns优化器安卓版 编辑:程序博客网 时间:2024/05/03 14:00

 

现在的操作系统都很大,所以在它能跑起来之前需要一个小程序把它载入内存,这个小程序就是boot loader(引导加载器)。boot loader可以被存在两个地方,一个是MBR(Master Boot Recorder),也就是硬盘的第一个扇区;另一个是每一个分区的第一个512字节的扇区,也就是所谓的boot sector。

在MBR里存有硬盘的分区表。因为MBR一般只有512字节大,所以一个硬盘只能有最多4个分区,叫主分区。幸运的是,其中一个分区可以是扩展分区,在里面可以划分很多个逻辑分区。在分区里面有一个可以被标志为启动分区,它的作用下面会说到。
在开始之前让我们先来回顾一下操作系统的启动顺序。
开机之后第一步是硬件初始化、Bios自检,完成之后Bios会去查看MBR。

如果Bios在MBR里找到了boot loader,就把它载入内存,让后把控制权移交给boot loader,至此Bios的使命宣告结束。
如果MBR里面没有boot loader——像windows的系统就是这样,boot loader并不存在MBR,而是存在系统盘的boot sector里——Bios会去查分区表,找到里面的启动分区,从它的第一个扇区加载boot loader。如果还是没有,那很不幸,系统就起不来了。
boot loader的作用其实很简单,核心功能就是把操作系统内核载入内存,然后启动内核开始执行就OK了。不过现在的boot loader都做的很灵活,像Grub,有很多的选项,可以加载多个系统,也能加载其他的boot loader,或是从某个分区启动。

现在就明白了,如果我们想引导多系统(经验所限,只值linux、windows),第一个要决定的就是用什么boot loader做主引导器,Bios直接把它引导起来,之后再用它去引导其他的系统或boot loader。因为终归还是用windows比较多,而且Grub更灵活,所以我一般都是选择用windows的ntldr来做主引导器。这样的话我们安装Grub(linux)的时候就不能把Grub装到MBR,只能装到所选分区。

用ntldr来引导windows不用说,保持原配置不变就可以了。要用它来引导Grub,就有两个事需要做。一,告诉ntldr,有一个新的引导选项。二,ntldr在哪儿可以找到新选项对应的引导器,也就是Grub。
第一个事在Vista之前都可以通过编辑C:/boot.ini来完成。就是在文件的最后加一行C:/linux.sec="Linux"。等号的后面是显示在ntldr里的启动选项的名字。等号前面指定了ntldr要载入的下一级boot loader也就是Grub所在的文件。至于在Vista及以后的系统里怎么完成这一步,下面再说。
对于第二个事,如果是Grub,我们可以直接指定要启动的分区就可以,但是ntldr似乎并不支持直接启动一个分区。所以得采取“曲线救国”的办法。上面说过,安装Grub的时候,要把它装在选定分区的boot sector。现在要做的则是把这个boot sector抠出来,存成一个C盘根目录下的文件,就是前面的C:/linux.sec。linux下可以用dd来方便的完成这个事,windows下则推荐用winhex,一个挺不错的二进制编辑器,据说还可以用它找回已经删除了的文件。记住指需要最开始的512字节就足够了。
对于Vista和之后的windows7,微软换了一个加载器windows boot manager,所以前面编辑boot.ini的办法就不灵了,不过目标还是一样,就是要告诉boot manager到哪儿去加载下一个boot loader。而且第二步的办法还是一样。
boot.ini的位置在windows boot manager里被BCD(boot configuration data)取代,所以现在要修改BCD,这就要用到bcdedit,以管理员身份打开一个command窗口就能找到。
可以用以下的命令来替代boot.ini中的那一行:
1. bcdedit /create /d "Linux" /application bootsector (这时会生成一个id以{asdfadsf})这样的内容
2. bcdedit /set {id} device partition=C:                     (id 就用之前生成的id)指定所在分区
3. bcdedit /set {id} path /linux.sec                            (id同理)指定boot loader所在文件
4. bcdedit /displayorder {id} /addlast                       (id同理)添加到启动菜单的最后
重启 就可以进Linux了。


最后这个方法是从这看来的 http://blog.csdn.net/px2wxh/archive/2009/08/24/4478274.aspx
对bcdedit这个命令的详细解释看这两篇文章:
http://technet.microsoft.com/zh-cn/library/cc709667(WS.10).aspx
http://hapeacock.blog.51cto.com/193534/76716

如果对BCD有兴趣,可以看这,有微软给出的详细技术文档:
http://www.microsoft.com/whdc/system/platform/firmware/bcd.mspx

 

原创粉丝点击