为啥要有 BIOS?

Q:为啥只有 X86 系统有 BIOS?为啥主流 ARM 体系就不用 BIOS 呢?

A:与大多数人基本的概念不同,在某种意义上来说,X86 体系比 ARM 体系更加开放。X86 是很多小伙伴一起玩,以生态圈的概念提供产品,并对自己那部分负责;而 ARM 体系虽然也依赖生态圈,但最终有个大 Boss 统合整个生态链,提供最后产品并对该产品负总责。

X86 生态圈玩家众多,有 OS 厂商(OSV)定期发布操作系统,如 Windows,Ubuntu;芯片厂商提供 CPU,如 Intel, AMD;主板厂商(OEM)提供电脑主板;独立硬件供应商(IHV)生产扩展板卡如显卡等等 PCIE 扩展卡,再如内存厂家推出一代一代不同的内存条等等。

DIY 玩家可以自由选择搭配合适 / 兼容的产品搭配出自己心仪的机器,休闲上网用户花 2000 多元就可以搭配出一套可用的电脑,而游戏玩家则可能花费上万元才能满足游戏配置需求。还有些品牌机厂商如 Dell 和联想等,他们提供整套最终产品给用户。但他们实际上是在所有小伙伴的零件基础上拼凑出个产品,技术不强,话语权弱,并不能统一整个产业链。用户津津乐道的反而是用的什么 CPU,安装的什么操作系统,用的那种显卡等等。Windows 死机、蓝屏和缓慢等等时候,用户往往会抱怨微软和 Intel,而不是品牌厂商。

ARM 体系由最后品牌厂商统合整个产品,它负责打通整个产业链,并对其中所有部分负责,话语权极强,同时对技术也相对较强。用户面对的具体品牌的产品,而不是碎片化的各个部分。强势的如 Apple,硬件软件一起抓,完全组成闭环的链条。稍差也如华为等安卓手机,要负责安卓系统在自己手机移植部分(BSP),客户出了问题并不会找谷歌,而会去找华为。

在 X86 生态圈十分强势的微软,自己负责操作系统开发,跳过品牌直接服务最终用户,甚至不经允许直接升级操作系统,闹出不少风波。强势也带来了副作用,它要直接面对数千数万种千奇百怪的硬件产品,如何才能用一个软件安装包服务于这么多种设备呢?必须要一个软件抽象层封装这些硬件差别!

这就引出了 BIOS 的最主要的功能:初始化硬件提供硬件的软件抽象

  • ARM 体系也要初始化具体主板相关硬件如 GPIO 和内存等,这些一般在 BSP 中完成。与 X86 体系不同之处在于这些硬件完全定制化,初始化的时候就预先知道有哪些设备,Solder Down 了哪个品牌的哪种内存颗粒,到时候就照方抓药,初始化一大堆寄存器而已。X86 系统配置情况在开机时候是不知道的,需要探测(Probe)、Training(内存和 PCIe) 和枚举(PCIe 等等即插即用设备),相对较复杂。
  • BIOS 提供了整个主板、包括主板上外插的设备的软件抽象。通过探测、Training 和枚举,BIOS 就有了系统所有硬件的信息。它通过几组详细定义好的接口,把这些信息抽象后传递给操作系统,这些信息包括 SMBIOS(专栏稍后介绍)、ACPI 表(ACPI 与 UEFI),内存映射表(E820 或者 UEFI 运行时)等等。通过这层映射,才能做到做到操作系统完全不改而能够适配到所有机型和硬件。

在某种程度上来讲,BIOS 是将操作系统 BSP 部分单独封装后下放到主板或者 BIOS 提供商来完成。这在过去带来了巨大的好处,WinXP、Win7 现在还可以运行在更新的电脑硬件上,新的硬件只要自己更改一下就行了,兼容性是 ARM 体系所不能比拟的。当然割裂的生态圈也带来了用户感受的千差万别,这也受到广泛诟病。各自为政也窒息了创新,带来了同质化。为此,Intel 越俎代庖,提出了变形本等等概念;而微软更直接出了 Surface,似乎要与过去的小伙伴争食。其实这些都是不得已而为之,今后的发展还需要拭目以待。

