首先,UEFI也是一种 BIOS,区别就在于 Legacy BIOS没有UEFI这么灵活,为什么这么说呢?
Legacy BIOS你可以看作是一块机器的操作面板,里面有很多开关,我们平常在里面做的一些设定,不过是在扳动开关而已。也就是说Legacy BIOS的东西是固定的,你无法做出真正的改变,你的设定改变,只不过是主板把你的最终开关打向了哪一边记录下来了而已。因为 BIOS芯片的容量是很小的,1M或2M,8M,它无法再做更多的事了,只能允许你改一改记录。而要想真正改变这个系统,你需要把它拿到别的系统下去做变更,也就是硬刷。硬刷才是真正的改BIOS!就像你把那块面板拆下来,重新接或换几个开关之类操作。
刚刚说了, Legacy BIOS由于容量小,它只能作一些记录和硬件进行一些简单的通讯,比方说,在BIOS里可以认得到硬盘,但是它也只能做到这一步了,它不知道硬盘里面有啥文件,就是不能给硬盘文件列表,UEFI可以做到这一点,UEFI认识硬盘,也知道硬盘里面有啥东西。有没有像顺丰跟美团的感觉?顺丰快递员知道你有件,但是不知道你是什么件,而美团则不仅知道你有单,还知道你点的是啥,厉害的小哥,还可以代你做很多事。
UEFI更像一个小型的系统了。原来传统BIOS除了把主板上的硬件信息读取交给操作系统后,就等着系统发号施令了,在硬件层和软件层传递、交换信息,忙得一匹,却毫无头绪。传统BIOS和操作系统是一对一的关系,一次只能引导一个操作系统,而UEFI则可以轻松引导多系统。因为UEFI有专门的EFI分区,分区可以达到600MB,可以往里面写入的东西就多了,所以可玩性比传统BIOS强太多了,由于UEFI规范可以对硬盘上的文件列表,有了适当的引导器,比方说opencore,那么就可以 在操作系统启动之前可以任意抓取OS Loader并陈列出来,供你决定进入哪一个OS,妥妥的皇上选妃的感觉啊。
UEFI一开始是微软和英特尔联合其他大公司搞出来的硬件接口规范,想一想啊,为啥微软要搞这个东西呢?因为他有需要啊!为什么这么说呢?因为大容量硬盘的产生逼得他不得不做这个事啊。大容量硬盘及GPT分区出来后,微软的操作系统要想在旧的硬件或者新的硬件上启动,windows就必须作出一个判断,这台系统硬盘的分区是使用的MBR还是GPT分区,这就需要加载些文件来作判断了,原来的BIOS显然不能完成这项工作。
如果往深处想,可能你会发现,组成系统的单个要素,本质上也是一堆的开关,但为什么CPU+内存+输入输出端+操作系统就构成了一个系统呢?首先,CPU里面有逻辑门,控制逻辑门就可以进行加减乘除运算,更高级的运算则是结合了四则运算、关系运算、逻辑运算来达成,也就是说CPU在内存的帮助之下,实现了逻辑层,在逻辑层之上的运算已经与底层的开关不相干了,也就是说底层的物理开关,在不同的时序上的重复,意义是完全不一样的。
将来的人机接口,或者说机脑接口,其实也是一种固件接口,它的规范,我们应该也要趁早实现,抢先一步,占领高地。
以上是我自己一点粗浅的理解,下面是正式的说明,来看看吧:
引导操作系统
您如何运行第一个程序?
保罗·克尔扎诺诺夫斯基(Paul Krzyzanowski)
2015年1月26日
介绍
有时将一个操作系统称为“第一个程序”,它使您可以运行其他程序。但是,它通常作为文件(或更常见的是文件集合)存储在磁盘上。这个“第一个”程序如何运行?
PDP–11 / 70前面板
操作系统是通过引导过程(简称为booting)加载的。一个引导装载程序是其任务是加载一个较大的程序,如操作系统的程序。
当您打开计算机时,其内存通常未初始化。因此,没有什么可运行的。早期的计算机将具有使操作员能够按下按钮以从打孔卡,打孔纸带或磁带驱动器中加载字节序列的硬件。计算机前面板上的开关将定义数据源和目标内存地址。在某些情况下,引导加载程序软件将被硬连接为非易失性存储器(在早期的计算机中,这将是一排网格,在需要0位的适当位置进行了切割)。
在早期的小型计算机和微型计算机系统中,计算机操作员会使用计算机前面板上的开关来切换代码以加载更大的程序,对每个内存位置进行编程,然后启动程序。该程序可能会做一些基本的事情,例如从电传打字机附带的纸带上将连续的字节读入内存。
在以后的系统中,只读存储器将包含一个小的引导加载程序,该引导加载程序将具有基本的智能功能,可以读取磁盘的第一个扇区(512字节)。
由于此初始程序必须尽可能小,因此功能最少。经常发生的情况是,引导加载程序会加载另一个引导加载程序,称为第二阶段加载程序,该加载程序更为复杂。该第二阶段加载器可能会进行错误检查,其中可能还包括其他功能,例如,使用户可以选择要引导的操作系统,加载诊断软件的能力或在操作系统中启用诊断模式。这种具有引导加载程序加载较大引导加载程序的多阶段引导加载程序,称为链加载。
引导加载程序通常会执行系统硬件的某些核心初始化,然后加载操作系统。加载操作系统后,引导加载程序会将控制权转移给它,不再需要。如果需要,操作系统将自行初始化,配置系统硬件(例如,设置内存管理,设置计时器,设置中断)并加载设备驱动程序。
基于英特尔(IA–32)的启动
为了具体说明引导过程的示例,让我们看一下32位兼容Intel的PC(稍后将介绍64位系统)。该体系结构称为IA–32(32位英特尔体系结构),定义了自1986年推出的英特尔80386以来大多数英特尔微处理器的指令集。它仍受英特尔最新处理器的支持。
基于IA–32的PC有望在非易失性存储器(过去为ROM,如今为NOR闪存)中具有BIOS(基本输入/输出系统,包括引导加载程序固件)。BIOS是在早期CP / M系统上发现的BIOS的后代,它包含用于访问某些基本系统设备的低级功能,例如执行磁盘I / O,从键盘读取和访问视频显示。它还包含用于加载第1阶段引导加载程序的代码。
当启动时重置CPU时,计算机将在内存位置开始执行0xffff0(IA–32体系结构使用segment:offset寻址形式;代码段设置为 0xf000,指令指针设置为fff0)。
处理器以实模式启动,这使它只能访问20位内存地址空间,并提供对I / O,中断和内存的直接访问权限(当处理器使用32位寻址和虚拟内存时,它将起作用切换到保护模式)。该位置0xffff0实际上位于BIOS ROM的末尾,并包含对包含启动代码的BIOS区域的跳转指令。
启动后,BIOS将按照以下顺序进行操作:
1、开机自检(POST)
2、检测视频卡(芯片)的BIOS并执行其代码以初始化视频硬件
3、检测其他任何设备的BIOS并调用其初始化功能
4、显示BIOS启动屏幕
5、执行简短的内存测试(确定系统中有多少内存)设
6、置内存和驱动器参数
7、配置即插即用设备(传统上是PCI总线设备)
8、分配资源(DMA通道和IRQ)
9、识别启动设备
当BIOS识别引导设备(通常是标记为可引导磁盘的几个磁盘之一)时,它将从该设备读取块0到内存位置0x7c00并跳转到该位置。
阶段1:主启动记录
第一个磁盘块(块0)称为主引导记录(MBR),其中包含第一阶段引导加载程序。由于标准块大小为512字节,因此整个引导加载程序必须适合该空间。MBR的内容是:
第一阶段引导加载程序(≤440字节)
磁盘签名(4个字节)
磁盘分区表,用于标识磁盘的不同区域(每个分区16个字节×4个分区)
阶段2:卷启动记录
BIOS将控制权转移到已加载到内存中的MBR的开头后,MBR代码将扫描其分区表并加载该分区的卷启动记录(VBR)。VBR是从指定分区的第一个磁盘块开始的一系列连续块。VBR的第一个块标识分区的类型和大小,并包含一个初始程序加载器(IPL),该代码是将加载组成第二阶段引导加载程序的其他块的代码。在Windows NT派生的系统(例如Windows Server 2012,Windows 8)上,IPL加载一个名为NTLDR的程序,然后该程序加载操作系统。
低级引导加载程序很难加载完整的OS(尤其是可能由多个文件组成的OS)的原因之一是,这样做需要解析文件系统结构的能力。这意味着要了解目录和文件名的布局方式,以及如何查找与特定文件相对应的数据块。没有太多代码,仅读取连续的块会容易得多。更高级别的加载程序(例如Microsoft的NTLDR)可以读取NTFS,FAT和ISO 9660(CD)文件格式。
超越Windows
在Intel PC上引导其他操作系统有多种变体。在Linux系统上,一种流行的引导加载程序是 GRUB或GRand Unified Bootloader。GRUB还是一个多级引导加载程序。BIOS当然会做它通常会做的事情:识别可引导设备,加载主引导记录,并将控制权转移到此新加载的代码。在GRUB下,MBR通常包含称为GRUB Stage 1的第一阶段引导加载程序。此第1阶段引导加载程序将加载GRUB第2阶段。第2阶段加载程序为用户提供了要引导的操作系统的选择,并允许用户为这些系统指定任何其他引导参数(例如,强制使用最大内存,启用调试)。然后,它读入所选的操作系统内核并将控制权转移给它。
使用GRUB引导Windows的一个特定问题是Windows不 兼容Multiboot。Multiboot是关于使用单个引导加载程序加载多个操作系统的Free Software Foundation规范。在这种情况下,GRUB所做的只是传统的Windows启动过程。它引导通常位于MBR中的引导加载程序(或运行Windows引导菜单程序)。从那时起,GRUB不再可用,Windows不知道发生了什么,本机Windows启动过程将接管工作。
再见,BIOS。您好UEFI
随着64位架构取代32位架构的出现,BIOS开始显得过时了。英特尔着手创建BIOS后续产品的规范,该规范没有限制,即必须以20位寻址在16位模式下运行启动代码。该规范称为统一可扩展固件接口或UEFI。尽管它是由英特尔开发的,但自2005年以来由Unified EFI论坛进行管理。许多更新的64位系统(包括Mac)都使用它,它们也具有用于运行Windows的旧版BIOS支持。
EFI支持的一些功能包括:
BIOS组件
从BIOS保留了一些组件,包括电源管理(高级配置和电源接口,ACPI)和系统管理组件(例如,读取和设置日期)。
支持更大的磁盘
BIOS每个磁盘仅支持四个分区,每个分区最多可容纳2.2 TB。UEFI支持的最大分区大小为9.4 ZB(9.4×10 21字节)。
无需以16位(实际)模式启动
引导前执行环境使您可以直接访问所有系统内存。
设备驱动程序
UEFI包括设备驱动程序,包括解释与体系结构无关的EFI字节码(EBC)的能力。但是,操作系统使用它们自己的驱动程序,因此,与BIOS一样,这些驱动程序通常仅用于引导过程。
引导管理器
这是很重要的。旧的BIOS仅具有加载单个块的功能,因此需要多阶段引导过程。UEFI具有自己的命令解释器和完整的启动管理器。您不再需要专用的引导加载程序。只要将可引导文件放入UEFI引导分区,该分区的格式设置为FAT文件系统(旧Windows系统中的标准文件系统格式;几乎每个操作系统都知道如何处理)。
可扩展性
固件是可扩展的。UEFI的扩展可以加载到非易失性存储器中。
使用UEFI引导
使用UEFI,不再需要主引导记录来存储第1阶段引导加载程序。UEFI具有聪明的能力来解析文件系统并自行加载文件,即使该文件不占用连续的磁盘块也是如此。相反,UEFI读取GUID(全局唯一标识符)分区表(GPT),该表位于块0之后的块中(由于遗留原因,MBR仍位于该块中)。GPT描述了磁盘上分区表的布局。由此,EFI引导加载程序将识别EFI系统分区。该系统分区包含用于设备上其他分区上安装的所有操作系统的引导加载程序。对于支持EFI的Windows系统,UEFI加载 Windows引导管理器(bootmgfw.efi)。对于较旧的64位NT系统,EFI将加载IA64ldr。对于Linux,有很多选择。两种最常见的是使用GRUB(大Unified Bootloader的)的EFI感知版本并加载一个文件,如grub.efi或有EFI负荷负载ELILO.EFI的EFI装载机。
通常,即使使用UEFI,占主导地位的方法是加载专用于特定操作系统的引导加载程序,而不是直接加载该操作系统。但是,不再需要需要加载多个引导加载程序的多阶段引导过程。
非英特尔系统
到目前为止,我们的整个讨论都集中在启动基于Intel PC的体系结构(包括IA–32 / IA–64兼容体系结构,例如AMD的体系结构)上。这是当今PC(通过服务器的笔记本)中的主要体系结构,但是那里有很多非英特尔设备,特别是在嵌入式设备(例如手机)中。那他们呢?
引导过程有许多实现。许多嵌入式设备不会加载操作系统,但是已经将其存储在非易失性存储器(例如闪存或ROM)中。例如,那些加载OS的操作系统(例如基于ARM的Android手机)将在设备开机时在只读存储器(通常在NOR闪存)中执行代码。此引导代码嵌入在某些设备的CPU ASIC中,因此您无需在板上安装单独的闪存芯片。
当系统复位(包括加电)时,处理器处于超级用户(SVC)模式,并且中断被禁用。在基于ARM的系统上,处理器从address开始执行 0x00000000。包含启动代码的闪存映射到地址0x00000000重置时。该代码执行各种初始化,包括在DRAM中设置异常向量表以及将应用程序代码从ROM复制到DRAM(代码在DRAM中运行得更快)。该代码将DRAM重新映射到地址0,从而隐藏了闪存(处理器具有REMAP位以更改闪存的映射)。然后初始化存储系统。这涉及设置内存保护和设置系统堆栈。然后初始化I / O设备,并将处理器更改为用户模式。引导固件会检测可引导媒体并加载并运行第二阶段引导加载程序(如有必要)。第二阶段引导加载程序对于大型系统通常是GRUB,对于嵌入式系统通常是uBoot。该第二阶段加载器加载操作系统并将控制权转移给该操作系统。
Mac OS X
至少在OS 8和OS X上,基于PowerPC的Apple Macintosh系统的较旧版本均基于开放固件。开放式固件起源于Sun,并在非Intel Sun计算机中使用。苹果公司切换到英特尔系统后,便采用了UEFI作为其启动级固件。
较旧的Mac
开放式固件存储在ROM中,并且像PC BIOS一样在开机时执行。由于开放固件被设计为与平台无关,因此它以Forth(一种基于堆栈的简单语言)实现,并被编译为字节码而不是本机指令。固件包含字节码解释器。
与BIOS不同,开放式固件(Open Firmware)为用户提供了一个命令行处理器,从中可以编辑系统配置参数,例如减少物理内存量,调试系统甚至启动telnet服务器,以便您可以与通过以太网连接从远程计算机执行固件和启动过程。
在引导操作系统之前,开放式固件通过探测主板和扩展设备上的组件来生成设备树。
与PC BIOS一样,Open Firmware包含设备驱动程序,固件中的引导过程可用于访问磁盘,键盘,显示器和网络。但是,这些驱动程序全部在Forth字节码系统FCode中实现。与BIOS一样,这些驱动程序仅在引导过程中使用。操作系统本身具有自己的本机运行时驱动程序。
与BIOS不同,Open Firmware可以解析HFS / HFS +文件系统(Mac上的本机文件系统),因此您可以使用Open Firmware命令解释器从硬盘加载启动文件并运行它。默认情况下,Open Firmware从系统分区加载文件。在OS 9系统上,这是“系统”文件夹中名为“ Mac OS ROM”的文件。在OS X系统上,它会加载 /System/Library/CoreServices/BootX。BootX是引导加载程序,然后将其加载到内核中。
现代的Mac
Mac将UEFI用作其系统固件。
Mac启动时,执行的第一个代码是BootROM。这将为相关的硬件设备设置EFI驱动程序,初始化一些硬件接口,验证是否有足够的内存可用,并执行简短的开机自检。与PC BIOS(对文件系统一无所知,只能读取原始磁盘块)不同,Mac上的UEFI已扩展为可以解析磁盘上的FAT(传统DOS / Windows)和HFS +(本地Mac)文件系统。它读取GPT(GUID分区表)以标识磁盘分区。默认启动卷存储在NVRAM中。
HFS +卷标头(位于HFS +文件系统开头的数据)没有指定引导加载程序的路径,而是指向受祝福的文件或受祝福的目录(请参阅 bless命令。如果目录是受祝福的,则表明EFI固件可以在该目录中查找引导加载程序。如果文件受保护,则告诉EFI固件将该文件作为引导加载程序进行加载(存在其他变化,例如从未安装的卷进行引导)。
默认情况下,引导加载程序位于 /System/Library/CoreServices/boot.efi磁盘的根(通常是)分区上。
或者,固件支持从网络服务器(netboot服务器)下载第二阶段的引导程序或内核。
当boot.efi文件被加载,计算机显示器屏幕上的一个金属的苹果标志。引导加载程序以及基本的驱动程序扩展会加载到内核中,然后再运行 launchd来执行各种启动脚本和程序。装入内核后,旋转的齿轮会出现在Apple徽标下方。当内核运行第一个进程launchd时,屏幕变为蓝色。
有关OS X如何启动的说明,请参见“ 什么是Mac OS X”。
为了支持引导基于BIOS的操作系统,例如使用GRUB或其他支持BIOS的引导加载程序的较旧Windows系统和Linux系统,EFI从系统固件中安装了“兼容性支持模块”(CSM)组件。然后,这将启动基于BIOS的引导过程。仅当用户选择Windows作为要启动的默认操作系统时,才会加载此兼容性支持模块。现在,引导过程是基于标准BIOS的引导。加载并执行主启动记录(MBR),然后查找并加载Windows(或Linux)分区的卷启动记录。
看完以上,觉得自己那点粗浅理解在某些点上还是嵌合地很到位的,相较于这种教堂式的解说,应该是更好理解的吧。
原文地址:https://www.cs.rutgers.edu/~pxk/416/notes/02-boot.html