BIOS 与 UEFI搭配MBR与GPT 开机检测程序

来源:互联网 发布:数据驱动安全 百度云 编辑:程序博客网 时间:2024/05/29 14:30


基本上,目前的主机系统在加载硬件驱动方面的程序,主要有早期的 BIOS 与新的 UEFI 两种机制,

我们分别来谈谈!


一      BIOS 搭配 MBR/GPT 的开机流程

首先需要认识 BIOS 与 CMOS 两个东西, CMOS 是记录各项硬件参数且

嵌入在主板上面的储存器,BIOS 则是一个写入到主板上的一个韧体(再次说明, 韧体就是写入到硬
件上的一个软件程序)。这个 BIOS 就是在开机的时候,计算机系统会主动执行的第一个程序了!
接下来 BIOS 会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS 会依据使用者的设定去
取得能够开机的硬盘, 并且到该硬盘里面去读取第一个扇区的 MBR 位置。 MBR 这个仅有 446 bytes
的硬盘容量里面会放置最基本的开机管理程序, 此时 BIOS 就功成圆满,而接下来就是 MBR 内的开

机管理程序的工作了。



这个开机管理程序的目的是在加载(load)核心文件, 由于开机管理程序是操作系统在安装的时候所提
供的,所以他会认识硬盘内的文件系统格式,因此就能够读取核心文件, 然后接下来就是核心文件
的工作,开机管理程序与 BIOS 也功成圆满,将之后的工作就交给大家所知道的操作系统啦!
简单的说,整个开机流程到操作系统之前的动作应该是这样的:
1. BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
2. MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机管理程序;
3. 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
4. 核心文件:开始操作系统的功能...


第二点要注意,如果你的分区表为 GPT 格式的话,那么 BIOS 也能够从 LBA0 的 MBR 兼容区块

读取第一阶段的开机管理程序代码, 如果你的开机管理程序能够认识 GPT 的话,那么使用 BIOS
同样可以读取到正确的操作系统核心喔!换句话说, 如果开机管理程序不懂 GPT ,例如 Windows
XP 的环境,那自然就无法读取核心文件,开机就失败了!



NOTE:

由于 LBA0 仅提供第一阶段的开机管理程序代码,因此如果你使用类似 grub 的开机

管理程序的话,那么就得要额外分区出一个『 BIOS boot 』的分区槽, 这个分区槽才能够放置其他开机过程所需

的程序代码!在 CentOS 当中,这个分区槽通常占用 2MB 左右而已。



由上面的说明我们会知道,BIOS 与 MBR 都是硬件本身会支持的功能,至于 Boot loader 则是操作系
统安装在 MBR 上面的一套软件了。由于 MBR 仅有 446 bytes 而已,因此这个开机管理程序是非常小
而美的。 这个 boot loader 的主要任务有底下这些项目:
1.     提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
2.     载入核心文件:直接指向可开机的程序区段来开始操作系统;
3.     转交其他 loader:将开机管理功能转交给其他 loader 负责。



上面前两点还容易理解,但是第三点很有趣喔!那表示你的计算机系统里面可能具有两个以上的开机

管理程序呢! 有可能吗?我们的硬盘不是只有一个 MBR 而已?是没错!但是开机管理程序除了
可以安装在 MBR 之外, 还可以安装在每个分区槽的启动扇区(boot sector)!分区槽还有各

别的启动扇区? 没错啊!这个特色才能造就『多重引导』的功能啊!我们举一个例子来说:

假设你的个人计算机只有一个硬盘,里面切成四个分区槽,其中第一、二分区

槽分别安装了 Windows 及 Linux, 你要如何在开机的时候选择用 Windows 还是 Linux 开机呢?假设
MBR 内安装的是可同时认识 Windows/Linux 操作系统的开机管理程序,那么整个流程可以图标如下:


                           

在上图中我们可以发现,MBR 的开机管理程序提供两个选单,选单一(M1)可以直接加载 Windows 的

核心文件来开机; 选单二(M2)则是将开机管理工作交给第二个分区槽的启动扇区(boot sector)。当使
用者在开机的时候选择选单二时, 那么整个开机管理工作就会交给第二分区槽的开机管理程序了。
当第二个开机管理程序启动后,该开机管理程序内(上图中)仅有一个开机选单,因此就能够使用 Linux

的核心文件来开机。


这就是多重引导的工作情况!我们将上图作个总结:

1.     每个分区槽都拥有自己的启动扇区(boot sector)
2.     图中的系统槽为第一及第二分区槽,
3.     实际可开机的核心文件是放置到各分区槽内的!

4.     loader 只会认识自己的系统槽内的可开机核心文件,以及其他 loader 而已;

5.     loader 可直接指向或者是间接将管理权转交给另一个管理程序。


那现在请你想一想,为什么人家常常说:

『如果要安装多重引导, 最好先安装 Windows 再安装 Linux』
呢?这是因为:
1.
Linux 在安装的时候,你可以选择将开机管理程序安装在 MBR 或各别分区槽的启动扇区, 而且 Linux 的
loader 可以手动设定选单(就是上图的 M1, M2...),所以你可以在 Linux 的 boot loader 里面加入 Windows 开机
的选项;


