编写自己的BIOS

54

我不是疯了,只是在重复造轮子 :D
我写了引导程序、鼠标和键盘迷你驱动程序、小型操作系统等等。

我一直试图避免DOS中断,只使用BIOS中断,试图进一步发展统一的小型操作系统,但突然间我决定编写自己的BIOS :)

传说如此:
我曾经是高级程序员,然后成为低级程序员。总有一天我会成为机器语言程序员!

BIOS是用汇编语言编写的吗?我该如何刷写它?机制是什么?我能开始编辑我的当前BIOS吗?


15
希望对您有所帮助:http://www.coreboot.org/Welcome_to_coreboot - sarnold
1
投票关闭,原因是过于宽泛。 - Ciro Santilli OurBigBook.com
1
@bluejayke 我实际上已经改变了我的关闭哲学问题的投票。现在我只会投票关闭那些看起来是完全重复的问题,其他问题不应该被关闭。 - Ciro Santilli OurBigBook.com
5个回答

35
一个BIOS可以用汇编语言编写,但不一定必须使用汇编语言,因为一些部分需要使用汇编语言来获取系统调用的参数,因为它们与编译器的调用约定不匹配。
如何刷新它?不同的主板有不同的机制,我建议从开源虚拟机开始,并为其编写BIOS。或者创建一个虚拟机,在其中编写BIOS。机制因供应商而异,通常您会启动DOS(DOS并未死亡,在PC世界中,尤其是主板开发和嵌入式系统中,它仍然非常活跃)。如果你不知道所有这些问题的答案,就不要轻易去折腾实体主板,否则你会毁掉很多主板。
您可以尝试升级主板的BIOS并进行逆向工程(尽管可能会有点击协议表明您不会这样做)。如果您弄清楚了,您可以同时加载它并对其进行修改。我不会去那里,你在找到答案之前就会毁了你的系统。
编写BIOS真正是您想要的吗?相当老派,就像为了好玩而编写6502代码一样。有许多更有用和有趣的低级问题。
如果您能编写汇编语言,那么编写机器码并不难,您可以只是出于好玩而这样做。x86真是太糟糕了,你应该花些时间学习其他系统及其汇编语言和机器码(并为它们编写操作系统)。ARM主导着世界,不依赖BIOS。我被告知,在非x86系统上启动视频卡仍然需要在x86 BIOS上调整一些东西,但可以找到不需要运行x86 BIOS即可启动主流视频卡的方法。观看模拟器运行BIOS并查看其操作,找出替换没有BIOS执行的开机初始化的方法……编写指令集模拟器或反汇编器是编写机器码的下一步,尽管我不会浪费一点时间在x86上,但我可以提供替代选择的列表(或者您可以使用我编写或收集的模拟器进行实验)。

如果你想使用x86 BIOS,最好的方法是编写、替换或修改虚拟机(如qemu、virtualbox或其他)的BIOS。将其替换为你的BIOS可能是在某个目录中替换文件或使用命令行选项指定备用BIOS。一旦你在这方面有很好的经验,如果仍然有一些带有传统BIOS的主板,也许你可以试着破解编程(需要购买每种类型的主板若干,因为你肯定会把其中一些变成砖头)。由于有很多嵌入式系统可以以20到200美元的价格获得,并且可以获得相同水平的经验,所以在没有良好的原理图和文档的情况下,对PC主板进行修改并不是一个明智的选择。你可以找到一台具备原理图和BIOS清单记录的原始PC,而且BIOS是可插拔的,如果你的BIOS无法启动(并且没有损坏主板),它就不是个砖头,你可以重新编程或更换BIOS芯片。建议使用微控制器作为虚假BIOS,因为找到正确的硬件来重新编程更多BIOS芯片可能比找到工作的原始PC更难……有一个Amiga社区,他们可能更喜欢你改进/调整他们的BIOS,比如在传统系统调用后面放置现代硬件。


