BIOS与UEFI

BIOS 搭配 MBR/GPT 的开机流程

 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 的环境,那自然就无法读取核心文件,开机就失败了!

注意:由于 LBA0 供第一阶机管序代码,果你使 grub 开机管理程序的话,那么就得要额外分区出一个『 BIOS boot 』的分区槽, 这个分区槽才能够放置其他开机过程所需的程序代码!在 CentOS 当中,这个分区槽通常占用 2MB 左右而已。

由上面的说明我们会知道,BIOS MBR 都是硬件本身会支持的功能,至于 Boot loader 则是操作系统安装在 MBR 上面的一套软件了。由于 MBR 仅有 446 bytes 而已,因此这个开机管理程序是非常小而美的。 这个 boot loader 的主要任务有底下这些项目:

  • 提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
  • 载入核心文件:直接指向可开机的程序区段来开始操作系统;
  • 转交其他 loader:将开机管理功能转交给其他 loader 负责。

上面前两点还容易理解,但是第三点很有趣喔!那表示你的计算机系统里面可能具有两个以上的开机管理程序呢! 有可能吗?我们的硬盘不是只有一个 MBR 而已?是没错啦!但是开机管理程序除了可以安装在 MBR 之外, 还可以安装在每个分区槽的启动扇区(boot sector)喔!瞎密?分区槽还有各别的启动扇区喔? 没错啊!这个特色才能造就『多重引导』的功能啊!

我们举一个例子来说,假设你的个人计算机只有一个硬盘,里面切成四个分区槽,其中第一、二分区槽分别安装了 Windows Linux, 你要如何在开机的时候选择用 Windows 还是 Linux 开机呢?假设MBR 内安装的是可同时认识Windows/Linux 操作系统的开机管理程序,那么整个流程可以图标如下:

BIOS与UEFI


图 2.2.8、开机管理程序的工作执行示意图

在上图中我们可以发现,MBR 的开机管理程序提供两个选单,选单一(M1)可以直接加载 Windows 核心文件来开机; 选单二(M2)则是将开机管理工作交给第二个分区槽的启动扇区(boot sector)。当使用者在开机的时候选择选单二时, 那么整个开机管理工作就会交给第二分区槽的开机管理程序了。当第二个开机管理程序启动后,该开机管理程序内(上图中)仅有一个开机选单,因此就能够使用 Linux 的核心文件来开机啰。 这就是多重引导的工作情况啦!我们将上图作个总结:

  • 每个分区槽都拥有自己的启动扇区(boot sector)
  • 图中的系统槽为第一及第二分区槽,
  • 实际可开机的核心文件是放置到各分区槽内的!
  • loader 只会认识自己的系统槽内的可开机核心文件,以及其他 loader 而已;
  • loader 可直接指向或者是间接将管理权转交给另一个管理程序。

那现在请你想一想,为什么人家常常说:『如果要安装多重引导,最好先安装 Windows 再安装 Linux呢?这是因为:

  • Linux 在安装的时候,你可以选择将开机管理程序安装在 MBR 或各别分区槽的启动扇区, 而且 Linux loader 可以手动设定选单(就是上图的 M1, M2...),所以你可以在 Linux  boot loader 里面加入 Windows 开机的选项;
  • Windows 在安装的时候,他的安装程序会主动的覆盖掉 MBR 以及自己所在分区槽的启动扇区,你没有选择的机会, 而且他没有让我们自己选择选单的功能。

因此,如果先安装 Linux 再安装Windows 的话,那 MBR 的开机管理程序就只会有 Windows 的项目, 而不会有 Linux 的项目 (因为原本在 MBR 内的 Linux 的开机管理程序就会被覆盖掉)。 那需要重新安装 Linux 一次吗?当然不需要,你只要用尽各种方法来处理 MBR 的内容即可。 例如利用 Linux 的救援模式来挽救 MBR 啊!

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

使用程序语言

汇编语言

C 语言

 

 

硬件资源控制

使用中断 (IRQ) 管理不可变的内存存取

不可变得输入/输出存取

 

 

使用驱动程序与协议

处理器运作环境

16 位

CPU 保护模式

扩充方式

透过 IRQ 连结

直接加载驱动程序

第三方厂商支持

较差

较佳且可支持多平台

图形化能力

较差

较佳

内建简化操作系统前环境

不支援

支援

从上头我们可以发现,与传统的 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 执行较为方便。

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