Windows 在安装的时候,他的安装程序会主动的覆盖掉 MBR 以及自己所在分区槽的启动扇区,你没有选择
的机会, 而且他没有让我们自己选择选单的功能。
因此,如果先安装 Linux 再安装 Windows 的话,那 MBR 的开机管理程序就只会有 Windows 的项目,
而不会有 Linux 的项目 (因为原本在 MBR 内的 Linux 的开机管理程序就会被覆盖掉)。 那需要重新
安装 Linux 一次吗?当然不需要,你只要用尽各种方法来处理 MBR 的内容即可。 例如利用 Linux

的救援模式来挽救 MBR 啊!


这里只要先对于(1)开机需要开机管理程序, 而(2)开机管理程序可以安装在 MBR 及 Boot Sector 两处这两个观念有
基本的认识即可.



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


二   UEFI BIOS 搭配 GPT 开机的流程


我们现在知道 GPT 可以提供到 64bit 的寻址,然后也能够使用较大的区块来处理开机管理程序。但

是 BIOS 其实不懂 GPT 耶!还得要透过 GPT 提供兼容模式才能够读写这个磁盘装置~而且 BIOS
仅为 16 位的程序,在与现阶段新的操作系统接轨方面有点弱掉了! 为了解决这个问题,因此就有
了 UEFI (Unified Extensible Firmware Interface) 这个统一可延伸韧体界面的产生。
UEFI 主要是想要取代 BIOS 这个韧体界面,因此我们也称 UEFI 为 UEFI BIOS 就是了。UEFI 使
用 C 程序语言,比起使用汇编语言的传统 BIOS 要更容易开发!也因为使用 C 语言来撰写,因此
如果开发者够厉害,甚至可以在 UEFI 开机阶段就让该系统了解 TCP/IP 而直接上网! 根本不需要
进入操作系统耶!这让小型系统的开发充满各式各样的可能性!

基本上,传统 BIOS 与 UEFI 的差异可以用 T 客帮杂志汇整的表格来说明:




与传统的 BIOS 不同,UEFI 简直就像是一个低阶的操作系统~甚至于连主板
上面的硬件资源的管理, 也跟操作系统相当类似,只需要加载驱动程序即可控制操作。同时由于程
控得宜,一般来说,使用 UEFI 接口的主机,在开机的速度上要比 BIOS 来的快上许多! 因此很多
人都觉得 UEFI 似乎可以发展成为一个很有用的操作系统耶~不过,关于这个,你无须担心未来除
了 Linux 之外,还得要增加学一个 UEFI 的操作系统啦!为啥呢?UEFI 当初在发展的时候,就制定一些控制在里头,包括硬件资源的管理使用轮询 (polling) 的方式来管理,与 BIOS 直接了解 CPU 以中断的方式来管理比较, 这种 polling 的效率是稍微慢一些的,
另外,UEFI 并不能提供完整的快取功能,因此执行效率也没有办法提升。不过由于加载所有的 UEFI
驱动程序之后, 系统会开启一个类似操作系统的 shell 环境,用户可以此环境中执行任意的 UEFI
应用程序,而且效果比 MSDOS 更好。


所以,因为效果华丽但效能不佳,因此这个 UEFI 大多用来作为启动操作系统之前的硬件检测、
开机管理、软件设定等目的,基本上是比较难的。 同时,当加载操作系统后,一般来说,UEFI 就
会停止工作,并将系统交给操作系统,这与早期的 BIOS 差异不大。比较特别的是,某些特定的环
境下, 这些 UEFI 程序是可以部份继续执行的,以协助某些操作系统无法找到特定装置时,该装置
还是可以持续运作。


此外,由于过去 cracker 经常藉由 BIOS 开机阶段来破坏系统,并取得系统的控制权,因此 UEFI 加
入了一个所谓的安全启动 (secure boot) 机制, 这个机制代表着即将开机的操作系统必须要被 UEFI
所验证,否则就无法顺利开机!微软用了很多这样的机制来管理硬件。 不过加入这个机制后,许多
的操作系统,包括 Linux ,就很有可能无法顺利开机喔!所以,某些时刻,你可能得要将 UEFI 的
secure boot 功能关闭, 才能够顺利的进入 Linux !
另外,与 BIOS 模式相比,虽然 UEFI 可以直接取得 GPT 的分区表,不过最好依旧拥有 BIOS boot
的分区槽支持, 同时,为了与 windows 兼容,并且提供其他第三方厂商所使用的 UEFI 应用程序
储存的空间,你必须要格式化一个 vfat 的文件系统, 大约提供 512MB 到 1G 左右的容量,以让
其他 UEFI 执行较为方便。



NOTE:

由于 UEFI 已经克服了 BIOS 的 1024 磁柱的问题,因此你的开机管理程序与核心可
以放置在磁盘开始的前 2TB 位置内即可!加上之前提到的 BIOS boot 以及 UEFI 支持的分区槽,基本上你的
/boot 目录几乎都是 /dev/sda3 之后的号码了!这样开机还是没有问题的!所以要注意!与以前熟悉的分区状况
已经不同, /boot 不再是 /dev/sda1 !



注:本文主要出自鸟哥

0 0