首页 > 经济 > > 正文
2021-11-28 12:33:50

综合IT:IT之家学院BIOS、EFI、UEFI详解

导读 移动电子产品的一些功能和系统运行模式越来越完善,同时也越来越复杂。很多小伙伴都很困惑。最近IT之家学院详细讲解BIOS、EFI、UEFI的消息

移动电子产品的一些功能和系统运行模式越来越完善,同时也越来越复杂。很多小伙伴都很困惑。最近IT之家学院详细讲解BIOS、EFI、UEFI的消息也引起了很多人的关注。现在大家都想知道IT之家学院关于BIOS、EFI、UEFI的详细讲解。因此,我们将为您详细介绍IT之家学院关于BIOS、EFI和UEFI的详细说明。

感谢IT家庭用户wkdubhe1987的原创贡献。

终于有时间写点东西分享了。今天就来说说BIOS,EFI,UEFI。

在之前的文章中,已经说过BIOS是一个程序(点击这里了解详情),存储在BIOS芯片中。现在现代电脑基本都用UEFI启动,早期过渡电脑用电喷启动。事实上,EFI或UEFI的一部分也存储在一个芯片中。因为它们在表面形态和基本功能上都与BIOS相似,所以我们习惯上把存储EFI/UEFI的芯片称为EFI/UEFI BIOS芯片,而EFI/UEFI又称为EFI/UEFI BIOS。但实际上,它们与BIOS有着本质的区别,不如去掉它们背后的“BIOS”尾巴。我们来详细说说BIOS和BIOS。

上一篇文章指出,BIOS用于计算机硬件自检、CMOS设置、引导操作系统、提供硬件I/O和硬件中断四个主要功能。因此,BIOS程序可以分为几个模块,包括Boot Block引导模块、CMOS设置模块、扩展配置数据(ESCD)模块和DMI硬件数据采集模块。其中,引导模块直接负责BIOS程序的入口和计算机基础硬件的检测和初始化。ESCD用于在基本输入输出系统和操作系统之间交换硬件配置数据。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预留的内存地址执行跳转到BIOS开始的指令,开始进行开机自检。

在POST自检中,BIOS只检查系统必要的核心硬件是否有问题,主要是CPU、640K基本内存和显卡是否正常,PS/2键盘控制器和系统时钟是否有问题等等。因为开机自检是在显卡初始化之前进行的,所以如果在此阶段出现错误,将无法在屏幕上显示。但是主板上有报警扬声器,如果主板的8255外设可编程接口芯片没有损坏,开机自检报警声肯定会出来。根据不同的报警声音可以大致判断错误。一般短哔声基本代表正常启动,不同的错误是短哔声和长哔声的不同组合。开机自检后,BIOS开始调用中断,完成各种硬件初始化。

在硬件初始化工作中,主要有两点。首先,开机自检检测后,电脑最终出现启动画面,即显卡已检测完毕,初始化完成。不过请注意,由于BIOS是在16位实模式下运行的,所以这个屏幕以VGA分辨率(640*480,纵横比433603)显示,因为实模式最支持VGA。以前的14-17英寸小CRT显示器,比例为4:3,最高分辨率相对较低,所以这款启动屏没有什么矛盾感,但是现在的LCD显示器基本都是高分辨率的宽屏1633609,所以启动屏上的一切可以说是“惨不忍睹”,——图形拉长,字体很大很模糊,可以说是非常混乱。其次,BIOS只识别主引导记录(MBR)初始化的硬盘,这是因为后续的EFI或UEFI采用了新的GUID磁盘分区系统(GPT)格式,在BIOS下是无法识别的。完成所有硬件初始化后,下一步是更新ESCD。

在ESCD更新阶段,基本输入输出系统将检测存储在互补金属氧化物半导体中并与操作系统交换的硬件配置数据。如果系统硬件发生变化,数据会更新;否则,它将保持不变而不更新。ESCD检测或更新后,BIOS将完成最后一项工作,即启动操作系统。

最后一步,BIOS根据用户在CMOS中指定的硬件启动顺序读取相应设备的启动或引导记录,引导相应设备上的操作系统启动并进入操作系统。之后,操作系统代替BIOS负责硬件和软件之间的相互通信。如果发现所有硬件都没有引导操作系统的记录,屏幕上会显示相应的错误信息,计算机将保持16位真实模式。

尽管BIOS是计算机开机和启动必不可少的一部分,但它自1975年诞生以来已经有近30年的历史了,1

