我的问题很简单,但我无法找到答案。
如何在BIOS内存芯片上写字?
好吧,要将数据写入x86上的IO设备(或实际上是什么),该过程似乎总是通过端口映射或内存映射IO访问IO设备。对我来说,现代BIOS闪存芯片是IO设备,如果它是可写的,它必须通过这个过程。 Coreboot是PC BIOS的开源替代品,但是,我相信它使用flashrom实际用其代码重写BIOS芯片,而flashrom是专有的,所以我想知道为什么编写BIOS是如此困难我无法做到找到关于如何实际做到这一点的可靠答案。
答案 0 :(得分:4)
在x86市场中有两种设备:具有标准接口的设备和没有设备的设备。你的案件属于第二类。
要写入闪存ROM,您只需将特定命令发送到特定地址即可 假设您有1KB的ROM芯片,它响应从000h到0fffh的读取请求。但是你可以发送写请求,但芯片甚至不会考虑它们。你不能像读它那样容易地写入F-ROM 您必须通过写入55h来发送写入命令来寻址AAh,然后发送要重新刷新的页面,然后写入数据。这是一个专有的界面(有标准化的努力),我简化了它,省略了理论上不相关的部分。
所以你只需要将写命令发送到ROM芯片 问题是ROM芯片不在CPU的旁边,它超出了所谓的桥梁,通常更多的是桥梁 在x86架构中,芯片组是芯片组,它是设备之间的集线器路由请求(最近已经进行了分散,但是像ROM这样的设备仍然只连接到称为南桥的芯片)。 您,CPU程序员,通过内存和IO地址空间中的请求与芯片组进行通信。
默认情况下,芯片组不会让写入到达闪存,您必须通过设置/清除芯片组寄存器中的某些位(存储器映射或PCI(e)寄存器空间)来启用它。这是一个专有界面。
如果你很幸运并且你的芯片组已经记录得足够好(比如英特尔的芯片组),让你知道如何允许写入到ROM,你必须弄清楚这些请求是如何路由的。
网桥并不总是透明的,它们执行地址转换,例如,您可以写入8123h,并且网桥可能会将地址更改为0123h。
对于闪存ROM前面的桥接器来说肯定会发生这种情况(这是一个带有SIO芯片的LPC桥,现在它是SPI桥接器)因为ROM只是一个普通的芯片,它在0h-xxxxxxxxxh范围内响应,而从CPU透视它映射在4GB的顶端。所以你还要弄清楚ROM的基地址是什么,这又是芯片组特定的,也是特定于ROM的,因为它取决于ROM大小(芯片组允许你从固定数量的不同基地址中选择)。
刷新BIOS并不难,我已经把它做得很有趣,它只是非常不便携,以至于每个计算机型号可能都需要一个不同的程序来完成它。它也需要你的芯片组数据表,这并不像你想象的那么常见。
如果您想获得更实用的想法,可以在此处下载英特尔X99 PCH数据表(http://www.intel.com/content/www/us/en/chipsets/x99-chipset-pch-datasheet.html)并查看SPI章节。