x86上的BIOS重写

x86上的BIOS重写,x86,bios,X86,Bios,我的问题很简单,但我找不到答案 如何在BIOS内存芯片上写入 好的,要将数据写入x86上的IO设备(实际上是其他任何设备),进程似乎总是通过端口映射或内存映射IO访问IO设备。对我来说,现代BIOS闪存芯片是IO设备,如果它是可写的,那么它必须通过这个过程。 Coreboot是PC BIOS的开源替代品,但我相信它使用flashrom用其代码重写BIOS芯片,flashrom是专有的,因此,我想知道为什么编写BIOS如此困难,以至于我找不到关于如何实际操作的可靠答案。在x86市场上有两种设备:有

我的问题很简单,但我找不到答案

如何在BIOS内存芯片上写入

好的,要将数据写入x86上的IO设备(实际上是其他任何设备),进程似乎总是通过端口映射或内存映射IO访问IO设备。对我来说,现代BIOS闪存芯片是IO设备,如果它是可写的,那么它必须通过这个过程。
Coreboot是PC BIOS的开源替代品,但我相信它使用flashrom用其代码重写BIOS芯片,flashrom是专有的,因此,我想知道为什么编写BIOS如此困难,以至于我找不到关于如何实际操作的可靠答案。

在x86市场上有两种设备:有标准接口的设备和没有标准接口的设备。你的案子属于第二类

要写入闪存ROM,只需向特定地址发送特定命令。
假设您有1KB的ROM芯片,它响应从000h到0fffh的读取请求。然而,你可以发送写请求,但是芯片甚至不会考虑它们。写入F-ROM不能像读取F-ROM那样容易。
您必须发送一个write命令,将55h写入地址AAh,然后发送要刷新的页面,然后再写入数据。这是一个专有接口(正在努力使其标准化),我简化了它,省略了理论上不相关的部分

因此,您只需向ROM芯片发送写入命令。
问题是ROM芯片不在CPU旁边,它超出了所谓的桥接器,通常更像是桥接器。
在x86体系结构中,芯片组是一个地狱般的芯片,它是设备之间的集线器路由请求(最近出现了一种分散的方式,但像ROM这样的设备仍然只连接到曾经被称为南桥的芯片)。 CPU程序员通过内存和IO地址空间中的请求与芯片组通信

默认情况下,芯片组不允许写入到达闪存rom,您必须通过设置/清除芯片组寄存器(内存映射或PCI(e)寄存器空间)中的一些位来启用它。这是一个专有接口

如果幸运的话,您的芯片组有足够的文档记录(如Intel的),让您知道如何允许写入到达ROM,那么您必须弄清楚这些请求是如何路由的。
网桥并不总是透明的,它们执行地址转换,例如,您可以写入8123h,网桥可以将地址更改为0123h。
闪存ROM前面的桥肯定会发生这种情况(这是一个带有SIO芯片的LPC桥,现在是SPI桥),因为ROM只是一个普通芯片,响应范围为0h-xxxxxxxx h,而从CPU的角度来看,它映射在4GB的顶端。因此,您还必须确定ROM的基址是什么,这也是特定于芯片组的,也是特定于ROM的,因为它取决于ROM的大小(芯片组允许您从固定数量的不同基址中进行选择)

刷新BIOS并不难,我这么做只是为了好玩,它的可移植性非常差,以至于每种计算机型号都可能需要不同的程序来完成。它也需要有你的芯片组数据表,这并不像你想象的那么普遍


如果您想获得更实用的想法,可以在此处下载英特尔X99 PCH数据表(),并查看SPI一章。

此程序?它是开源的。你可以清楚地看到它的作用。你能不能简化一下,告诉我实际情况?我对细节一无所知。但我认为你声称“flashrom是专有的”是不正确的,所以我搜索了它。这是一个开源程序。所以你想让别人为你编写一个重写BIOS的程序吗?我不知道你的真正意思。我只想知道cpu是如何将数据写入bios芯片的,仅此而已。我一直在等待这样的启示。非常感谢。如果你允许的话,我想联系你在Q&A EV之外的进一步帮助。我很乐意帮助你,但是考虑到你想做的事情是非常具体的硬件,你不能有一个方便的调试器,所以它需要大量的尝试和错误来解决错误,以及为什么事情不起作用。远程操作是不可能的,所以我只能给你一般的建议,你需要有足够的技能,能够独立工作。无论如何,手机上没有私人信息,所以,我如何向您提供我的联系人信息?是的,当然,这是我的:izemmouri91@gmail.com. 如果你想保密你的联系信息,你可以通过电子邮件给我。对不起,我实际上误读了你写的东西。我以为你写了‘我可以给你我的联系方式吗’,于是写了‘当然可以’。