LinuxBIOS 四周年

作者:Ronald G. Minnich

LinuxBIOS 是一个 GPL 许可的程序,它取代了许多计算机(包括 AMD64、x86、Alpha 和 PowerPC 系统)上的 BIOS。LinuxBIOS 是一个与供应商无关、架构中立的 BIOS,其中 95% 以上是用 C 语言编写的。LinuxBIOS 已经有四年历史了。世界上一些最大的 Linux 集群使用 LinuxBIOS,世界上一些最小的嵌入式系统也使用它。LinuxBIOS 已被用于在世界贸易中心搜寻幸存者的机器人,以及在阿富汗和伊拉克使用的机器人。包括 AMD 和泰安在内的许多供应商都支持 LinuxBIOS。例如,现在可以从泰安订购预装 LinuxBIOS 的主板。

在本文中,我将介绍 LinuxBIOS 的基本结构、LinuxBIOS 的起源以及它如何发展到当前状态。我还将介绍它支持的平台,以及我们在尝试将 GPL 项目与供应商拥有的某些最低级别、最严密保护的秘密结合起来时所吸取的教训。

LinuxBIOS 结构

在我们可以解释 LinuxBIOS 结构之前,我们需要快速概述现代 PC 架构。PC 由一组芯片组成,包括 CPU、图形和键盘控制器,所有这些都通过总线连接。总线是一组或多组电线,可用于互连两个或多个芯片。有些总线有两根电线,信号线和地线,而另一些总线则有数十根或数百根电线。

图 1 显示了 PC 架构的高度简化图。不同类型的总线不能直接相互连接,因此使用称为桥接器的芯片将一个总线连接到另一个总线。第一个总线是前端总线,在大多数 PC 上,它将 CPU 相互连接并连接到北桥。北桥将 CPU 连接到内存总线和 PCI 总线。在我们的图中,我们只显示了一个北桥,但是这个主题有很多变体。例如,AMD Opteron 为每个 CPU 使用一个北桥,并且前端总线仅将每个 Opteron CPU 连接到其自己的北桥。换句话说,Opteron 上没有共享的前端总线。然而,北桥是 Opteron 芯片组中可识别的设备。

南桥几乎总是位于 PCI 总线 0 上,是线路中的下一个桥接器。南桥将 PCI 总线连接到传统设备,即大约 1981 年 PC 上发现的设备集。南桥还驱动 BIOS Flash 部件。

LinuxBIOS at Four

图 1. 基本 PC 架构的简化视图。桥接器是连接一个总线到另一个总线的芯片。

当 PC 打开或重置时,CPU 从一个已知地址开始获取指令,传统上该地址是从内存顶部 (TOM) 减去 16 字节的位置。在最初的 8086 中,这是地址 0xffff0;在较新的 PC 上,它是地址 0xfffffff0。这种初始指令获取必须通过硬件以某种方式支持,即使在硬件配置之前也是如此。很多硬件必须工作才能进行第一次指令获取。

然而,当第一次打开时,PC 几乎没有准备好运行 C 代码,甚至几乎没有准备好运行汇编代码。主板必须分阶段启动。因此,LinuxBIOS 有一系列引导程序,每个引导程序在激活额外的 CPU 资源时被调用。每个引导程序都假定某些资源已被启用,并且机器具有一组明确定义的可用资源。

这些 LinuxBIOS 组件是

  • 前 10 或 15 条指令,用于启用 CPU,启用最小的虚拟内存功能(至少 32 位地址),并启用启动内存所需的其他资源(例如 I2C 总线)。它们还设置内部 CPU 状态以清理诸如指令流水线之类的东西。

  • 内存启动代码,需要健全的 CPU 和工作的 I2C 总线来查询内存参数。

  • 将最初用 C 语言编写的目标代码从 Flash 加载到内存的代码。目标代码可以选择进行压缩。

  • 内存工作后可以运行的代码。此代码扫描所有硬件资源并对其进行初始化。

  • 一个或多个有效负载,用于执行任何自定义的最终配置工作并引导操作系统。

我们在图 2 中显示了所有阶段。

LinuxBIOS at Four

