从我们按下开机键到进入到操作系统之前的系统初始化动作,即是BIOS run的过程。如今操作系统已经从枯燥的文本时代演化到丰富多彩的图形界面,而BIOS却一直延续着枯燥的过程,BIOS设置也一直是单调的蓝底白字格式。BIOS的坚持出于两个原因:1⃣️ 外因是BIOS基本能够满足市场需求;2⃣️ 内因是BIOS的设计使得BIOS的升级和扩增变得非常困难。
随着64位CPU逐渐取代32位CPU,BIOS越来越不能满足市场需求,这使得UEFI作为BIOS的替代者应运而生。
BIOS全称“基本输入输出系统”(Basic Input/Output System),它是存储子主板ROM里的一组代码。BIOS程序运行在实模式下,是模式下最大的寻址范围是1MB,0xC0000~0xFFFFF保留给BIOS使用。开机后,CPU跳转到0xFFFF0处执行,一般这里是一条跳转指令,跳转到真正的BIOS入口处执行。BIOS POST阶段执行完后,BIOS会将控制权交给引导程序,最终引导进入操作系统。
1.BIOS缺点:
①开发效率低:大部分BIOS代码使用汇编开发,开发效率低;汇编开发的另一个缺点是使得代码与设备的耦合程度太高,代码受硬件变化的影响大;
②性能差:BIOS基本输入输出服务需要通过中断来完成,开销大,并且BIOS没有提供异步工作模式,大量时间消耗在等待时间上;
③功能扩展性差,升级缓慢:BIOS代码采用静态链接,增加硬件功能时,必须将16位代码放置在0xC0000~0xDFFFF区间,初始化时将其设置为约定的中断处理程序。而且BIOS没有提供动态加载设备驱动的方案;
④安全性差:BIOS运行过程中对可执行代码没有安全方面的考虑;
⑤不支持从硬盘2TB以上的地址引导:受限于BIOS硬盘的寻址方式,BIOS硬盘采用32位地址,因而引导扇区的最大逻辑块地址是2的32次方(2TB)。
UEFI全称“统一可扩展固件接口”(Unified Extensible Firmware Interface),定义了操作系统和平台固件之间的接口,它是UEFI Forum发布的一种标准。它是一种标准,没有提供实现。其实现由其他公司或开源组织提供。如Intel公司提供的开源UEFI实现TianoCore和Phoenix公司提供的SecureCore Tiano。
UEFI发端于20世纪90年代中期的安腾处理器。相对于当时流行的IA32(Intel Architecture 32)系统,安腾是一种全新的64位系统,BIOS的限制对于这种64位系统变得不可接受。1998年Intel发起了Intel Boot Initiate项目,后来更名为EFI。2005年,Intel联手微软、AMD、联想等11家公司成立了Unified EFI Forum,负责制定统一的EFI标准。第一个UEFI标准--UEFI2.0在2006年发布。
UEFI提供给系统的的接口包括启动服务(Boot Services)和运行时服务(Runtime Services)。
1.Boot Sevices:
从操作系统加载器(OS Loader)被加载到OS Loader执行ExitBootServices()的这段时间,是从UEFI环境向操作系统过渡的过程。这个过程被称为TSL(Transient System Load)。
在TSL阶段,系统资源通过Boot Service管理,Boot Service提供如下服务:
--事件服务:事件是异步操作的基础,有了事件的支持,才可以在UEFI系统内执行并发操作;
--内存管理:主要提供内存的分配与释放,管理系统内存映射;
--Protocol管理:安装与卸载Protocol的服务,以及注册Protocol通知函数的服务;
--Protocol使用类管理:Protocol的打开关闭,查找支持Protocol的控制器;例如要读写某个PCI设备的寄存器,可以通过OpenProtocol服务打开这个设备上的PciIoProtocol,用PciIo->Io.Read()服务可以读取这个设备上的寄存器;
--驱动管理:包括将驱动安装到控制器的connect服务,以及将驱动从控制器上卸载的disconnect服务。例如启动时,我们需要网络支持,则可以通过LoadImage将驱动加载到内存,然后通过connect服务将驱动安装到设备;
--Image管理:包括加载、卸载、启动和退出UEFI应用程序或驱动。
--ExitBootServices服务:用以结束启动服务;
2.Runtime Service:
--时间服务:读取设定时间,读取设定系统从睡眠中唤醒的时间;
--读写UEFI系统变量:读取设置系统变量,例如BootOrder用于指定启动顺序,通过这些系统变量可以保存系统配置;
--虚拟内存服务:将物理地址转换为虚拟地址;
--其他服务:包括启动系统的ResetSystem;
3.UEFI优点:
--开发效率高:BIOS开发一般采用汇编语言,代码多是硬件相关。而在UEFI中,绝大部分代码采用C语言编写,UEFI应用程序和驱动甚至可以用C++编写。UEFI通过固件-操作系统接口(BS、RT)为OS和OS加载器屏蔽了底层硬件细节,使得UEFI上层应用可以方便重用;
--可扩展:UEFI可扩展性体现在两个方面:一是驱动的模块化设计;二是软硬件升级的兼容性。大部分硬件的初始化通过UEFI驱动实现,每个驱动是一个独立模块,可以包含在固件中,也可以放在设备上,运行时根据需要动态加载;UEFI中每个表、每个Protocol都有版本号,这使得系统的平滑升级变得简单;
--UEFI系统性能:相比Legacy BIOS,系统有了很大提升,从启动到进入操作系统的时间大大缩短。性能提高源于:一、UEFI提供了一步操作,提高了CPU的利用率,减少了总的等待时间;二、UEFI舍弃了中端这种比较耗时的操作系统外部设备的方式,仅仅保留了时钟中断,外部设备的操作采用“时间+异步操作”完成;三、可伸缩的遍历设备的方式,启动时可以仅仅遍历启动所需要的设备,从而加速系统启动;四、系统安全性提高,这是UEFI的一个重要突破。当系统的安全启动设置被打开后,UEFI在执行应用程序和驱动前会先检测程序和驱动的安全证书,仅当安全证书被信任时才会执行这个应用程序或驱动。UEFI应用程序和驱动采用PE/COFF格式,其签名放在签名块中。
4.UEFI启动过程:
UEFI系统启动遵循UEFI平台初始化标准,分为7个阶段:SEC(Security,安全验证)--PEI(Pre-EFI Initialization,EFI前期初始化)--DXE(Driver Execution Environment,驱动执行环境)--BDS(Boot Device Select,启动设备选择)--TSL(Transient System Load,操作系统加载前期)--RT(Runtime,运行时)--AL(系统灾难恢复期)。
前三个阶段是UEFI初始化阶段,DXE阶段结束后,UEFI环境已经准备好。BDS和TSL是操作系统加载器作为UEFI应用程序运行阶段,操作系统调用ExitBootServices()服务后进入RT阶段。
其中我们关注的位SEC、PEI、DXE、BDS四个阶段。