6位汇编语言代码,1M内存寻址,调用中断一条条执行的理念和方式竟然一点都没有改变,虽然经各大主板商不懈努力,BIOS也有了ACPI、USB设备支持,PnP即插即用支持等新东西,但是这在根本上没有改变BIOS的本质,而英特尔为了迁就这些旧技术,不得不在一代又一代处理器中保留着16位实模式(否则根本无法开机的)。但是,英特尔在2001年开发了全新的安腾处理器,采用IA-64架构,并推出了全新的EFI。后来证明,安腾处理器、IA-64架构没有推广开来,而EFI和后继的UEFI却发扬光大,成为现在电脑的主要预启动环境。

EFI,是Extensible Firmware Interface的词头缩写,直译过来就是可扩展固件接口,它是用模块化、高级语言(主要是C语言)构建的一个小型化系统,它和BIOS一样,主要在启动过程中完成硬件初始化,但它是直接利用加载EFI驱动的方式,识别系统硬件并完成硬件初始化,彻底摒弃读各种中断执行。EFI驱动并不是直接面向CPU的代码,而是由EFI字节码编写成,EFI字节码是专用于EFI的虚拟机器指令,需要在EFI驱动运行环境DXE下解释运行,这样EFI既可以实现通配,又提供了良好的兼容。此外,EFI完全是32位或64位,摒弃16位实模式,在EFI中就可以实现处理器的最大寻址,因此可以在任何内存地址存放任何信息。另外,由于EFI的驱动开发非常简单,基于EFI的驱动模型原则上可以使EFI接触到所有硬件功能,在EFI上实现文件读写,网络浏览都是完全可能的。i,BIOS上的的CMOS设置程序在EFI上是作为一个个EFI程序来执行的,硬件设置是硬件设置程序、而启动管理则是另一个程序,保存CMOS又是另一个程序,虽然它们在形式的Shell上是在一起的。

EFI在功能上完全等同于一个轻量化的OS,但是EFI在制定时就定位到不足以成为专业OS的地位上,首先,它只是一个硬件和操作系统间的一个接口;其次,EFI不提供中断访问机制,EFI必须用轮询的方式检查并解释硬件,较OS下的驱动执行效率较低,最后,EFI只有简单的存储器管理机制,在段保护模式下只将存储器分段,所有程序都可以存取任何一段位置,不提供真实的保护服务。伴随着EFI,一种全新的GUID磁盘分区系统(GPT)被引入支持,传统MBR磁盘只能存在4个主分区,只有在创建主分区不足4个时,可以建立一个扩展分区,再在其上建立被系统识别的逻辑分区,逻辑分区也是有数量的,太多的逻辑分区会严重影响系统启动,MBR硬盘分区最大仅支持2T容量,对于现在的大容量硬盘来说也是浪费。GPT支持任意多的分区,每个分区大小原则上是无限制的,但实际上受到OS的规定限制不能做到无限,不过比MBR的2T限制是非常重要的进步。GPT的分区类型由GUID表唯一指定,基本不可能出现重复,其中的EFI系统分区可以被EFI存取,用来存取部分驱动和应用程序,虽然这原则上会使EFI系统分区变得不安全,但是一般这里放置的都是些“边缘”数据,即使其被破坏,一般也不会造成严重后果,而且也能够简单的恢复回来。

当EFI发展到1.1的时候,英特尔决定把EFI公之于众,于是后续的2.0吸引了众多公司加入,EFI也不再属于英特尔,而是属于了Unified EFI Form的国际组织,EFI在2.0后也遂改称为UEFI,UEFI,其中的EFI和原来是一个意思,U则是Unified(一元化、统一)的缩写,所以UEFI的意思就是“统一的可扩展固件接口”,与前身EFI相比,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是没有安全启动的,安全启动(Secure Boot),实际上通俗的解释是叫做固件验证。开启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启动处进行POST自检,此过程如有严重错误,则电脑会用不同的报警声音提醒,接下来采用读中断的方式加载各种硬件,完成硬件初始化后进入操作系统启动过程;而UEFI则是运行预加载环境先直接初始化CPU和内存,CPU和内存若有问题则直接黑屏,其后启动PXE采用枚举方式搜索各种硬件并加载驱动,完成硬件初始化,之后同样进入操作系统启动过程。

此外,BIOS是16位汇编语言程序,只能运行在16位实模式,可访问的内存只有1MB,而UEFI是32位或64位高级语言程序(C语言程序),突破实模式限制,可以达到要求的最大寻址。