图 2. LinuxBIOS 的阶段

LinuxBIOS 支持可选的后备 BIOS,以防出现 BIOS 问题。后备支持在编译 BIOS 时内置到 BIOS 中。附加代码检查 CMOS 中的标志,并确定 CMOS 是否损坏、之前的 BIOS 是否未能正确启动或者用户是否希望启动到后备 CMOS。后备 BIOS 是一个完整的 LinuxBIOS 镜像,其功能没有任何限制。

后备功能对于无人值守的 BIOS 更新很有用。考虑一下在 1,024 个或更多节点上更新 BIOS 的情况——如果更新到一半失败了怎么办?对于大多数系统,您现在有了一个非常昂贵、非常重的镇纸。使用 LinuxBIOS,只需重置节点,它们就会在后备模式下自动恢复。

LinuxBIOS 的起源和演变

我于 1999 年 9 月在洛斯阿拉莫斯国家实验室 (LANL) 启动了 LinuxBIOS 项目。在此之前的八年中,我一直在构建各种集群,并在 1994 年构建了我的第一个 PC 集群。在所有这些时间里,BIOS 一直是构建更大集群的绊脚石。

1997 年,我在萨诺夫公司构建了 144 节点的 Cyclone 集群。作为一项实验,我们只有 16 个节点配备了视频。实验并不成功;使用标准 BIOS 的 PC 实在太不可靠了,无法移除视频,因为 PC 故障恢复总是需要与 BIOS 交互。很明显,如果我们想转向更大的 PC 集群,我们需要解决 BIOS 的问题。

我们决定理想的 PC 集群节点应具有以下功能:直接从某些板载非易失性 RAM 引导到操作系统;配置所有网络接口,但不配置任何其他硬件;使用任何工作网络接口连接到控制节点;并且仅在控制节点的指示下采取行动。

然而,私营行业不是开展此类工作的场所,因此我们始终无法将这些想法超越谈话阶段。

一旦我到了 LANL,我就有能力追求这些想法。一些技术趋势也使得 1999 年比 1997 年更适合关注这个问题。1999 年,带有 1MB Flash 的主板开始出现,并且自描述的 PCI 总线已经完全取代了较旧的 EISA 和 ISA 总线。同样重要的是,Linux 在执行更多配置方面变得更好,SGI Visual Workstation 就是一个例子,它甚至没有标准的 BIOS。

似乎很明显,如果我们可以将 Linux 放入 BIOS 部件中,我们就可以实现我们的目标。Linux 可以比我们见过的任何 BIOS 更好地运行硬件。我们所需要的是一个简单的硬件引导程序,将 Linux 从 Flash 加载到内存中;Linux 将完成剩下的工作。因此,我们早期的座右铭是“让 Linux 来做!”

在我们全力以赴地启动 LinuxBIOS 项目之前,我们需要确保 Linux 可以用作操作系统引导程序,这意味着 Linux 必须能够引导 Linux。到 1999 年 12 月,我们已经通过 LOBOS 工作演示了 Linux 引导 Linux。

在开源世界中完成工作的最简单方法是让其他人为您做,因此 LinuxBIOS 的下一步是寻找其他人的软件。James Hendricks 和 Dale Webster 在 OpenBIOS 项目中找到了这样一个系统。在五天的时间里,从 OpenBIOS 源代码开始,他们在我们的 Intel L440GX+ 主板上编写并构建了一个测试系统,该系统可以从复位启动系统——不是开机,而是复位。从开机开始需要再花五个月的时间才能弄清楚,但对于五个假期来说,这还算不错。

我们很早就意识到汇编代码不可能是 LinuxBIOS 的未来。OpenBIOS 有很多汇编代码,并且构建结构难以掌握。我们的小社区开始寻找 LinuxBIOS 的更好基础。Jeff Garzik 找到了一个新的 BIOS,并了解到编写它的 STPC 愿意将其开源。STPC BIOS 成为了新 LinuxBIOS 的代码库。STPC 代码需要进行大量重组,以便它可以支持多个主板和芯片组,但它确实提供了一个良好的起点。