12
一些主板配备了第二个 BIOS 芯片,可用于在更新期间主 BIOS 被破坏时进行恢复。也许这个功能可以帮助避免过多主板被变砖的情况发生 :) - Stefan Paul Noack
@old_timer 先生,我想编写一份BIOS,以便了解计算机的工作原理,因为我没有正式的计算机背景(但我是使用Java编写软件的软件开发人员)。请告诉我如何理解微处理器、BIOS、RAM、操作系统等最终运行我的代码,以完成一些有价值的事情;我应该从哪个环节开始学习;去哪里学习。我会热切地等待您的回复。 - nawazish-stackoverflow
2
x86不是我开始的地方,也绝对不会尝试引导机器,这最多只会是一场噩梦。仅仅因为你有一个x86是最糟糕的理由。从一些5美元或10美元的微控制器开始,学习基础知识,例如GPIO和定时器,并熟悉裸机编程(大多数情况下只需要使用C语言,很少需要汇编语言)。然后可能是树莓派、MIPS或PowerPC,如果你仍然感觉需要,再尝试x86。你会发现几乎没有关于替换BIOS所需信息,即使有几十年的经验,也可能会烧毁几个主板。 - old_timer

4

BIOS可以使用任何你喜欢的编程语言编写,但是低级别的语言可以给你更多的控制。汇编和机器码基本相同,不同之处在于微码接口和你输入的内容,例如,对于机器码,只需输入2个字符,而汇编则提供字母数字。当我需要计算机每隔几小时启动一次却找不到任何可实现该功能的BIOS时,我开始寻找自定义BIOS。

要刷新BIOS,请按照制造商的指南操作。BIOS现已被UEFI(用于增加安全性)取代。 详情请参见:https://www.pcworld.com/article/187437/how-to-update-your-bios.html

x86和amd64指令参考:https://www.felixcloutier.com/x86/
带扩展的x86指令:https://en.wikipedia.org/wiki/X86_instruction_listings
i386指令参考:https://css.csail.mit.edu/6.858/2014/readings/i386.pdf
x86汇编指南:https://www.cs.virginia.edu/~evans/cs216/guides/x86.html
英特尔指令集参考:https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm-vol-2abcd.pdf


3
如果你想为IBM PC兼容计算机编写BIOS(这是大多数桌面PC的标准,尽管CPU指令集有更多扩展和一些不同的总线接口),那么我建议你查阅IBM PCIBM PC XTIBM PC AT技术参考手册。特别是IBM PC AT手册,因为它是事实上的标准。
这些手册包含IBM计算机使用的完整BIOS程序清单,采用汇编语言编写。您可能需要在这些手册中搜索一下(尤其是IBM PC AT手册),以找到它们,因为有些并没有直接列在目录中,但它们确实存在。希望这些BIOS能够帮助您入门。

1

FWIW Modbin是一个DOS程序,正如其名称所示,它修改BIN映像,特别是为了对现有BIOS代码进行简单和相当极端的更改。

如果您可以获得旧的主板(许多仍在工作中被扔掉),我会鼓励您玩弄BIOS。 如果有兴趣的话,这很有启发性和有趣,而您似乎是:) 曾经有一段时间,我从具有相同或类似芯片组但由不同制造商制造的主板上下载BIOS映像...有时候会带来相当大的好处,包括继续获得BIOS更新,即使原始主板制造商放弃或破产了,但也包括功能和性能导向的选项和更改。

这导致了“HOT Flashing”,即将插座式BIOS芯片拉起,以便引脚刚好接触,并一旦启动,就将其拉起并替换为坏的芯片(通常是我自己搞砸的芯片),同时仍在运行和闪存它,利用缓存的BIOS功能保持系统活动。 对于我们这些极客来说,这是有趣的事情,并给了我编写OS / 2设备驱动程序的信心。


1

除了让电脑运行之外,还有其他的方法来刷新bios,但这需要一些硬件。不过成本应该不会很高。

你可以尝试类似于这种技术:http://hackaday.com/2010/11/18/build-your-own-soic-progamming-clip/

我今天看到的这个讲座:https://conference.hitb.org/hitbsecconf2015ams/sessions/how-many-million-bioses-would-you-like-to-infect/

它解释得更加详细,虽然你可能不是在寻找感染问题,但其中覆盖了一些获取bios的技术,编程剪辑就是其中之一。


2
请添加您的链接细节,以使此答案更好。 - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接