5

下一代BIOS标准探讨之三:Linux固件的回归—LinuxBoot

 3 years ago
source link: https://zhuanlan.zhihu.com/p/359046698
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

下一代BIOS标准探讨之三:Linux固件的回归—LinuxBoot

中央处理器 (CPU)话题下的优秀答主

做一件事情不难,但如果一个人坚持不懈地二十多年坚持做一件事情,那他一定是个有理想的人,一个纯粹的、脱离了低级趣味的人。这个人就是Ron Minnich同学。也许是出于既生瑜何生亮,也许是UEFI社群与Linux社群基因的本质分歧,LinuxBIOS (后来的coreboot)的发明者Ron同学,数十年来不断地挖UEFI的墙角,从各个角度挖,找到机会就在各个开源大会上抨击UEFI固件。2016年他加入了Google,就在我认为新工作会让他消停一阵的时候,He came back even stronger!2017年的嵌入式Linux大会上[1],他带来了NERF(Non-Extensible Reduced Firmware),也就是后来的LinuxBoot。相对于UEFI里E代表的Extensible,他起的名字里面专门加上Non-Extensible,除了刻骨铭心的仇恨或者鄙视,我实在想不出其他的理由。相对于coreboot更多地关注Client市场,LinuxBoot开局就高举高打,从Server市场开始,有种两面夹击UEFI固件的味道。那么LinuxBoot到底是什么,它和coreboot和UEFI固件的区别是什么呢?

Linux在固件的回归

如我们前文中

提到,Ron在发明当时还是LinuxBIOS的时候,他的理想十分纯粹,就是把Linux用在固件中就好了。但理想美好,现实残酷,当时的Linux 2.2给他铺了一条充满荆棘的道路,各种苦楚,他在多个场合有谈到。即使在2018年,NERF已经变成了LinuxBoot,他还在当年的开源固件峰会中忆苦思甜:

理想中的Linux is the BIOS变得支离破碎,coreboot变得越来越臃肿,更多的硬件初始化代码加入。很多的硬件,FSP初始化一次,coreboot ramstage初始化一次,Linux又初始化一次。更加讽刺的事,Linux从初始化硬件这个目的,变成仅仅是一个payload,从而LinuxBIOS不得不改名coreboot。对此Ron一定是不甘心的,理想主义的他一直在等待机会对这种情况进行反正,而Linux内核的演进让这种野心慢慢变得可能。终于,2017的他,用Linux as firmware为口号,宣布Linux在固件上的回归,而这一个轮回,时间已经过了近二十年!而slogn用词的细微区别,也让人感叹历史的相似,细细品味又有所不同。

LinuxBoot vs coreboot vs UEFI

1999年的Linux内核,硬件的初始化更多的依赖BIOS完成。如视频Ron抱怨的那样,简单的PCI总线的枚举都不能完成,当时Linux发现PCI的BAR地址为空,就认为该设备被Disable了,这让Ron只有两条路可以走:

1.在coreboot里面做PCI初始化;

2.在Linux Kernel里进行改动;

Ron也试图挣扎,但在给Linux社区抗议后,孤独的他放弃了。他只有选择1,在coreboot里面加入了PCI bus的枚举,从此一发不可收拾,越来越多的内容进入了coreboot,这些除了内存之外的硬件初始化内容最终变成了coreboot的ramstage。现在的Linux早就加入了PCI总线的枚举,曾经的约束条件慢慢变得不存在了,现在横亘在路上的绊脚石主要是内存初始化了。于是LinuxBoot的前身NERF诞生了,仅仅几十行代码的改动,剥离了coreboot的ramstage,只留下romstage,在内存和一些必须的硬件初始化好了就直接加载Linux Kernel。整个流程和LinuxBIOS的设计初衷几乎一模一样。

LinuxBoot[2]的设计回归,让它看起来和coreboot甚至于UEFI并不冲突。它也不觉得自己是一种bootloader,而认为自己是一种payload,它相容于coreboot、UEFI甚至是uboot,依靠他们来进行必须的硬件初始化:

它本质上代替了UEFI DXE和BDS阶段,代替了coreboot的ramstage,而利用UEFI的PEI和SEC阶段,或coreboot的romstage,来进行最少的必要硬件初始化,后面的很多硬件初始化都依靠Linux内核的驱动来完成,而Ron认为这些驱动更安全也更可靠。

需要指出的是无论UEFI的PEI,或者coreboot的romstage,内存和为初始化内存进行的必要硬件初始化代码只能而且应该由芯片厂商提供,在Intel就是FSP,在AMD就是AGESA,除此之外的代码量很少。从这个角度看,coreboot和UEFI在LinuxBoot中起的作用差异很小。另外FSP多提供在Client平台中,FSP API mode目前并不支持服务器平台,LinuxBoot为了支持服务器主板,往往把服务器UEFI BIOS中的PEI FV抠出来,嫁接在LinuxBoot固件中,十分扭曲,这也是它的支持者们强烈要求Intel在服务器市场中支持FSP API mode的一个最重要的驱动力。

Ron坚持不懈的精神值得我们尊重,LinuxBoot和coreboot现在的支持不乏Google和Facebook这些大佬,这和他这么多年的奔走呼吁是分不开的。公平来讲,Linux as firmware有它合理之处,但Ron对UEFI攻击的一个重要抓手我就不敢苟同了。Ron宣称LinuxBoot能让启动性能大幅提升:

他举例在服务器Purely平台上能让启动速度从8分钟变成20秒,加速了将近24倍!他这种田忌赛马的计算方法十分不公平,在2018年OCP大会上,当时的Intel工程师(现加入百敖)Rock同学,采用符合UEFI架构的MinPlatform,现场实力打脸LinuxBoot。这个精彩的故事,我们下回再讲!

其他下一代BIOS讨论:

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。

用微信扫描二维码加入UEFIBlog公众号


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK