BIOS,全称Basic Input/Output System。
知道BIOS的人并不多,可能自己安装过操作系统的人会了解一些,但是大多也仅限于在BIOS setup下操作一些东西,比如说启动顺序等。
下面是一个BIOS的setup界面:
几乎所有的PC都有BIOS,它被存放在主板上的非易失性介质中,是主机上电后运行的第一个软件。
而由于它不同于一般的软件,当然也不是硬件,所以它被归类为固件(英文是firmware,通常被存放在SpiFlash或者EEPROM或者EMMC中),它可以说是硬件和软件之间的桥梁,之后会讲到,BIOS会获取大量的硬件信息,并传递个OS,算是名副其实的桥梁。
除了这个桥梁作用,BIOS的其它使命还包括:初始化硬件、测试硬件等,当然,最终的目的就是加载操作系统。
通常BIOS会被认为是随着IBM PC的出现而产生的。
实际上BIOS要早于IBM PC,早在1975年,BIOS的概念就在CP/M系统上出现。
之后的八九十年代MS-DOS占了操作系统的主流,而它跟BIOS是好朋友,事实上,MS-DOS上的中断就是BIOS提供的。
这一二十年中,BIOS一直保持着比较稳定的状态,貌似发展不大,反正没有找到具体的资料说BIOS在这个计算机巨大变革的时代中有什么出彩的事例。
九十年代的中期,Intel在它的Intel–HP Itanium系统中,由于受到BIOS固有的一些限制(毕竟太老了),Intel有了寻找BIOS替代品的打算。
最初并不是叫UEFI,先是叫Intel Boot Initiative,然后更名为EFI(全称Extensible Firmware Interface,因为BIOS是固件嘛,它就是扩展的固件),再然后Intel将EFI开源了,就叫作了Unified EFI,简称UEFI。
在2000年,Intel自家的Itanium平台用上了EFI。到2014年的时候,基本出厂的x86架构的PC都使用了UEFI。不仅是x86,目前ARM也开始支持UEFI了。
所以,基本上以后就是UEFI来替代BIOS了。
下面主要讲的是UEFI的东西,传统的BIOS不在这里讲了,其实是因为知道的也不多。
UEFI的基础主要通过几张图来展示。
第一张是UEFI的概念图:
红框部分都属于BIOS。下面简单的介绍下:
1)最右下角的部分是Platform Hardware,主要是指硬件的初始化;在这里里面,还有一个圆柱形,表示的是存储介质(比如硬盘,它常用圆柱形来表示),其中存放着与OS相关的东西,比如OS,以及OS Loader;常见的OS Loader有grub、lilo等,不过它们是legacy的,意思是支持的是传统的OS;对于支持UEFI的OS,在系统安装时通常会有一个名为Boot.efi(具体名字有点记不得了,反正类似,根据32位和64位还会不同)的UEFI应用,系统启动时UEFI会搜索储存介质中的这个文件并运行,而它的工作就是加载OS。
2)在Platform Hardware之上的是EFI Services,它主要分为Boot Services和Runtime Services,它们提供了一些基础的服务,来保证UEFI和OS的基本功能。两者主要的差别简单来讲就是前者在UEFI阶段用,后者在OS下用(当然前提是OS支持)。
3)上图的左侧,并排放置着一些表示接口的东西,比如ACPI、SMBIOS等。它们本身是与UEFI没有直接联系的一些计算机协议,不过UEFI下有相关的实现,这些协议保证了UEFI和OS的联系。
4)红框部分最上层是OS Loader,就是用来加载OS的了。以后有机会可以讲讲grub、lilo和Boot.efi,其中grub分1和2两个版本,两者差别极大;lilo有个EFI的版本称为elilo,可以在EFI Shell下直接运行并加载OS。这里还需要说明下BIOS和UEFI加载OS的一个区别:BIOS不支持文件系统,因此对于OS Loader,只支持从特定的位置去读取(比如MBR);而UEFI支持文件系统,因此在UEFI启动的过程中就可以识别到存储介质的文件系统并获取到需要的文件。
下一张图是UEFI的流程图:
UEFI大致分为4个阶段(就是从左到右的前4个):
1)SEC:这个阶段的代码以汇编为主;做的事情大致有:获取CPU检测结果,找到PEI相关的二进制,跳转到PEI入口;
2)PEI:这个阶段开始,代码都是C语言为主了;主要做的事情是CPU的初始化和内存的初始化(也可以看做是CPU初始化的一部分,因为内存控制器也是CPU的一部分,单独把它列出来是因为它的重要性),最终将CPU和内存等信息通过一种称为HOB的东西传递到下一阶段;
3)DXE:这个阶段会运行很多称为Driver的模块,每一个模块都可以是独立的,并完成不同的工作,它们之中有的提供功能,有的用来初始化硬件,不一而足;
4)BDS:这个部分从名字上来看,应该是用来生成启动选项并选择一个启动选项来加载OS的,这确实是它的一个主要功能。但是除此之外,它还有一个功能就是硬件的初始化。之前的DXE阶段也有硬件初始化,但是如果想要系统能够运行的更快,《UEFI Spec》建议在这里初始化硬件,这就要求这个硬件初始化模块满足一个的格式,称为UEFI Driver Model。这里不具体介绍,可以参考《UEFI Spec》
在这之后就是加载OS和OS的运行,这个过程中UEFI可以有部分的参与,但是作为UEFI的阶段已经结束。
下面一张图与上一张类似,也是流程图,不过下图涉及到了UEFI实现中的一些具体部分:
UEFI需要兼容之前的OS。
前面已经提到,支持UEFI的OS会在安装好的系统中存放Boot.efi文件供UEFI来获取并加载系统。
而对于老的OS(legacy OS),并没有这样的东西,它的OS Loader一般都放在MBR中。
除了这一点,对于一些老一点的外设,它可能需要使用中断来进行初始化,而UEFI本身并没有提供传统的INT中断。
所以在UEFI中提供了一个兼容模块,称为CSM,全称Compatibility Support Module。