每个操作系统都需要 RAM 吗?

Suv*_*yil 77 memory boot operating-systems ramdisk

有没有可以在没有 RAM 的情况下使用的操作系统,特别是那种我可以从中创建可启动的 Pendrive 并在计算机中使用它的操作系统?这变得很尴尬,因为启动本质上是在 RAM 中加载操作系统。

注意:我最初想了解一个无 RAM 的操作系统,以检查我的笔记本电脑(无法启动但显示空白屏幕)RAM 是否坏了,但我喜欢这个问题滚雪球的方式。

agt*_*ver 96

每个操作系统都需要 RAM 吗?
对于 IBM PC 兼容硬件,BIOS POST 过程的一个强制性步骤是检查是否有 RAM 可将 BIOS 加载到其中。(可选)POST 过程检查您的 RAM 是否正常工作。在 POST 过程之后,BIOS 将引导加载程序加载到 RAM 并将控制权交给引导加载程序。因此,您的问题(“每个操作系统都需要 RAM 吗?”)的答案是:是的,每个 IBM PC 兼容硬件都至少需要一些正常运行的 RAM 才能启动。对于在该硬件上运行的任何操作系统都是如此。

请注意,在 OP 的原始问题中,提到了“笔记​​本电脑”,我将其解释为:IBM PC 兼容硬件。对于这个答案的其余部分,我将假设 IBM PC 兼容硬件。

操作系统可以在 RAM 故障的情况下启动吗?
如果你的内存有问题(而不是完全不存在/断开),或者如果你可以(部分)取代你的RAM,您可能能够使用启动BadRAMBadMEM内核补丁。它要求您重新编译内核(听起来比第一次编译要容易),然后您可以重新启动并告诉内核您的坏内存在哪里。关于使用Memtest86 / Memtest86+ 的一个很好的解释,BadRAM/BadMEM 可以在这里找到。

操作系统可以在没有 RAM 的情况下启动并将 CPU 的缓存用作 RAM 吗?
据我所知,如果您的系统上没有任何 RAM(正如@philipp 和其他人所建议的那样),则无法在评论中使用您的 CPU 缓存作为 RAM。如果有,最好在这里添加它。我能找到的关于这个主题的唯一论文是这篇论文,它指出:“在 RAM 初始化之前,将处理器的缓存用作 RAM”。不确定它是否(以及如何)在没有RAM 的情况下工作。据我所知,没有可以在 IBM 兼容 PC 上启动操作系统的工作代码。欢迎在评论中引用任何对概念验证、工作代码或任何内容的引用,我会将其添加到此答案中。

我可以进入BIOS吗?
如果笔记本电脑能够通过 BIOS POST,OP 的问题有点含糊。正如@Tonny 指出的那样,没有任何操作系统可以帮助您“进入 BIOS ”。根据您的 BIOS 品牌,您可以使用F1F2F10DELESC键进入BIOS。

如何从没有RAM的笔记本电脑恢复数据?
至于你的问题背后的目标:为什么你需要访问你的笔记本电脑?可能是因为硬盘上还有要恢复的数据?如果是这种情况,拔出 HDD(参见手册)并将其连接到外部存储设备或直接连接到 PC 会容易得多。是一个很好的指南来做到这一点。

  • @VusP:要检查您的 RAM,请使用带有 Memtest86/Memtest86+ 的 livecd/-usb,跳过 BIOS 中的 RAM 测试并从 livecd/-usb 运行 memtest。 (5认同)
  • 谁说在启动时测试 RAM 是“*强制*”?当机器只有几 MB 或更少时,这是很常见的,但随着大小的增加和时间变得令人望而却步,很快就变得可选了。 (4认同)
  • 在实践中,* 可能* 运行一台 RAM 有缺陷的机器(例如,只有一个无法正常工作的银行)。如果 BIOS 没有注意到(或者,如果它注意到了,可能存在通常的 F1 覆盖),您仍然可以使用带有 BadMEM/BadRAM 补丁的 Linux 之类的操作系统,它会指示内核避免指定的内存块。 (3认同)
  • @agtoever:嗯?当 RAM 初始化时,缓存即 RAM 技巧不会突然停止工作。只是在那个时候避开 RAM 是愚蠢的,所以没有人试图这样做。但是这个技巧与未初始化 RAM 无关。这才是真正有用的时候。 (3认同)
  • @Hi-Angel,它不能直接从磁盘执行,因为 cpu 不能直接访问磁盘的内容。它必须向磁盘控制器发送命令,并等待它将数据块从磁盘传输到内存中的某个位置。只有从那里 cpu 才能直接执行指令。 (3认同)
  • @agtoever:CPU 绝对可以将缓存作为 RAM,但我不知道代码需要什么权限才能做到这一点(不确定 ring 0 是否足够)。 (2认同)

use*_*686 33

在理论上是可能,但它会非常慢,因为它需要将磁盘用于任何不适合 CPU 缓存的临时存储。(CPU 有几兆字节的缓存,因为即使是 RAM对它们来说也太慢了。想想看。)所以你需要一个相当小的操作系统。

(嗯,嵌入式片上系统可以从 RAM 或内部闪存执行代码——PC BIOS 理论上可以执行相同的操作,但它不能运行整个操作系统。)

