可以运行无内存的x86类处理器吗?


9

现代x86处理器至少具有512K的二级缓存。有些应用程序完全适合这种内存量。您可以在不连接RAM的情况下运行这些芯片吗?如果是这样,有没有一种方法可以消除CPU尝试保持RAM一致性时的回写时序损失?

我没有特定的应用程序,只是出于好奇。我敢肯定,在某个地方会有一个利基应用程序,尽管这样做会很有用。

Answers:


12

是的你可以。通过伪造来自连续(不存在)物理内存位置的读取,可以在缓存中设置标签。然后,您关闭缓存行的进一步填充并输入回写,从而将对缓存的读/写限制在其范围内,它将充当普通的RAM。

一些bios-replacement项目这样做是因为您可以在芯片组和芯片组内存控制器设置上花费更多的代码,例如,您可以用C编写代码。

这种做法广泛用于嵌入式类CPU以及处理引导程序。将高速缓存转换为类似RAM的模式的方法略有不同。

对于简短的低级介绍,您可以查看此演示文稿。

请注意,正如其他人指出的那样,您仍然仍然显然需要从某个地方加载启动代码。


实际上,我认为几乎所有现代BIOS都使用此功能,因此几乎所有现代x86 CPU都对此提供官方支持。
于洪宝

7

当CPU退出复位状态时,缓存将关闭。BIOS是最初配置和清除缓存的工具。因此,不能,它不能运行在没有RAM的情况下,因为首先就没有RAM来启动它。


1
ROM中的前几条指令不能在不使用RAM的情况下初始化并打开缓存吗?
Mark Ransom

1
@Mark Ransom现代英特尔处理器(和许多其他CPU)使用串行闪存存储BIOS。但是它不能从串行闪存执行代码。而是由CPU将此串行闪存复制到RAM,然后执行它。

嗯,我的无知正在显示-您可以看到自从我完成硬件设计以来已有多少年了。因此,CPU在执行第一条指令之前会自动复制闪存吗?那将是一个令人讨厌的鸡/蛋问题。
Mark Ransom

@David严格地说,它不是“串行”闪存,而是“固件集线器”。这不同于“串行”,因为它在一个时间传送4位而不是1
Majenko

1
@Mark Ransom有许多将通过串行链接(串行闪存,RS-232,SPI等)引导的CPU / MCU / DSP。他们都通过在CPU引导时在其内部装有一个小ROM来实现此目的,并且该代码将从任何位置加载“真实”代码。理论上,通过让英特尔修改此代码以使用缓存而不是外部RAM,可以运行RAM-Less系统。但是我怀疑英特尔会这样做。

3

我不知道这有多准确,但是我的想法是:

我认为您无法通过任何方式对缓存进行编程访问。您无法保证从一条指令到下一条指令在缓存中的内容以及它的位置,因此即使您可以直接访问它,也无法可靠地将其用作RAM。

您可以在没有RAM的情况下运行x86,但是您将无法使它发挥非常大的作用。您将只能使用内部寄存器进行数据存储。


2
高速缓存行填充和刷新协议已得到全面记录,并且可在包括x86在内的大多数CPU中进行配置。Cacheline内容不会在指令之间以随机方式刷新。请参阅我的回答,以了解如何通常将其设置为线性RAM。
比约恩·韦森

我已经为80x86克隆编写了一个十六进制加载器实用程序,它将在没有任何RAM的情况下正常工作。IIRC,我实现了一个使用SP来保存返回地址的一级调用堆栈。由于ROM与RAM处于同一总线上,因此在RAM不工作时不会出现使ROM工作的问题是不可能的,但是在这种情况下,加载程序可以诊断出问题。在其他一些具有外部代码总线但内部代码空间很少的微型计算机上,能够在总线损坏的系统上运行代码是一种有用的诊断工具。
supercat

@我可能会误会,但RAM是否不是二进制代码以及处理器的读写操作?
维克多·梅塔
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.