Linux启动过程——EFI

EFI简介

  Extensive Firmware Interface 可拓展固件接口,是英特尔公司推出的一种在类PC的电脑系统中替代BIOS的升级方案。EFI以小型磁盘分区的形式存放在硬盘上的,并非在BIOS的FLASH里面。

  EFI在开机时的作用和BIOS一样,都是初始化PC,但是在细节上也有区别。BIOS是对硬件按照一定顺序进行检查,而EFI不但检查硬件完好性,还会加载硬件在EFI中的驱动程序,不需要操作系统负责加载驱动。EFI最创新的地方就是颠覆了BIOS的界面概念,让操作系统和Windows一样易上手。EFI就像一个小型的操作系统。

EFI与传统BIOS对比

  如果操作系统主板使用的是BIOS,那么操作系统必须面对所有的硬件,大到主板显卡,小到键盘鼠标,每次重装系统或升级都必须手动安装新的驱动程序,否则硬件可能无法工作。而基于EFI的主板则方便很多,因为WEFI架构使用的驱动基于EFI Byte Code,它并不是由COU直接执行操作,而是需要EFI层进行翻译。对于不同的操作系统来说,EFI将硬件层与操作系统隔离开来,操作系统能够调用的是EFI留给EFI Byte Code的程序接口,而EFI Byte Code又直接和Windows的API联系,这就意味着无论操作系统是Windows还是Linux,只要有EFI Byte Code支持,只需要一份驱动程序就能支持所有操作系统平台。

  除此之外,EFI Byte Code还能绕过操作系统直接安装在EFI环境中。这样对硬件的控制就由EFI负责,EFI向操作系统提供硬件的操作接口,不需要操作系统再调用驱动。因此不需要进入操作系统,只需要进入EFI界面就可以更新驱动程序。而且不需要对每一个操作系统更新驱动,只需要EFI界面中升级一次,所有上层操作系统都可以直接调用新的EFI接口。

EFI的位置和组成

  BIOS芯片只有256KN大小,不足以存放EFI。EFI是以小型磁盘分区形式存放在硬盘上的。EFI必须安装在支持EFI功能的主板上,使用光驱引导系统,然后对磁盘进行EFI化处理,这个处理过程主要就是划分EFI独用的磁盘空间。

  EFI存储空间在百兆字节左右,具体视驱动文件多少而定(在磁盘管理器中可以看到我的电脑的EFI占用空间为300M)。其中通常包含:

  1. Pre-EFI初始化模块
  2. EFI驱动执行环境
  3. EFI驱动程序
  4. 兼容性支持模块(CSM)
  5. EFI高层应用
  6. GUID 磁盘分区
image-20210921152255319

EFI的启动过程

  在实现中,EFI初始化模块和驱动执行环境通常被集成在一个只读存储器中。Pre-EFI初始化程序在系统开机的时候最先得到执行,它负责最初的CPU,主桥及存储器的初始化工作,紧接着载入EFI驱动执行环境(DXE)。当DXE被载入运行时,系统便具有了枚举并加载其他EFI驱动的能力。在基于PCI架构的系统中,各PCI桥及PCI适配器的EFI驱动会被相继加载及初始化;这时,系统进而枚举并加载各桥接器及适配器后面的各种总线及设备驱动程序,周而复始,直到最后一个设备的驱动程序被成功加载。正因如此,EFI驱动程序可以放置于系统的任何位置,只要能保证它可以按顺序被正确枚举。例如一个具PCI总线接口的ATAPI大容量存储适配器,其EFI驱动程序一般会放置在这个设备的符合PCI规范的扩展只读存储器(PCI Expansion ROM)中,当PCI总线驱动被加载完毕,并开始枚举其子设备时,这个存储适配器旋即被正确识别并加载它的驱动程序。部分EFI驱动程序还可以放置在某个磁盘的EFI专用分区中,只要这些驱动不是用于加载这个磁盘的驱动的必要部件。在EFI规范中,一种突破传统MBR磁盘分区结构限制的GUID磁盘分区系统(GPT)被引入,新结构中,磁盘的分区数不再受限制(在MBR结构下,只能存在4个主分区),并且分区类型将由GUID来表示。在众多的分区类型中,EFI系统分区可以被EFI系统存取,用于存放部分驱动和应用程序。很多人担心这将会导致新的安全性因素,因为EFI系统比传统的BIOS更易于受到计算机病毒的攻击,当一部分EFI驱动程序被破坏时,系统有可能面临无法引导的情况。实际上,系统引导所依赖的EFI驱动部分通常都不会存放在EFI的GUID分区中,即使分区中的驱动程序遭到破坏,也可以用简单的方法得到恢复,这与操作系统下的驱动程序的存储习惯是一致的。CSM是在x86平台EFI系统中的一个特殊的模块,它将为不具备EFI引导能力的操作系统提供类似于传统BIOS的系统服务。

猜你喜欢

转载自blog.csdn.net/qq_45753394/article/details/120402154