直接原因就是实模式下的驱动太难写了。
实模式下,内存可用空间只有640KB,而现在BIOS的界面基本上都是图形化的,还要支持各种外设:USB/SATA/NVME……,这些驱动如果全加载起来,那么640KB的内存是不够用的。
这个问题,不仅仅硬件厂商(做BIOS的)要面对,操作系统厂商也要面对,因为操作系统的bootloader也需要支持多样化的驱动才能加载正确的操作系统内核(或者stage 1的启动代码)。
过去的时候,为了解决这个问题,有几种方法:
#1,多级启动,第一级只有一个特别简单的loader,加载第二级,支持的功能更多,然后加载第三级,甚至第四级,直到操作系统(或者bios)起来。
#2,不停的在保护模式和实模式之间切换,因为保护模式支持大内存,但是BIOS模式加载操作系统时,又必须从实模式开始,所以进BIOS的时候是保护模式,加载操作系统的时候再切回去。但是又因为实模式不能运行所有驱动(内存太小),需要支持不同硬件时,需要切回保护模式换驱动。
这样的设计会让软件非常复杂,也不好维护。
那么硬件厂商就会想跟软件厂商协商一下实模式这么难用,直接用保护模式不就好了么,然后就有UEFI了。
Intel已经有计划完全移除对实模式的支持,那么以后传统的BIOS模式也就不存在了。
作者:北极
链接:https://www.zhihu.com/question/610490718/answer/3110291248
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
直接原因当然是Intel&Microsoft的强推。如果你是主板厂,芯片厂Intel提供给你的支持就是UEFI,你难不成把Intel的设计重构一遍?PC市场占有率最高的操作系统Windows支持UEFI,你难不成把Windows重构一遍?
当然,不是逼着板厂用坏东西,推广UEFI这是有好处的。
当代计算机开机启动的流程,基本上就是PCH先上电,然后PCH通知CPU做芯片层面的初始化,然后CPU来执行主板固件(UEFI或者BIOS),然后主板固件寻找硬盘上的OS bootloader,把bootloader装载进内存以后,控制权交给bootloader,由bootloader负责启动操作系统
BIOS在这里给出的设计是直接把MBR(主引导记录)装进内存以后就退回实模式jmp过去撒手不管了,调用BIOS的代码的话需要用中断,而且得是在启用保护模式之前才能用,这个中断实现的接口没有标准化,硬件不断发展,厂商就打各种补丁上去,不同厂商的BIOS同一个功能的行为可能都不一定一致,做过BIOS时代的裸机编程的人应该感受过那程序写起来是什么感觉
相比BIOS,UEFI直接运行在保护模式,可以直接在保护模式运行bootloader,少了BIOS从保护模式退回实模式OS loader又从实模式启动保护模式的多余流程,UEFI规定了一系列标准化的Service,以C语言API的形式提供给OS bootloader,包括用于启动时显示输出的GOP(Graphics Output Protocol)等,现在的Windows启动时可以一边播放转圈动画,一边显示主板厂商的Logo,这个效果就是用GOP实现的
除了方便OS loader开发以外,UEFI还有若干新特性,其中最重要的就是Secure Boot,这可以确保整台电脑从最开始启动的时候就只加载可信的底层代码,如果你的操作系统内核被黑客偷换了,UEFI firmware就可以检测到数字签名不匹配,从而拒绝加载这个被黑掉的内核,提高了系统的安全性。
当然,对于我这种折腾Linux的,并且业余喜欢写个OS Kernel玩玩的,那简直是要恨死Secure Boot了。从此核心态所有东西都得要签名,能拿出去发布的EV code sign普通人根本没法获得,开发个miniport driver都没法发布,更别说kernel了,直接消灭新的竞争对手,已经有的公司都要交保护费买证书,这是真能赚啊。
开机进入系统以后,UEFI并不比BIOS性能强
你看不见不等于没有。
UEFI提供给OS的Service分为Boot Time Service和Runtime Service
顾名思义Boot Time Service只在启动时存在,在系统启动以后就退出了
而OS启动之后,UEFI firmware提供的Runtime Service仍然继续运行在系统中,提供的功能包括改变固件设置、升级固件、重启系统等等。这些设计虽然不能让系统跑得更快,但可以让系统的关键操作更加安全、标准化,避免机器损坏。
作者:理性校准仪
链接:https://www.zhihu.com/question/610490718/answer/3107139455
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。