但是,另一件事是,BIOS任何已安装的操作系统之前之外运行,而正是 BIOS 允许您从笔式驱动器或其他任何东西启动。因此,如果您无法访问 BIOS,那么世界上没有其他操作系统会帮助您。

  • 可能是 CPU 可以使用自己的缓存而不是 RAM。对于在内存测试之前运行的 BIOS 代码部分,它可能是一个有用的功能。但是让其他硬件在没有 RAM 的情况下工作可能会很棘手。您将无法进行 DMA,因此必须以不同的方式进行磁盘 I/O。如果找不到可用的 RAM,我想 BIOS 甚至不会尝试加载操作系统。不过,缓存的大小问题不大。按照现代标准,几 MB 可能不是很多,但是当时 1 MB RAM 很多的操作系统应该仍然可以在现代计算机上运行。 (6认同)
  • @kasperd [DEC Alpha](https://en.wikipedia.org/wiki/DEC_Alpha) 旨在从缓存运行其开机初始化的第一阶段,从“串行 ROM”预加载。这是因为在页表初始化之前,CPU 无法访问 RAM、常规 ROM 或任何其他内存映射资源(包括所有 I/O 设备,IIRC)。 (2认同)

小智 15

您可以通过一些努力来设计一个不包含 RAM 的系统。从 ROM(或存储)加载您的软件,并在寄存器或缓存中执行所有操作。这样一个系统的用途非常狭窄,考虑到今天的 RAM 价格有点毫无意义。如果没有一些板载内存,现成的笔记本电脑将无法运行。

您真正的问题更有可能是“我如何从无法启动的计算机中获取信息”,这很容易。拆卸它,卸下驱动器,然后将其连接到外部驱动器盒。

但是,请注意,任何足够旧的计算机都无法获得价值 20 美元的工作 RAM,因为它会配备 ATA(常规 ATA,而不是 SATA)驱动器。这个接口今天几乎绝迹了,所以你还需要找到一个带有 ATA 卡的驱动器盒以及一个全尺寸到笔记本电脑尺寸的适配器。我有一个我在 2000 年买的,为了这个目的,我保留了几个旧箱子。

  • @LorenPechtel 这不完全正确。堆栈可以(并且经常)存储在片上存储器中。 (2认同)
  • @LorenPechtel 没有必要。ARM 不使用堆栈来调用例程。 (2认同)

Ton*_*nny 10

如果我正确阅读了这个问题,这里的每个人都在咆哮错误的树。

他明确指出“为了进入 BIOS”。

如果笔记本电脑坏了,它甚至无法进入 BIOS,其他一切都毫无意义。

无论 RAM 情况如何,您都无法在其上启动任何操作系统。


小智 8

您认为内存不好的假设可能是无效的。如果您没有听到哔哔声或屏幕消息,则根本原因几乎可以肯定是 CPU 故障(不太可能)或主板故障(很有可能)。由于冷焊点,主板一直会随着老化而失效,这在 ROHS 运动的早期和使用无铅焊料的要求中很常见。制造技术已经针对使用铅基焊料进行了优化,该行业需要一段时间才能赶上并解决这些问题。许多组件制造商不太愿意花钱升级他们的工艺。毕竟,这些设备可以很好地进行测试和燃烧,但在几个月或几年后,在任何保修期可能到期后才会出现故障。只有随着越来越多的故障和来自用户的强烈负面反馈,制造商才开始改进。在这样的笔记本电脑上,让主板回流以纠正冷焊点几乎肯定成本过高。


h22*_*h22 5

大多数 1980 年代或左右的早期计算机在 ROM 芯片中都有某种操作系统(硬件驱动程序、IO 支持、程序加载、非常简单的命令行界面等)。即使 RAM 芯片无法运行,它也能在一定程度上发挥作用。此功能用于专为运行硬件测试而设计的特殊 ROM 内容版本,主要通过蜂鸣器和键盘灯进行通信。

CPU 有几个寄存器至少可以记住正在执行的命令的地址,但这些通常不称为 RAM。

常规 C 代码无法在没有 RAM 的系统中运行,因为它使用堆栈内存来分配变量,而堆栈位于 RAM 中。当最近的计算机启动时,常规动态 RAM 最初不可用,因为 RAM 刷新设备需要初始设置才能工作。汇编代码首先运行并执行主板初始化。RAM 开始工作,然后 C 代码可以运行。

  • 最后一段并不完全正确。堆栈不必位于片外 RAM 中。堆栈位于片上存储器中实际上是很常见的。即使在普通机器上,当前正在执行的线程的堆栈通常会在缓存中,只有在调度程序交换线程时才会被推送到 DRAM。不过,我已经为 DSP 编写了代码,其中堆栈驻留在可直接寻址的片上存储器中并且从未接触过 DRAM。当然,我想您可能会争辩说,在这种情况下,片上存储器在技术上是 RAM。 (4认同)
  • 此外,使用寄存器(而不是堆栈)将至少一些参数和返回值传递给 C 函数的情况并不少见。此外,局部变量通常也被 C 编译器存储在寄存器中而不是堆栈中。您甚至可以使用“register”关键字明确要求编译器将特定变量放入寄存器中。当然,一旦函数需要的局部变量多于您拥有的寄存器空间,您将需要使用内存,但这是一个硬件约束,无论编程语言如何。 (4认同)