今天就来说说BIOS,EFI,UEFI。下面就跟着小编一起来看看他们的详细区别吧。
BIOS、EFI和UEFI的详细说明
上一篇文章已经说过,BIOS是一个程序(详情点击此处),存储在BIOS芯片中。现在的新电脑基本都是UEFI启动,早期的过渡电脑都是EFI启动。事实上,EFI或UEFI的一部分也存储在一个芯片中。由于它们在表面形式和基本功能上与BIOS相似,我们习惯上把存储EFI/UEFI的芯片称为EFI/UEFI BIOS芯片。EFI/UEFI也叫EFI/UEFI BIOS,但其实它们和BIOS根本不一样,还是去掉后面“BIOS”的尾巴比较好。下面详细说说BIOS和UEFI。
前文指出BIOS用于计算机硬件自检、CMOS设置、引导操作系统、提供硬件I/O、硬件中断等四个主要功能,所以BIOS程序可以分为几个模块,包括引导块引导模块、CMOS设置模块、扩展配置数据(ESCD)模块和DMI硬件数据采集模块。其中,引导模块直接负责执行BIOS程序本身的入口以及计算机基本硬件的检测和初始化。ESCD用于在BIOS和OS之间交换硬件配置数据,DMI充当硬件管理工具和系统层之间的接口。通过DMI,用户可以直观地获得任何硬件信息。CMOS设置模块是对硬件信息进行设置并保存在CMOS中,是BIOS程序除启动初始化外最常用的功能。
BIOS本身就是汇编语言代码,在16位实模式下调用INT 13H中断来执行。因为x86-64是一个高度兼容的指令集,而且为了适应16位实模式下BIOS的运行环境,所以即使现在的CPU已经是64位了,在BIOS中启动的时候还是会在16位实模式下执行(基本上在2009年以前的主板上看到)。16位实模式下可直接访问的内存只有1MB。即使安装4G、8G或16G或32G内存,在BIOS中也只会识别前1MB。在这1MB的内存中,前640K称为基本内存,后384K留作启动必需的硬件和各种BIOS本身。了解了这些,下面就来说说BIOS引导电脑的具体过程。
按下电源开关,电源开始向主板等设备供电,此时电压仍不稳定。早期的南北桥主板上,主板北桥向CPU发送复位信号,初始化CPU;电压稳定后,复位信号被移除。对于现在的单南桥主板来说,CPU自己调节稳定电压来达到初始化的目的。当电压稳定后,CPU会在系统BIOS预留的内存地址执行jump BIOS start指令,开始POST自检。
在POST自检中,BIOS只检查系统必要的核心硬件是否有问题,主要是CPU,640K基本内存,显卡是否正常,PS/2键盘控制器,系统时钟等等。因为POST检查是在显卡初始化之前,如果在这个阶段出现错误,就无法显示在屏幕上。但是主板上有报警扬声器,如果主板的8255外设可编程接口芯片没有损坏,肯定会发出POST报警声。你可以根据警报声的不同来大致判断错误。一般短哔声基本代表正常启动,不同的错误是短哔声和长哔声的不同组合。开机自检后,BIOS开始调用中断来完成各种硬件初始化任务。
硬件初始化中,主要说明两点。第一,经过POST检测,电脑最后出现开机画面,说明显卡已经检测到,初始化已经完成。但是请注意,由于BIOS运行在16位实模式下,此屏幕以VGA分辨率(640*480,纵横比4:3)显示,因为VGA是实模式下支持的最高分辨率。以前14-17寸的小CRT显示器4:3的比例,最高分辨率比较低,所以这个开机画面没有违和感。但是现在的液晶显示器基本都是16:9的宽屏,分辨率也很高。所以在这样的显示屏下,开机画面上的一切都可以说是“惨不忍睹”;图形被拉伸,字体很大很模糊,显示字体的锯齿可以清晰看到。其次,BIOS只识别主引导记录(MBR)初始化的硬盘。这是因为后续的EFI或UEFI采用了新的GUID磁盘分区系统(GPT)格式,在BIOS下无法识别。在所有硬件初始化之后,下一步是更新ESCD。
在ESCD更新阶段,BIOS将检测存储在CMOS中并与操作系统交换的硬件配置数据。如果系统硬件发生变化,数据也会更新;否则保持不变。在ESCD检测或更新之后,BIOS将完成最后一项工作,即启动操作系统。
在这最后一步中,BIOS根据用户在CMOS中指定的硬件启动顺序,读取相应设备的启动或引导记录,引导相应设备上的操作系统启动并进入操作系统。之后,操作系统接替BIOS负责硬件和软件之间的相互通信。如果发现所有硬件都没有可以引导操作系统的记录,屏幕上会显示相应的错误信息,电脑会维持在16位实模式。
虽然BIOS是电脑开机必不可少的一部分,但从1975年诞生至今,近30年来根本没有改变过,比如16位汇编语言代码,1M内存寻址,调用中断执行。虽然经过各大主板厂商的不懈努力,BIOS有了ACPI、USB设备支持、PnP即插即用支持等新事物,但这并没有从根本上改变BIOS的本质,而为了容纳这些,英特尔。但在2001年,英特尔开发了全新的安腾处理器,采用IA-64架构,推出了全新的EFI。后来证明安腾处理器和IA-64架构并没有普及,但是EFI和后续的UEFI被发扬光大,成为了计算机的主要预引导环境。
EFI,可扩展固件接口的首字母缩写,字面翻译为可扩展固件接口。它是用模块化和高级语言(主要是C语言)构建的小型化系统。它和BIOS一样,主要在启动时完成硬件初始化,但它直接采用加载EFI驱动程序的方式来识别系统硬件并完成硬件初始化,完全放弃读取各种中断来执行。EFI驱动不是直接面向CPU的代码,而是由EFI字节码编写的。EFI字节码是EFI专用的虚拟机指令,需要在EFI驱动运行环境DXE下进行解释和运行,这样EFI才能实现通用配置,提供良好的兼容性。另外,EFI完全是32位或者64位,所以在EFI中可以实现处理器的最大寻址,而不需要16位实模式,所以任何信息都可以存储在任何内存地址中。另外,由于EFI的驱动开发非常简单,基于EFI的驱动模型原则上可以让EFI接触到所有的硬件功能,在EFI上读写文件、浏览网络完全可以。I、BIOS上的CMOS设置程序在EFI上是作为EFI程序执行的,硬件设置是硬件设置程序,引导管理是另一个程序,保存CMOS是另一个程序,虽然它们在形式外壳里是在一起的。
EFI在功能上完全等同于一个轻量级的OS,但是EFI在制定的时候并没有定位为专业的OS。首先,它只是硬件和操作系统的接口。其次,EFI不提供中断访问机制。EFI必须通过轮询的方式对硬件进行检查和解释,低于OS下的驱动执行效率。最后,EFI只有一个简单的内存管理机制。在段保护模式下,只对内存进行分段,所有程序都可以访问任意段,不提供真正的保护服务。随着EFI,一个全新的GUID磁盘分区系统(GPT)已被引入和支持。传统的MBR磁盘只能有4个主分区。只有当主分区少于4个时,才能建立扩展分区,然后在其上建立系统认可的逻辑分区。还有多个逻辑分区,逻辑分区太多会严重影响系统启动。MBR硬盘分区最多只支持2T容量,对于现在的大容量硬盘来说也是一种浪费。GPT支持任意数量的分区。原则上,每个分区的大小是无限的,但由于操作系统的规定,它不能是无限的。但是,相对于MBR的2T限制,这是一个非常重要的改进。GPT的分区类型是由GUID表唯一指定的,基本上不存在重复的可能。EFI可以访问EFI系统分区来访问一些驱动程序和应用程序。虽然这样会使EFI系统分区原则上不安全,但一般有一些“边缘”数据放在这里,即使损坏,一般也不会造成严重后果,简单恢复即可。
当EFI发展到1.1的时候,Intel决定将EFI公开,于是随后的2.0吸引了很多公司加入进来。EFI不再属于Intel,而是属于统一EFI形式的国际组织。2.0以后,EFI改名为UEFI,UEFI,其中EFI和本来是一个意思,U是Unified的缩写,所以UEFI的意思是“统一可扩展固件接口”
首先,UEFI有完整的图形驱动功能。虽然之前的EFI在原理上已经加入了图形驱动,但是为了保证EFI和BIOS之间的良好过渡,大部分EFI都是类似DOS的接口(仍然是640*480VGA分辨率),只支持PS/2键盘操作(很少支持鼠标操作),不支持USB键盘鼠标。到了UEFI,你就有了完整的显卡驱动。无论是PS/2还是USB键盘鼠标,UEFI始终支持。而且当UEFI的显卡也支持GOP VBIOS时,显示的设置界面是显卡高分辨率显示为640*480或者1024*768。所以画面虽小但很清晰,但这会导致屏幕周围出现大面积的黑色,但鱼与熊掌不可兼得,除非UEFI
其次,UEFI有一个独特的功能,安全引导,而EFI没有安全引导。其实通俗的解释叫固件验证。UEFI安全启动后,主板会根据TPM芯片(或者CPU内置的TPM)记录的硬件签名来判断每个硬件,只有通过认证的硬件驱动才会被加载。但Win8之后,Windows在操作系统加载过程中会继续检查硬件驱动的签名,只有符合Windows记录的硬件才能被Windows加载。这在一定程度上降低了操作系统启动前启动程序被预加载的风险,但也会导致系统安装的垄断。
无论EFI还是UEFI,都必须由预加载环境、驱动执行环境、驱动等必要的组件组成。为了支持一些老设备(比如在UEFI下挂载传统MBR硬盘,不支持UEFI启动的显卡依然支持在UEFI下运行等。),需要一个CSM兼容性支持模块。EFI或UEFI仅支持GPT磁盘引导系统。下面具体说说EFI或者UEFI启动电脑的过程。
通常,预加载环境和驱动程序执行环境存储在UEFI(UEFI BIOS)芯片中。打开电源开关,电脑的主要部件开始有电源供应。与BIOS不同,UEFI预加载环境首先开始执行,负责CPU和内存(全容量)的初始化。如果这里有重要问题,即使有报警喇叭,电脑也不会响。因为UEFI没有驱动8255发声,但是预装环境只检查CPU和内存。如果这两个主要硬件有问题,屏幕不显示马上就能确定。其他主板会提供LED提示,可以根据CPU或内存是否亮起来大致判断故障。
CPU和内存初始化成功后,将加载驱动程序执行环境(DXE)。加载DXE后,UEFI能够枚举和加载UEFI驱动程序。在这个阶段,UEFI会枚举和搜索各种硬件的UEFI驱动程序并逐一加载,完成硬件初始化,这将比BIOS的读中断加载速度快很多。同样,如果显卡的UEFI驱动加载成功,电脑也会有启动画面。当所有的硬件驱动程序都被加载后,它将最终和BIOS的一样。
在引导操作系统的阶段,也是根据引导记录的引导顺序,到相应设备的引导记录(仅限GPT设备,如果引导传统MBR设备,需要开启CSM支持),引导操作系统,进入。这里需要注意的是,当UEFI检测到没有操作系统引导设备时,会直接进入UEFI设置页面,而不是像BIOS一样黑屏显示相关信息。
总结一下,BIOS和UEFI启动电脑的过程描述可以概括为:BIOS先初始化CPU,然后跳转到BIOS启动处进行后期自检。如果在这个过程中出现严重错误,计算机会用不同的警报声进行提醒,然后通过读中断的方式加载各种硬件,硬件初始化后,进入操作系统启动过程;UEFI则是运行预加载环境,先直接初始化CPU和内存,CPU和内存有问题就直接关屏。之后启动PXE,枚举搜索各种硬件并加载驱动,完成硬件初始化,然后也进入操作系统启动过程。
另外,BIOS是16位汇编语言程序,只能在16位实模式下运行,可访问内存只有1MB,而UEFI是32位或64位高级语言程序(C语言程序),突破了实模式的限制,可以实现所需的最大寻址。