浅谈UEFI启动

关于UEFI、GUID的一篇非正式简介

Posted by Myy on December 6, 2015

先说一下BIOS

BIOS,基本输入输出系统(Basic Input Output System).它在我们所熟知的操作系统启动之前就已经开始发挥作用,它负责在启动时对计算机硬件系统进行“自检”,若发现问题他会给出提示。之后它会从指定位置向内存载入操作系统的引导程序。

BIOS是一种“固件”,它通过一定方式固化在一个芯片上,这个芯片不像U盘一样可以轻松改写其中的内容,而是要采用一定方法。这里所说的方法,有时是通过紫外线照射并辅以专用写入器,有时是采用一定的电压来改写其内容(EEPROM,电可擦除可编程只读存储器)。我们的BIOS正是固化在一个EEPROM芯片上,并焊接或插在主板上。一般通过专用软件我们就可以向它写入新内容,来完成对BIOS的更新,以支持一些新的功能或(更多的是)修复某些bug。

BIOS会接受一些较为底层的设置来使计算机硬件按照需要的方式正常运转。比如设置总线频率、自动关机、启动方式、各接口工作状态等等。这些设置会储存在主板上另一个芯片里,CMOS芯片。因此对BIOS参数的设置又叫CMOS设置。

由于EEPROM通常只有数个MB的容量,很多功能无法在BIOS上实现。随着计算机的日益发展,BIOS由于大小限制无法一同进步,逐渐成为累赘。

再来说一下MBR

MBR即主引导记录。它一般存在于硬盘的第0个扇区。它有3部分:bootloader,磁盘分区表以及分区表有效标志0x55AA

bootloader由BIOS在自检后载入内存,负责操作系统接下来的启动引导。分区表用来标识磁盘分区情况。MBR分区表可提供4个分区,多于4个就得采用逻辑分区来解决。MBR分区表记录了每个分区的大小、起止位置、分区类型、活动标志等信息。

也就是说,mbr是否正常决定着系统是否能正常引导。因此在BIOS引导的时代,制作启动盘的一个关键步骤就是写引导扇区。由于BIOS缺少一个官方的、统一的标准,各个厂商都对其有着各种不同的扩展,导致制作启动盘常常出现各种问题。

另一方面,出现了一些专门攻击磁盘引导扇区的病毒,0号扇区一旦被破坏,系统便无法引导,而且由于0号扇区不可见,所以需要借助专门的磁盘工具修复。

还有一点就是:BIOS只是机械的加载0扇区的内容,因此只能启动1个bootloader,制作多起动很不方便。

UEFI是什么?好吃嘛?

UEFI,统一可扩展硬件接口.它由EFI(可扩展固件接口,没有统一)发展而来,维护这一标准的是一个称作Unified EFI Form的国际组织.它最初由intel提出推广,旨在提供在操作系统启动之前的一个 平台无关性的 启动服务。它的提出就是为了取代老旧而无统一标准的BIOS。UEFI的程序可以用C语言进行开发,相关文档和工具可以在uefi官网上下载。它的核心代码同BIOS一样固化在主板上的EEPROM上,但不同的是,UEFI对二次开发具有高度的灵活性,它除了初始化模块和驱动执行环境集成在EEPROM上,还可以通过加载一系列的驱动模块实现更多功能。UEFI的执行环境执行的通常是.efi格式的类似Java机制的“字节码”,因而扩展模块的开发甚至可以独立于UEFI固件开发,大大减低了开发难度。

因而UEFI逐渐展现出它的强大,通过一系列的驱动模块,它可以支持图形界面以及鼠标、触控板操作,从此CMOS设置开始变得平易近人(并没有)。CMOS中可以通过驱动访问到磁盘的每一个分区并在没有加载操作系统的情况下读写文件(UEFI标准规定一定支持的是FAT格式的分区,其它格式的分区可通过efi驱动实现)。多系统的幸福时代由此来临,bootloader不必写在0号扇区,只要你指定了它的路径,UEFI就能成功引导。当然,UEFI也有一个固定的默认路径来自动加载bootloader,那就是/efi/boot/boot*.efi(对于常见的64bit平台,这里的文件名是bootx64.efi)。对于我们的硬盘,UEFI环境下一般会建立一个ESP(EFI system partition)分区,专门用来存放EFI启动文件。当你有多个操作系统时,他们的bootloader都会在/efi下的不同文件夹里。若启动文件损坏,你所做的也只是简单的复制粘贴文件,再也不用写什么引导扇区了。

这时你可能已经猜到这个所谓的ESP分区就是一个FAT格式的分区。它平时被默认隐藏起来,当然你仍可以手动在操作系统中挂在它。如果硬盘上不存在ESP分区,系统就会继续寻找后面的分区,直到找到/efi/boot的目录结构。一般ESP分区是可以由你自己建立的一个FAT分区代替的。在UEFI环境下的启动盘制作也十分方便,只要保证/efi/boot下的bootloader正确即可,简单复制文件就能完成。

另外UEFI下还能运行UEFI shell,丰富的命令堪比dos。

GUID与GPT

全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

因此可以用GUID来唯一标识一个分区,由此产生的分区表称为GPT(GUID Partition Table)。这种分区表格式打破了MBR分区表只能有4个主分区的限制。在这里,每个分区都是主分区,他能完美的支持数个T的磁盘,你可以在windows中建立128个分区(什么?你先不够?好吧,windows只支持128个分区,真的不是GPT的锅。。。)相对于记录每个分区的卷标、容量或者分区号,用GUID表示这个分区具有的天都厚的优势,就是他是唯一的。

GPT无疑先进于MBR分区表,而且它向下兼容MBR分区表(GPT分区表中的一个组成部分就是原来的MBR分区表)。

MBR分区表可以通过一些工具转换成GPT,如Diskgenius(好吧,我承认只用过这一个)。

安利一个efi bootloader

clover efi bootloader,我开始接触它是在装黑苹果的时候(欢迎交流),它加载DSDT表、mac驱动强大功能让我叹服,后来我删了Yosemite,留下了clover(太好看了有木有),而且它可以直接引导linux不用通过grub,对传统bios也支持。下面是链接cloverEFIbootldr解压得到的文件放在ESP内即可。(不会的欢迎交流)

以上是我的一些个人认识,可能有很多错误,欢迎指正!