3

下一代BIOS标准探讨之四:UEFI界中的乐高—MinPlatform

 3 years ago
source link: https://zhuanlan.zhihu.com/p/366092098
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标准探讨之四:UEFI界中的乐高—MinPlatform

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

先讲两个小故事。

很多年前,我飞到美国南卡的Intel CDC site参加Romley平台的Power On。PO的主力,Intel服务器部门(DCG)派出了十几个人的豪华阵容,加上当地的芯片BIOS团队,可谓人才济济。当时,他们还在使用AMI的代码库,而我从属的Intel软件部门(SSG),一直推动在上游去除AMI代码,采用纯UEFI的EDK2实现,我们叫它Pure EDK2。我们已经在Romley的上一代Thurley实现了SSG内部的代码转换,此行一个重要的目的就是展现纯EDK2代码也可以做到芯片PO,甚至可以做得更好。于是仅仅派出了我一个人,借此彰显EDK2代码的niubility。当地的朋友Chris Ruffin问我:“Where is your team?”我得意的回答:“You are looking at it!”

牛皮吹出去,很快就开始现场PK了。MRC过后,两边平台代码迅速投入战斗。开始情况很好,一个多小时后纯EDK2 Romley就启动到了Shell,而那边还没有到DXE。正在我打算一鼓作气,羞辱一下对方的时候,启动Windows蓝屏了,于是我陷入了长达三天的Debug。这三天我每天几乎只睡三四个小时,ITP、Windbg等等能用的都用了,但也仅仅把出错范围缩小到ACPI DSDT中的某个设备出了问题。坑爹啊,我明明在模拟器上试过启动Windows了啊。我最后想了一个办法,在DSDT中采用折半查找方法,每次注释掉一半设备,折腾了一个晚上,才定位到那个设备,从而成功启动Windows。在看到了熟悉的Windows桌面,随行的市场部同事发出了兴奋的尖叫,而我却陷入了懊悔中。多好的开局,被我打得稀烂,前一天DCG代码已经启动到了Windows了!这时我想,如果我开始准备一套最小开机代码,只有最简单的代码和设备开启,先完成主要KPI,再慢慢调多好啊,大意了。

尽管随后PO进行的十分顺利,而我也报复性的在完成PO后,消失了两周,玩遍了南卡和北卡。但即使在参观雄伟的航母的时候,“弄出一套最小开机代码”的想法却时时回响在我的脑海中,挥之不去。回国后,我找了很多人谈了这个想法,但一直没(LAN)有(DE)时间实践。

2018年,OCP大会在荷兰阿姆斯特丹举行。当时Intel上海团队第一快男,Rock同学,搞了一个展台,介绍UEFI快速启动。旁边的谷歌刚介绍完LinuxBoot有多牛,UEFI有多烂。其中有一页是这样介绍的:

UEFI启动要8分钟,而LinuxBoot只要20秒,太厉害了!是不是LinuxBoot发明了什么黑科技呢?

LinuxBoot的伙计们刚吹完一波,忽然发现旁边Rock上门踢馆来了,赶快派了两个小弟来打听情况,于是发生了下面的对话(翻译成中文)

LinuxBoot小伙:“伙计,你们启动时间多长?”

Rock:“我优化以后,不到10秒就可以启动了”

LinuxBoot小伙不太服气:“那一定是Warm Boot的结果吧?”

Rock:“是Cold Boot, Warm Boot只要5秒钟!”

LinuxBoot小伙听完沉默不语,直呼中国不可战胜!咳咳,走错片场了。这个结果最后由Intel PE Sarathy作为专题在OCP大会上进行了介绍[1]

BIOS界的第一快男Rock同学之所以能做到这么快,除了和他高超的启动速度调优技巧相关之外,还和他调优的基础代码有关,而这个代码就是Purley MinPlatform。UEFI的小伙伴们在OCP大会上扳回来一局,扬眉吐气。这也揭示LinuxBoot能够快速启动的真相,无他,干的事少而已!

那么神秘的MinPlatform究竟是什么呢?它和最小开机版本BIOS是什么关系呢?我们先从它的由来谈起。

多年前,UEFI开始越来越多的用在嵌入式系统中,而嵌入系统的内存和Flash空间都十分有限,这对UEFI EDK2代码在内存和Flash中的footprint提出了挑战。Intel当时还不是PE的大佬姚大夫,接到了这个难度极大的任务:EDK2的代码最小需要多少RAM和ROM就够了?

怎么定义这个“最小”呢?就是满足符合UEFI Spec最小集合,检测标准就是能够启动一个支持UEFI标准的操作系统。是不是看到了最小开机版本类似的概念?姚大夫的卓越成果形成了一个POC:Minimal Platform。他探索了UEFI EDK2代码的硬件约束边界,也顺带回答了一个问题:启动速度能有多快?毕竟干的少,肯定跑的快。

在此基础上,姚大夫和Intel PE Vincent、Isaac加入了另外两个扩展功能,从而形成了MinPlatform:

1.Open Source:之前Intel平台代码包含所有功能,开源困难。更少的代码,让代码清理变得更加容易。从而Intel可以在Edk2_Platforms中开源更多的平台代码,如Kabylake平台。

2.模块化代码实现:更重要的是,MinPlatform不仅仅满足于提供最小开机代码功能,而有更大的抱负:重构整个平台代码库!大家都玩过乐高积木,MinPlatform提供一个最小功能开机版本,可以把它想象成乐高积木的底板:

平淡无奇,啥也没有,但它提供了最小UEFI的最小集合,也可以单独使用,就像乐高积木的底板。各种各样的功能,就像一个个乐高积木块:

重构它们,让它们相互独立,可以独立的使能。把它们拼起来,一个全功能(Full Platform)的平台就建立起来了:

MinPlatform定义了[2][3]平台的多个Stage,指导这种搭建,以及MinPlatform和Full Platform的包含关系:

来源:参考资料3

MinPlatform在Intel Client平台上已经基本完成这种愿景,而在服务器平台上还在演进中。

来源:参考资料3

Intel开源平台也转到以MinPlatform和FSP来实现:

来源:参考资料3

更多的MinPlatform细节请参见参考资料2.

BIOS云课堂上有一节课和此相关:

卓易云课堂​cloudclass.zqtong.com

尾声卓易云课堂尾声

目前主要的几种现有方案已经介绍完毕(除了SBL):

我们后面开始介绍一些将来的可能发展思路。

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

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


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK