使用哪种编程语言编写BIOS程序?


65

据我了解,ROM中保存的BIOS代码/位流应该是通用的(与多个CPU类型或ISA一起使用)。另外,我在网络上看到有可能转储其代码(并“反汇编”它)。

那么,它是用哪种语言,指令集或机器代码编写的呢?它不需要任何类型的处理器来执行其操作吗?如果是这样,我想它将使用外部CPU,那么它如何知道所使用的特定指令集?

也许它有一个内部处理器?



39
交叉发布已经够糟糕了,但是当它最终出现在两个版本的“热网络问题” 中时,那简直就是白白无容……
Mason Wheeler 2015年

8
“ ROM中保存的BIOS代码/位流应该是通用的(与多种CPU类型或ISA一起使用)。” -我从未听说过可与多个ISA配合使用的BIOS。你有例子吗?
chx 2015年

6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). 我会说“不,恰恰相反”
edc65

11
这甚至不是远程复制“计算机如何工作?”这一一般性问题的。请不要因为欺骗而关闭。
Andres F.

Answers:


103

BIOS过去只用汇编语言编写,但是很早以前就进行了转换,以便以某种高级语言编写大多数代码,而使汇编代码尽可能少地保留,最好只使用引导程序, (在启动/重置后CPU跳转到的前几百条指令),以及处理常规基础架构特定功能的例程。

早在90年代初,BIOS就已经主要用C语言编写。(我在90年代初用90%C,10%汇编语言编写了BIOS。)

在这个方向上也有很大帮助的是:

  • C库针对特定的体系结构,并包括用于处理该体系结构特性的功能,例如,用于向x86体系结构的I / O端口读取字节或从x86体系结构的I / O端口写入字节的功能。Microsoft C一直为此类内容提供库函数。

  • C编译器不仅针对特定的CPU体系结构,而且甚至提供了C语言的扩展,您可以使用它们来编写使用特殊CPU功能的代码。例如,x86体系结构支持称为中断的事物,该事物调用称为中断处理程序的例程,并且要求它们具有特殊的进入/退出指令序列。从早期开始,Microsoft C就支持特殊的关键字,您可以使用这些关键字将功能标记为中断处理程序,因此可以直接由CPU中断调用该功能,因此您不必为其编写任何程序集。

如今,我假设大多数BIOS是用C ++编写的,即使不是用任何高级语言编写的也是如此。

组成BIOS的绝大多数代码都是特定于底层硬件的,因此它实际上并不需要是可移植的:可以确保它始终在同一类型的CPU上运行。CPU可能会发展,但只要保持与以前版本的向后兼容性,它仍可以运行BIOS且无需修改。另外,如果需要,您始终可以重新编译用C编写的BIOS的各个部分,以便在出现的任何新CPU上本机运行。

之所以用比汇编语言更高级的语言来编写BIOS,是因为用这种方式编写BIOS更容易,而不是因为它们确实需要可移植。


7
是。有时,您甚至可能不仅将主板绑定到特定的CPU体系结构,而且绑定到特定的CPU供应商。如今,您可以购买仅与Intel x86 CPU兼容的x86主板,或仅与AMD x86 CPU兼容的x86主板。这些主板中的BIOS在很大程度上是相同的,因为在两种情况下,CPU都能理解x86指令集,并且大多数外设都是相同的,但是某些外设具有差异,BIOS必须考虑这些差异。
Mike Nakis 2015年

4
@Reflection仔细查看主板的物理外观。CPU插槽将具有特定的引脚排列,这特定于它所接受的CPU系列。您实际上无法将说Intel P4连接到AMD Opteron主板
Caleth 2015年

14
术语“ BIOS”是指PC的“基本输入/输出系统”,因此拥有BIOS意味着x86 CPU。IA64系统具有EFI而不是BIOS,PowerPC系统可能具有开放固件系统或专有系统,Sparc系统也具有OFW(或更确切地说是OpenBoot),OLPC X0是使用OFW的基于x86的系统。甚至PC都不再使用BIOS,它们已经切换到(U)EFI。OB / OFW很有趣,因为它不仅被设计为可移植的而且可以跨平台设计。OFW驱动程序可以在任何 OFW系统上运行,无论它们在CPU ISA上如何运行,它们都可以“ 在任何地方运行一次写入”。
约尔格W¯¯米塔格

14
“现在我会假设大多数BIOS是用C ++编写的”,我不一定会那样做,这也许是真的,但是我从事该行业,当然很多引导加载程序都是用纯C编写的。很多东西通常是“老兵”,并且往往不完全信任C ++。
山姆

6
@TomDworzanski:虽然从技术上讲不是BIOS(专门指的是1981年的旧PC东西),但是IEEE-1275开放固件的许多实现(其作用与PowerPC通用硬件参考平台Sparc上的BIOS相似)(例如PowerMac,PowerBook,售价100美元的笔记本电脑OLPC X0-1)部分用不同于Assembly / C的语言编写。的OpenBoot开放固件的OpenBIOS都含有...
约尔格W¯¯米塔格

11

虽然理论上可以用任何一种语言编写BIOS,但现代现实是大多数BIOS是使用Assembly,C或两者的结合编写的

BIOS必须以可以编译为机器代码的语言编写,物理硬件机器可以理解。这消除了适合编写BIOS的直接或中间解释的语言(Perl,Python,PHP,Ruby,Java,C#,JavaScript等)。(尽管从理论上讲,一种可以实现这些语言中的一种,以直接编译为静态机器代码,或者可以某种方式将解释器嵌入BIOS中。例如,有一个Java 的废弃GCJ项目。)

大多数OEM通过扩展American MegatrendsPhoenix Techologies等公司的专有通用BIOS实现来实现BIOS 。(您以前可能已经在计算机的第一个启动屏幕上看到过这些公司中的一个。)这些实现的源代码不是公开可用的,但是其中一些已经泄漏。我不想直接将其链接到C和汇编源代码,但是Internet上有很多地方可以讨论此源代码,以供那些希望窥视的人参考。

一些硬件制造商,例如那些针对高性能和游戏市场的制造商,其BIOS实现以定制功能,统计数据和为其确切实现而设计的有吸引力的用户界面饱和。其中许多功能超出了American Megatrends和其他公司生产的通用产品所提供的功能。不幸的是,这些公司经常将其源代码的发布视为安全隐患,因此对这些高端实现知之甚少,因为对其的了解很少。当然可以找到访问和反编译此类BIOS实现的方法,但是这样做可能很困难,甚至可能是非法的。

回到最初的问题,由于需要产生本机代码,因此必须以本机代码编译器支持的编程语言来实现BIOS 。尽管有许多种这样的语言,并且我确定在过去的几十年中,已经在实验中使用了几种语言,但我能够找到的每种开放BIOS实现都特别依赖于C和/或汇编的结合。我研究过的开源BIOS实现包括OpenBIOStinyBIOScorebootIntel BIOSLibreboot。。我还研究了一些非常旧的BIOS实现,这些实现今天不相关,但也遵循C和/或汇编规则。

我认为查看其他直接与硬件交互的软件也很重要。例如,我们知道Linux内核OS X内核Windows内核在很大程度上是C语言,具有用于某些特定任务的某些汇编语言和一些高级语言。我们也知道,在Linux硬件驱动程序,并在Windows硬件驱动程序在很大程度上C.写

回到BIOS,我认为考虑所选编程语言的经济性也很重要。通常写BIOS是补充硬件销售的必要条件。众所周知,现代BIOS系统很大程度上是用C和/或汇编语言编写的。转向其他工具会给通常被认为是商品的产品增加可观的成本,这可能对销售产生非常不利的影响。在不涉足经济学101的情况下,我可以向您保证,偏离OEM已经偏离数十年来久经考验的可靠工具,这可能不值得。

当然也有并且还将有爱好者项目来编写BIOS。到目前为止,这些似乎也选择了C和/或汇编。也许有一天将使用其他技术。但是,今天,选择已经很明确了。


4
这有点挑剔,但没有解释C#和Java。它们编译为字节码。然后是解释器处理的字节码。不会改变第一段的逻辑。
托尼2015年

1
@Tonny是的。我添加了“直接或中间解释”,以便更加清楚。

@Tonny通常是一个抖动而不是一个解释器,这是一个重要的区别,因为只要不使用某些动态技术,就可以将其全部预编成本地的。因此,理论上可以用.NET语言或Java编写BIOS,前提是同时做到了这两种并确保所需的所有运行时支持均可用。我认为,这样做的努力将远远超过所发现的任何便利。
乔恩·汉娜

1
@Tonny实际上C#编译为本地代码msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx,因此在弱/动态语言列表中看到它很奇怪。

@Den C#通常不会编译为本机代码。您链接到的此.Net Native产品尚未正式发布。根据我的阅读,它将把应用程序代码和所需的框架代码编译成可执行文件。根据常见问题解答,此方法最初将针对Windows Store应用程序,因此可能需要一段时间才能得到更广泛的支持。综上所述,如果一切顺利的话,微软似乎会在将来的某个时候脱离虚拟机模型。

4

计算机的实际BIOS将以某种语言(可能是C或汇编语言)编写,然后编译为与体系结构相关的二进制代码。该代码不能在任何其他体系结构上运行(并且可以说,它实际上并不需要,因为它已经非常特定于所交付的机器)。

但是,您是否可能在考虑Option ROM(有时称为BIOS,如GPU Option ROM的“视频BIOS”中所述)?

对于实际的,与旧版BIOS兼容的选件ROM,它们可能是ISA依赖的可执行代码(同样由可以编译为目标架构的任何语言生成);PCI还允许包含用于多个ISA的代码,并允许主机在引导过程中选择适当的二进制映像。

对于与UEFI兼容的选件ROM,还有一种与体系结构无关的字节代码格式,可以在不同的体系结构上运行,但是仍然可以使用与ISA相关的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.