arm 社区最近为了进入 x86 的传统优势领域,也开始接受 uefi,不过一般只在服务器领域。个别厂商为了支持 Windows 而在平板等设备支持 uefi,某厂商在手机上也要引入 uefi。不过这些只是支流,并且他们并不吧自己叫做 BIOS,而叫做 Bootloader。

进 Windows 后 BIOS 还有用吗?

Q:是不是启动进去了操作系统,BIOS 就没用了?

A:当然还在起作用。它启动进了操作系统后,大部分内容都释放了,但还留下了不少尾巴:

  1. SMM 驱动。SMM 驱动默默的等待在后台,在合适的情况会触发(trap)运行。有不少主板新奇的功能都靠它。
  2. ACPI 表和代码(Method)。DSDT 和 SSDT 都有不少代码,这些都会被操作系统频繁调度。
  3. UEFI 运行时。根据 UEFI Spec,BIOS 提供了操作系统运行时需要的一些支持函数,例如读写存贮在 BIOS Flash 上的 variable 操作,reset 等等。
  4. 其他。EC 或者 BMC 等等都在监控系统,它们都有可能触发 event,喊来 BIOS 帮忙。还有些特殊硬件,如显卡还需要和 opRegion 进行交互。

为啥专栏一会说 BIOS 一会说 UEFI?

Q:BIOS 和 UEFI 是一回事吗?为啥感觉你们在混用?

A:如果将 BIOS 和 UEFI 放在一起讲区别,一般 BIOS 是指传统的那种 BIOS,汇编语言写的。UEFI 是指它的继任者,绝大多数代码由 C 语言写成,有开放和标准的 UEFI Spec。
但因为现在传统 BIOS 已经基本被淘汰感觉,一般不做区别说明,BIOS 就是指 UEFI BIOS。

Q:UEFI 怎么念?

A:跟我念:’U’,’E’,’F’,’I’。没有连读的念法。

UEFI 是怎么发明出来的?在它之前是啥?

Q:UEFI 为什么被发明出来?

A:在 UEFI 被发明之前,PC 机都在用传承自 1979 年的传统 BIOS。初代 BIOS 由几个 IBM 工程师开发,他们从没有想到自己写的汇编程序会用这么久。我有幸遇到过其中之一,一个满头银发的慈祥老头,当时他还在 IBM 工作,他对传统 BIOS 能工作那么久也深感惊讶,当然还有荣幸。传统 BIOS 在发明后虽经过修修补补,但本质没有丝毫变化:一堆用汇编写的硬件初始化代码,It works,但它封闭、神秘和充满各种不清不楚的预设和祖传代码。

在 1997 年,当时的 Intel 开始研究如何支持基于安腾处理器芯片组的服务器。这是个全新的系统:处理器,芯片组,操作系统等等,但是初期的计划还是使用传统的 BIOS 代码来完成此项工作。这样可以至少保证一个东西不变,BIOS。结果任务失败,催生(不得不)了所谓的英特尔引导计划(IBI),目标定位于开发一套支持安腾处理器的引导规范。在排除了购买现成方案后,Intel 内部决定开发一套全新的机制。

考虑到底层编程的复杂性以及希望操作系统尽可能少地去了解平台的硬件细节,在平台固件和 OS 加载器间使用高级 C 语言接口看起来成为一个必然选择。有了这个绝佳的想法,为启动过程定义一个在固件和操作系统间 CPU 架构无关的 API 只是剩下最后的一跃而已。

在成功支持安腾服务器后,Intel 又觉得为什么不把整套方案加入 X86 体系的支持呢?从此一发不可收拾,在 Intel 的努力下,新的方案被广泛讨论,并在 1999 推出 1.0 spec, 并被定名 EFI。后成立 Forum,改名 UEFI。年表大致如下:

为什么要有BIOS? - 图1

Q:微软第一个支持 UEFI 吗?

A:苹果最先推出基于 UEFI 的电脑。苹果公司往往不是某项技术的发明者,却是该技术用的最早和最好的。它这种勇吃、会吃第一个螃蟹的伟大公司,成为市值第一也是名至实归啊。

参考资料