接下来的六个月用于使一些平台运行 LinuxBIOS。我们的第一个非图形平台是 Intel L440GX+ 主板,其次是 SiS 630 主板。通过 SiS,我们获得了第一次企业参与。SiS 提供了数据手册、原理图、汇编代码和技术支持,所有这些都旨在使 LinuxBIOS 在其平台上运行。

我们了解了 Linux 可以做什么和不能做什么。当时,我们正在使用内核版本 2.2。我们了解到 Linux 无法从头开始配置 PCI 总线——LinuxBIOS 必须这样做。我们能够从 Linux 中获取 PCI 代码,并在进行修改后直接在 LinuxBIOS 中使用它,同时添加了真正 PCI 配置所需的扩展。我们了解到 LinuxBIOS 启动速度非常快,IDE 驱动器没有启动。我们继续支持 Linux 的补丁程序来解决这个问题。这些以及其他许多教训需要在我们的“让 Linux 来做!”哲学中进行一些意想不到的改变。

到九个月时,我们已经让 LinuxBIOS 在两个平台上良好运行,大部分是用 C 语言编写的,并且我们已经开始获得企业的兴趣。VIA 和宏碁贡献了数据手册,使我们能够移植到他们的新芯片组。那个夏天,James Hendricks 开始致力于 SMP 支持,并且在“让 Linux 来做!”模式下,该支持被编写为 Linux 内核的补丁,而不是 LinuxBIOS 的扩展。曾经有一段时间,使用我们的补丁程序,Linux 内核可以作为单处理器启动,并从头开始启用额外的处理器——这是以前只有 BIOS 才知道如何做的事情。

那个夏天,Linux NetworX 加入了这项工作,幸运的是,Eric Biederman 也参与进来了。Eric 最重要的早期工作是 Alpha 移植。Eric 还显著清理了内存启动代码。我们的合作一直持续到今天;Linux NetworX 是基于 LinuxBIOS 的系统的最大经销商,Eric 率先创建和架构了 LinuxBIOS 版本 2。

那年秋天,我们在 2000 年亚特兰大 Linux 展示会上发表了演讲,并在那里遇到了来自 Linux Labs 的 Steve James。这种合作关系使我们能够在不到一个月的时间内实现我们的梦想:我们为 Supercomputing 2000 构建了一个基于 LinuxBIOS 的 13 节点集群。该集群在大约 13 秒内启动到完全运行状态。

到 2001 年,Linux NetworX 完成了 DS10 的 Alpha 移植。然后我们构建了一个包含 104 个 DS10 的集群,全部运行 LinuxBIOS。DS10 的启动速度比奔腾系统慢,因此这个集群花了大约 50 秒才能达到完全运行状态,这个速度仍然是可以接受的。我们已经习惯了 BIOS 仅仅测试内存就需要 50 秒。

Alpha 移植证明了 LinuxBIOS 是可移植的。几乎没有任何代码被更改,但 LinuxBIOS 作为 64 位 BIOS 或 32 位 BIOS 都可以正常工作。

自 2001 年以来,我们增加了开发人员(现在有 11 位),并继续移植到更多平台,最近的是 AMD Opteron。我们设想 LinuxBIOS 纯粹用于集群,但现在非集群用途远远超过了集群中 LinuxBIOS 的用途。我们认为 Linux 可以完成所有困难的事情;LinuxBIOS 现在做了很多事情,包括 SMP 启动。我们本来希望“让 Linux 来做”,但 AMD K7 SMP 硬件的设计要求 SMP 启动在 BIOS 中完成。

我们认为供应商会蜂拥而至。这花了四年时间,但在 LinuxBIOS 开发的第五年,我们现在发现世界上一些最大的计算机供应商表示了兴趣。我们只是对时间框架有点乐观。然而,一旦供应商看到了商业案例,他们就会参与进来。供应商在 2003 年销售了至少价值 3000 万美元的基于 LinuxBIOS 的系统,而 2000 年的销售额为 0 美元。

平台

LinuxBIOS 在各种平台上运行。源代码树中有 50 个受支持的主板,但我们发现许多主板非常相似,以至于一个主板的 LinuxBIOS 可以在另一个主板上工作。公司为一个主板构建代码,在另一个主板上运行它,并且并不总是告诉我们。

LinuxBIOS 适用于 64 位和 32 位 CPU。受支持的 CPU 包括 Alpha、K8、K7、PowerPC、P4、PIII、PII、Cyrix (VIA)、Geode (现在是 AMD) 和 SC520 (AMD)。芯片组太多,无法一一列举。主板的外形尺寸范围从最小的 PC/104 系统到最大的 K8 系统。IBM PPC 970 端口正在开发中。

芯片组秘密

在最初的几年中,我们从芯片供应商那里听到的最常见的短语之一是“我们永远不会告诉你那个”。“那个”指的是 CPU 信息、芯片组信息、主板信息或三者的任意组合。这三个系统的设计构成了高度保密的秘密。即使现在看来,供应商能够让我们构建一个 GPL 许可的 BIOS,而该 BIOS 本质上会暴露其中一些秘密,这仍然令人惊讶。

我们是如何获得这类信息的?很简单,企业不是慈善机构。如果没有商业案例向我们发布此类信息,他们就不会这样做。但是,如果存在商业案例,那么它就会发生——有时速度惊人。

从我们所看到的,我们成功的两个因素是竞争和市场的创造。竞争为我们提供了各种各样的主板、芯片组和 CPU 选择。一旦出现合理的市场,供应商就会担心被排除在外。

LANL 的经验具有启发意义。LANL 最近的两个大型集群 RFP 都将 LinuxBIOS 指定为强制性要求。这些 RFP 的支出已超过 1900 万美元。那些决定不参与 LinuxBIOS 的公司无法响应这些 RFP。那些有远见在早期参与 LinuxBIOS 的公司有能力做出回应。在这种情况下,远见赋予了竞争优势。

结论

LinuxBIOS 在四年内取得了长足的进步——正如一个人所说,从“我是可能的”到“已投入生产”。LinuxBIOS 用于从迄今为止构建的最大的 Linux 集群到小型设备——测试仪器、MP3 播放器和便携式集群。

LinuxBIOS 使构建没有 PC 硬件包袱的系统成为可能。这些系统可以针对 Linux 进行优化,因此可以更紧凑、更简单。对于此类系统,商业案例越来越多。

LinuxBIOS 现在是第二个版本,拥有四年、至少六个 CPU 和 50 多个主板的经验。现在在某些情况下只需要几天就可以完成到一个新系统的移植;最初,这需要几个月的时间。LinuxBIOS 对计算世界的影响才刚刚开始。

致谢

有太多人为 LinuxBIOS 做出了贡献,以至于列出一些人而不是所有人很容易怠慢他们。然而,一些贡献者因使 LinuxBIOS 成为可能而脱颖而出。首先,当然是 Stefan Reinauer 和 OpenBIOS 工作;Jeff Garzik,他将 STPC BIOS 项目在 SourceForge 上设置为 FreeBIOS;Ollie Lho,他在 2000 年为我们的第一个工作站平台启动做了很多工作;Steve James 和 Linux Labs,他们与我们合作并在 2000 年加快了我们的第一个 LinuxBIOS 集群的出货速度;Greg Watson,他完成了 PowerPC 移植;以及 Eric Biederman,他在启动我们真正困难的平台并使其稳定方面做了很多工作,并且为创建版本 2 做了很多工作。

本文根据 LAUR 03-8165 发布。这项研究由美国能源部科学办公室数学信息和计算机科学 (MICS) 计划以及洛斯阿拉莫斯计算机科学研究所 (ASCI) 资助。洛斯阿拉莫斯国家实验室由加利福尼亚大学代表美国能源部国家核安全管理局根据合同 W-7404-ENG-36 运营。

Ronald G. Minnich 从事高性能计算和集群工作已有 15 年。他最近意识到,他的第一个集群,一个 16 节点的 SPARC 集群,总功率相当于他的最新集群中 2,048 个处理器中的四分之一;他的新集群的功率是他第一个集群的 10,000 倍。Ron 于 1976 年开始使用 UNIX,于 1993 年开始使用 Linux,并于 1994 年构建了他的第一个 PC 集群。

加载 Disqus 评论